2010-06-16 4 views
1

허용되는 업로드 된 파일 형식을 이미지, pdfs 및 문서로 제한하려고합니다. 이것을 접근하기위한 권장 방법은 무엇입니까?업로드에 허용 된 파일 형식 제한 asp.net

공격자가 원하는대로 파일 확장명을 변경할 수 있기 때문에 파일 확장자만으로는 충분하지 않다고 가정합니다.

또한 PostedFile.ContentType을 사용하여 MIME 유형을 검사하는 방법에 대해서도 생각했습니다.

파일 확장명을 검사하는 것보다 더 많은 기능을 추가할지, 공격자가이 정보를 쉽게 변경할 수 있는지 여부는 여전히 잘 모르겠습니다.

이것은 기본적으로 학생들이 과제물과 교사를 다운로드하고 볼 수 있도록 업로드하는 과정 관리 시스템을위한 것입니다.

감사합니다.

+0

'PostedFile.ContentType'의 값은 공격자가 제어합니다. 이 변수를 검사하지 마십시오. 낭비입니다. – rook

답변

1

나는 pranay_stacker가 보여 주듯이 확장 기능의 유효성을 검사하는 것에 동의하고, PostedFile.ContentType에 대한 검사는 또 다른 보안 계층을 제공합니다. 그러나 여전히 클라이언트으로 설정된 Content-Type 헤더에 의존하기 때문에 공격을 받기 쉽습니다.

파일 형식을 보증하려면 파일을 업로드하고 처음 2 바이트를 확인해야합니다. 무엇인가의 라인을 따라 (테스트되지 않음)

string fileclass = ""; 
using(System.IO.BinaryReader r = new System.IO.BinaryReader(fileUpload1.PostedFile.InputStream)) 
{ 
    byte buffer = r.ReadByte(); 
    fileclass = buffer.ToString(); 
    buffer = r.ReadByte(); 
    fileclass += buffer.ToString(); 
    r.Close(); 
} 
if(fileclass!="3780")//.pdf 208207=.doc 7173=.gif 255216=.jpg 6677=.bmp 13780=.png 
{ 
    errorLiteral.Text = "<p>Error - The upload file must be in PDF format.</p>" 
    return; 
} 

이것은 매우 거칠고 튼튼하지 않기 때문에 누군가가 이것을 확장 할 수 있기를 바랍니다.

+0

감사합니다. 이것은 나를 시작하기에 충분하다! el.pescado의 포스트 벨로우 (Post bellow)는이 솔루션이 크로스 플랫폼과 호환되는지 궁금해했습니다. 즉, 서로 다른 OS가 동일한 형식의 다른 파일 헤더를 생성하는지 궁금합니다. 당신의 생각? 또한 이러한 접근 방식의 비용 편익은 무엇입니까 (장점은 분명합니다). 이것은 학생들이 파일을 업로드하고 교사가 파일을 다운로드하는 코스 관리 시스템을위한 것입니다 (또는 그 반대로). 어쩌면이 전체 접근법은 지나치게 과격한 행동일까요? – Eran

+0

이것이 공개적으로 사용 가능한 시스템이 아니라면 나는 당신이 옳다고 생각합니다.이 접근법은 과잉입니다. 의도적으로 악의적 인 파일을 업로드하려는 의도가없는 학생을 신뢰할 수 있다면 확장 및 콘텐츠 형식 유효성 검사만으로 충분할 것입니다. – Luke

0

99 %가 확실하려면 UNIX file 유틸리티와 마찬가지로 업로드 된 파일 중 magic numbers을 확인해야합니다.

+0

감사합니다. 이것은 루크가 위의 게시물에서 제안한 것과 비슷한 방향입니다. 매직 넘버에 필요한 정보를 얻을 수있을만큼 처음 두 바이트를 읽는 중입니까? 이것은 플랫폼 독립적 인 솔루션입니까? – Eran

+0

파일 형식에 따라 다릅니다. 몇 가지 예를 보려면 링크 된 Wikipedia 기사를 참조하십시오. –

관련 문제