2012-10-21 2 views
0

저는 보안 문제가 일반적으로 사용자 입력에서 발생한다는 것을 알고 있습니다. 그 이유는 $ eFlag! = 1의 else 부분에 보안 허점이 있다고 가정하기 때문입니다.
저는 PHP에 익숙하지 않아서 여기서 어떤 일이 일어나고 있는지 100 % 확신하지 못했습니다.파일 업로드로 인한 보안 문제

업로드되는 파일 자체가 일부 악의적 인 실행 파일 일 수 있으며 확인되지 않았습니다. 그렇다면 실행 파일을 업로드하지 못하도록하거나 .doc 파일을 업로드하지 못하도록하는 방법이 있습니다 (프로그램에서 원하는 파일처럼 보입니다).

*** 내가 학교에 다니고 있으며 보안 구멍을 확인하도록 요청한 클럽 중 하나에 게시되었습니다 (다시 말해 확실한 것은 있음). 마임 유형을 확인하기 위해 php.net에

strcmp(substr(mime_content_type($_FILES['userfile']['tmp_name']),0,4),"doc" 

전체 예 :

+1

업로드 된 내용에 관계없이 스크립트는 .doc 확장자를 사용합니다. 그것이 보안 위험 또는 단순한 어리 석음으로 자격이 있는지 여부는 확실하지 않습니다. – fvu

+0

정확히 .. 어떻게 그것이 doc 파일인지 확인합니까? 그래서 사실, .doc 파일이라면 무엇이든 업로드하고 .doc 확장자를 붙이는 대신 업로드 할 것입니다. – antz

+0

.doc 파일은 악의적 인 요소에 대한 취약성으로 잘 알려져 있지만 비교적 안전한 방법은 파일의 [서명] (http://www.garykessler.net/library/file_sigs.html)을 확인하는 것입니다. 그것이 옵션이라면 먼저 파일 유형을 결정할 수있을뿐만 아니라 (그리고 저장된 파일에 적절한 파일 확장명을 사용할 수도 있습니다), 두 번째로 virussscanner를 통과하게됩니다. – fvu

답변

2

당신은 업로드 된 파일의 MIME 유형을 확인해야합니다 파일 이름 이름의 추가 필터 http://php.net/manual/en/function.mime-content-type.php

전체 코드와 길이 (파일 이름을 기준으로 함) :

$match = preg_match_all("/^[a-zA-Z0-9]/$", $_FILES['userfile']['name'], $matchif); 

if (!$matchif) 
{ 
    die('not allowed filename'); 
} 

if (strlen($_FILES['userfile']['name']) > 255 || strlen($_FILES['userfile']['name'] == 0)) 
{ 
    die('Filename length not allowed'); 
} 

if (strcmp(substr(mime_content_type($_FILES['userfile']['name']),0,4),"doc")==0) 
{ 

    if (move_uploaded_file($_FILES['userfile']['tmp_name'])) 
    { 
     // upload file 
    } 
    else die('not upload'); 

} 
else die('support only doc'); 

당신은 덤프 및 예제로 MIME 형식을 확인하는 조건문을 사용할 수 있습니다

var_dump($_FILES['userfile']['type']); 

if ($_FILES['userfile']['type'] == 'application/msword') { ... move uploaded files ... } 

공지 사항 : 마임 유형은 위조 될 수있다, 그래서 내가 $ _FILES, 파일 이름의 길이를 통해 파일 이름을 통해 유형을 확인하고, 코드의 첫 줄을 읽 DOC 또는 다른 것을 확인하십시오. 메모장에서 doc을 열고 파일을 읽음으로써 PHP에서 확인할 수있는 것을 확인하십시오.

+0

감사합니다! 정확히 내가 필요로하는 것 – antz

0

일반적으로 업로드 된 파일은 직접 또는 간접적으로 호출 할 수있는 두 가지 방법이 있습니다.

직접적인 방법은 URL로 호출하는 것입니다. 이 경우 파일 이름 확장자로 웹 서버에 힌트를 제공합니다. 따라서 파일은 실행 파일 이름 확장명 (예 : .php)으로 저장되지 않았거나 파일이 HTTP를 통해 도달 할 수없는 위치에 저장되어 있는지 확인해야합니다.

간접적 인 방법은, 그렇지 않으면, 당신은 등 include에 대한 인수가 매개 변수화하는 경우, 매개 변수가 사용자 입력에 의해 조작 될 수 있는지 확인해야합니다 그래서 다른 호출 파일 등 include를 사용하여 업로드 된 파일을 포함해야하는 것 당신은 remote/local file inclusion에 취약합니다.

관련 문제