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