KWONKYU

PHP 시큐어 코딩 #1

May 13th, 2019
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.95 KB | None | 0 0
  1. #1. PHP 에러 숨기기.
  2. display_errors : OFF.
  3. log_errors: ON. >> error_log에 로그를 기록할 위치를 지정할 수 있음.
  4. error_reporting: E_ALL.
  5.  
  6. 하지만 php.ini를 수정할 수 없는 경우라면 ini_set('error_reporting', E_ALL | E_STRICT) 처럼 함수를 이용해서 설정할 수 있음.
  7.  
  8. set_error_handler('my_error_handler') 를 통해서 직접 오류를 처리할 수도 있음. my_error_handler($number, $string, $file, $line, $context) 로 선언 후 본문 정의.
  9.  
  10. #2.'Defense in Depth', 심층 방어. 하나가 실패하더라도 다른걸로 커버할 수 있어야 함.
  11.  
  12. #3. 최소 권한. 왜 이런 권한을 가져서는 안되는가? 보다는 왜 이런 권한을 줘야 하는가 라는 관점을 취하고 권한을 최소한으로 제공할 것.
  13. 모든 공격자가 어떻게 공격할 지 예측하는 것은 불가능하므로 처음부터 위협을 최소화 하는 데 노력하는 것이다.
  14.  
  15. #4. 인터넷 상 노출은 최소화 할 것. 데이터베이스나 http 클라이언트(브라우저)와의 통신 데이터가 노출되지 않도록 주의하라.(원격 행위)
  16. 보안 수칙을 지키면서도 사용성을 떨어뜨리진 말 것. 의심스러운 행위 또는 신원을 물을 때마다 비밀번호를 묻는 것은 좋지만 의심스럽다고 타이르거나 로그아웃시키는 것은 사용성을 감소시킨다.
  17.  
  18. #5. 데이터의 흐름을 파악하라. 어디서 온 데이터인지 어디로 가는 데이터인지... 그래서 $_GET 같은 '슈퍼 전역배열'은 입력 및 출처가 명확하므로 권장됨.
  19.  
  20. #6. 입력을 필터링하는 것 또한 중요하다. 데이터의 유효성을 증명하여 신뢰할 수 있는 데이터를 사용하거나 오염된 데이터를 제거할 수 있음.
  21. 입력을 구분하고, 입력을 필터링하고, 필터링된 데이터와 오염된 데이터를 구별하는 단계를 거쳐야 한다. 예를 들어 디렉터리 트리에서 상위 디렉터리로 이동하려는 파일 트래버스(traverse)를 예방하기 위해 str_replace('..', '.', $_POST['filename']) 처럼 사용할 수도 있다. 여기에 strpos($filename, '..')이 false가 아닐 때까지 계속 수행함으로써 완전히 지워버리는 것도 가능하고. 그냥 basename() 쓰라는데?
  22.  
  23. 화이트리스트를 사용하는 것 또한 방법이다. 유효하다고 증명되지 않은 것은 모두 유효하지 않은 것으로 간주하는 방법을 말하는데 바람직하진 않지만 반대의 경우보단 바람직할 것이다.
  24.  
  25. 오염된 데이터를 어떻게 거르느냐? 그건 추가적인 배열(clean이라고 명명)을 사용하는 방법을 생각할 수 있다. HTML form에서 select 옵션에 주어진 여러 value가 있을 때, 클라이언트는 단지 이 value들만 전송가능한 게 아니라 $_POST['color']를 통해 어느 형태의 데이터도 전달할 수 있기 때문에 이를 받는 쪽에서는 switch문을 사용하여 거르는 방법을 생각할 수 있다.
  26.  
  27. switch($_POST['color']){
  28. case 'red':
  29. case 'blue':
  30. case 'yellow':
  31. $clean['color'] = $_POST['color']; << switch문에 걸렸으므로 폼에서 정상적으로 받아진 데이터다. 그러므로 clean 배열에 추가함.
  32. break;
  33. }
  34. 이때 clean배열에 추가된 값들은 유효하다고 확신할 수 있기 때문에 다른 곳에서도 안정적으로 사용할 수 있게 된다.
  35.  
  36. 사용자 이름을 받을 때 숫자/영문만 받는다고 제한할 경우 정규 표현식등을 사용하는것 보다는 ctype_alnum 같은 내장 함수를 사용하자. 이 편이 훨씬 안전하며 직접 작성한 로직의 오류는 취약점으로 이어지기 때문에..
  37.  
  38. #7.클라이언트에 보내는 출력은 다음과 같은 문자열을 가진다
  39. echo, print, printf, <?=
  40. 이때 특수문자의 원래 모습을 보존하기 위해 이스케이핑한다면 htmlentities() 함수나 데이터베이스의 mysql_real_escape_string() 함수를 사용하도록 하자.
Add Comment
Please, Sign In to add comment