(*) 표시가 있는 항목을 체크하면 해당 문제에 대한 근본적인 해결책이 되는 항목이므로 최선을 다해 해당 내용을 완성해 나가시기 바랍니다. (*) 표시가 없는 항목은 해당 항목이 안전 위험을 완전히 제거할 수는 없으며 이 방법을 통해서만 안전 문제를 피할 수 있음을 나타냅니다.
SQL 주입
(*) SQL 문 결합 시 SQL 변수 바인딩 기능을 사용하세요.
(*) 데이터베이스가 변수 바인딩을 제공하지 않는 경우 SQL을 구성하는 모든 변수를 이스케이프하고 브라우저에 오류 메시지를 그대로 표시하지 않아야 합니다.
데이터베이스에 액세스하는 사용자에게 적절한 권한을 설정합니다.
운영 체제 명령줄 삽입
(*) 쉘 명령을 시작할 수 있는 언어를 사용하지 마십시오. 쉘 명령을 시작할 수 있는 경우 함수의 매개변수에 있는 모든 변수를 확인하여 적법한 연산만 포함되는지 확인하고 경로명 매개변수는 확인하지 마십시오/ 디렉토리 순회.
(*) 외부에서 직접 전달받은 매개변수를 파일명으로 사용하지 마세요.
(*) 파일 열기 작업을 고정 디렉터리로 제한하고 파일 이름에 경로가 포함되지 않도록 합니다. 웹 서버의 파일에 대한 올바른 액세스 권한을 설정하세요. 파일 이름 세션 관리 문제를 확인하세요.
(*) 추측하기 어려운 콘텐츠를 세션 ID로 사용
(*) 세션 ID를 URL에 저장하지 마세요.
(*) https 프로토콜에 사용되는 쿠키에 대한 보안 속성을 설정합니다.
(*) 로그인 성공 후 새 세션 생성
(*) 로그인 성공 후 세션 ID 외에 비밀 정보를 생성하고, 페이지 방문 시마다 확인하세요. 세션 ID로 고정된 값을 사용하지 마세요.
세션ID를 쿠키에 저장할 때 만료일을 설정하는 XSS(Cross-Site Scripting Attack)
HTML 콘텐츠 입력이 허용되지 않는 경우 해결 방법
(*) 페이지에 출력되는 모든 내용은 이스케이프되어야 합니다.
(*) URL 출력 시 "http://" 또는 "https://"로 시작하는 URL만 허용됩니다.
(*) <script>…</script> 콘텐츠를 동적으로 생성하지 마세요.
(*) HTML 콘텐츠 입력이 허용된 경우 외부 웹사이트에서 스타일시트를 읽지 마세요.
(*) 입력 HTML 콘텐츠를 구문 분석하고 구문 분석 트리를 생성한 다음 스크립트를 사용하여 입력 HTML 콘텐츠에서 관련 문자열을 삭제합니다.
(*) 응답의 HTTP 헤더에 Content-Type의 charset 속성을 다시 지정해야 합니다. 쿠키 정보 유출을 방지하려면 Trace 메서드를 비활성화하고 모든 쿠키에 대해 HttpOnly 속성을 설정해야 합니다. (CSRF)
(*) 모든 페이지는 POST를 통해 접속됩니다. 이전 페이지의 숨겨진 부분에 정보가 무작위로 생성됩니다. 제출 후 페이지는 정보를 확인하고 올바른 경우에만 실행합니다.
(*) 업무를 수행하기 전에 비밀번호를 다시 요구합니다
(*) 추천인이 올바른지 확인하고, 올바른 경우에만 중요한 작업을 수행하고 미리 설정된 이메일 주소로 이메일을 보냅니다.
HTTP 헤더 삽입
(*) HTTP 헤더를 직접 출력하지 않고, 실행 환경에서 제공하는 헤더 정보 출력 API를 사용합니다.
(*) API를 사용할 수 없는 경우 입력 헤더 정보에 줄 바꿈을 금지해야 하며, 모든 외부 입력에 줄 바꿈을 삭제해야 합니다. 이메일 도용(공격자가 지정한 주소로 이메일을 보내는 방법)
(*) 이메일 헤더 정보로 외부 매개변수를 사용하지 마십시오. 헤더 정보를 설정하기 위해 외부 매개변수를 사용해야 하는 경우 위험 문자를 삭제하십시오.
저작권 표시: 마음대로 재인쇄할 수 있지만, 재인쇄 시에는 원작자 Charlee를 반드시 인용해야 합니다.
원본 링크: http://tech.idv2.com/2008/04/19/secure-website-checklist/
특정 애플리케이션 전략 참조: PHP 연습 보안 체크리스트