- 크로스 사이트 스크립팅 ( XSS, cross-site scripting )
- 크로스 사이트 리퀘스트 위조 ( CSRF, cross-site request forgeries )
- 스푸프 ( spoof )
# 코드 안에 직접 작성한 데이터는 신뢰할 수 있는 데이터라고 간주한다.
# 원격소스에서 가져오는 모든 것을 입력이라고 하며, 모든 입력(검증된 것이라고 보장할 수 없는 모든 데이터)은 오염된 것으로 봐야하므로 반드시 필터링을 한 후에 데이터를 이용해야 한다.
# 사용자가 응용프로그램에 데이터를 전달하는 방법
- URL ( GET 데이터 )
- 요청의 컨텐츠 ( POST 데이터 )
- HTTP 헤더 ( 쿠키 )
# PHP 파일 업로드, 이론상의 위험
사용자의 코드에서 업로드된 파일을 검증하지 않고 tmp_name(업로드된 원본 파일의 임시보관 파일)을 사용한다면 공격자가 tmp_name을 수정하게 하는 익스플로잇을 사용할 수 있다.
해결책 : is_uploaded_file(), move_uploaded_file() 함수의 사용
- is_uploaded_file() : tmp_name이 참조하는 파일이 업로드된 파일인지 검사
- move_uploaded_fie() : 업로드된 임시파일(tmp_name)을 저장할 위치로 옮긴다. 이 함수는 오직 업로드된 파일에 대해서만 적용가능하다.
# 보안에 있어서 가장 좋은 지침은 적게 믿는 것이다.
# $_REQUEST에 대하여
$_REQUEST는 GPC(Get,Post,Cookie)에 모두 적용가능한 슈퍼글로벌 변수이므로 POST데이터로 예상했던 변수에 GET데이터를 삽입할 수도 있다. CSRF(크로스 사이트 리퀘스트 위조) 공격이 이런 식으로 이뤄지기 때문에 $_REQUEST를 사용하는 것은 권장되지 않는다.
해결책 : 처리를 수행하는 HTML 폼에서는 GET대신에 POST를 사용하고(RFC2616 9.1.1), 폼 로직 처리에서는 $_REQUEST대신 $_POST를 사용한다.
사용자의 편의성은 위험을 증가시킨다. 사용자 편의성과 위험 사이의 적절한 균형을 찾는 것이 필요하다.
# HTTP 헤더의 신뢰성에 대하여
이전 페이지의 정보를 가지고 있는 레퍼러(Referer)의 비교를 통해 폼에서 넘어온 데이터가 믿을 수 있는 것이라고 단정지어서는 안된다. 헤더 정보는 조작이 가능하다.
입력 필터링의 중요성과 HTTP 요청에서 제공되는 어떤 것도 신뢰의 대상이 될 수 없다는 사실을 기억하라.




1