2009-11-29 5 views

답변

19

파일 확장자와 MIME 유형 모두 이미지 파일을 다루는 보안 성을 100 % 제공하지 못합니다. 하지만 파일을 실행하지 않는 한 (예 : include() 사용) 문제가되지 않으므로 PHP 코드 또는 다른 것을 확인할 필요가 없습니다. 위조 된 이미지 파일을 사용하여 상상할 수있는 유일한 보안 침해는 브라우저의 렌더링 엔진 을 악용하는 것일 수 있습니다. 이것은 서버 측으로부터 효과적으로 보호 할 수 없으며 브라우저 공급 업체의 책임입니다.

따라서 업로드를 처리 할 때 is_uploaded_file()move_uploaded_file()을 사용해야하는 경우 최소한 이미지 형식 앞에 있어야합니다. 아래의 @ bobince의 게시물을 읽고 링크를 따라 가면 파일을 다룰 때 다른 보안 측면에 대한 많은 정보를 얻을 수 있습니다.

그러나 최대 보안을 제공하는 것은 물론 GD의 imagecopy을 사용하여 이미지를 새 이미지 컨테이너로 복사 할 수도 있습니다. 이렇게하면 파일에 포함 된 ID3 및 기타 헤더 정보가 지워지고 악용 시도가 파기됩니다 (GD는 이러한 파일을 숨기고 오류를 반환합니다). 물론 GIF, JPEG 및 PNG에서만 작동하며 알파 채널 및 색상 프로필 문제와 같은 문제가 발생할 수 있습니다.

+0

+1 이미지를 복사하는 경우. –

16
  1. 절대 사용자가 제출 한 파일 이름을 사용하지 마십시오. «난수».jpeg와 같은 새로운 것들을 만들어라. '살균'파일 이름은 생각보다 어렵습니다. 특히 앱이 Windows 서버에서 실행될 수 있어야하는 경우 더욱 그렇습니다.

  2. 이미지의 경우 매우 신뢰할 수없는 파일 이름 및 MIME 형식 제출을 보지 말고 이미지의 파일 유형을 결정하려면 PHP getimagesize 함수를 사용하십시오. 이미지로 구문 분석하지 않는 업로드를 허용하지 않습니다.

  3. 다운로드 할 파일의 경우 Content-Disposition: attachment 헤더를 사용하여 HTML 콘텐츠에 대한 IE 스니핑을 중지하고 브라우저에 표시합니다.

  4. 인라인으로 표시해야하는 파일의 경우 기본 호스트와 다른 호스트 이름에서 파일을 제공해야합니다. 그렇지 않으면 HTML 내용이 보안 컨텍스트에 사이트 간 스크립트로 표시 될 수 있습니다. 안전한 파일 업로드 기능을 만들기

하드입니다. More discussion.

+0

3에 대해 몰랐습니다. 훌륭한 팁과 훌륭한 링크. –

관련 문제