2011-11-24 2 views
18

문서 말 :is_uploaded_file()의 목적은 무엇입니까?

반환 TRUE 파일 이름에 의해 명명 된 파일이 HTTP POST

를 통해 업로드 된 경우 어떻게 $_FILES['blah']['tmp_name'] 가능성이 업로드 게시물의 결과 일 수 없었다? PHP가이 파일 이름을 만들었습니다.

이 악의적 인 사용자가이 작동하지 말아야 할 파일에서 동작 트릭 스크립트에 시도되지 않았는지 확인하기 위해 유용합니다 - 예를 들어,/etc/passwd에.

파일 내용과 크기를주의 깊게 확인해야한다는 것을 알고 있습니다. 하지만 어떻게 공격자가 업로드 파일의 임시 파일 이름을 제어 할 수 있습니까?

아니면 is_uploaded_file() 다른 검사를 수행합니까?

빛을 비춰 주셔서 감사합니다.

+1

수정 :'is_uploaded_file()'not is_upload_file()'. – MacMac

+0

'move_uploaded_file()'도 똑같은 검사를 다시하기 때문에 중복됩니다. – mario

+0

@mario : 아니요. 중복되지는 않습니다. 왜냐하면 다른 사람과 전화를해야만하기 때문입니다. 당신은 그들을 고립되어 사용할 수 있습니다. –

답변

9

음, 문자열을 is_uploaded_file에 전달할 수 있습니다.

확실히, $_FILES에서 똑바로 넘겨 주면 물론, 항상 그렇습니다. true을 반환 할 것입니다. 그러나 당신이 스스로 인수를 구성한다면, 그렇지 않을 수도 있습니다.

+0

+1 지점으로 곧장 들어갑니다. 감사합니다 존과 Tomalak. –

24

현재 양식에서 is_uploaded_file은 파일 업로드가 활성화되어 있는지 확인합니다 (그렇지 않으면 업로드 된 파일 일 수 없음). 제공된 파일 이름이 실제로 PHP에서 생성 된 것입니다. 문제는 항상 true을 반환 한 후

is_uploaded_file($_FILES['blah']['tmp_name']) 

업로드 동안 없었다 경우 이후

이 정말 도움이되지 않습니다.

그러나 $_FILES은 PHP 4.1.0부터 "만"사용 가능했으며 is_uploaded_file은 PHP 4.0.3에서 처음 등장했습니다. 여기서 논리적으로 보이는 결론은 $_FILES 수퍼 글로벌을 사용하기 전에 업로드 된 파일 처리가 안전하게 이루어지기가 어려웠습니다.. 그 밖의 것이 없다면, non-superglobals을 주입 할 수 있고, 매우 쉽게 register_globals을 활성화 할 수 있습니다. 이것은 PHP의 보안과 관련하여 또 다른 불만 사항이었습니다.

오늘 코드를 작성하고있는 것처럼 $_FILES을 사용하는 경우 "bad"파일을 처리하도록 당신을 속일 수있는 공격 벡터가 없기 때문에 현재 구현에서 is_uploaded_file은 "쓸모가 없습니다"라고 말하고 싶습니다.

is_uploaded_file은 파일을 업로드하고 프로그래머가 사용할 수있게하는 방법에 관계없이 현재 및 향후 사용할 수있는 한 올바르게 작동하는 것이 보장됩니다. . 어쩌면 구체적인 것은 없지만 보증과 함께 제공되는 "안전한 파일 업로드"개념을 추상화 한 것입니다. 나는 $_FILES에 대한 보증이 없다고 생각할 것이다. (다시 말하지만, 현재 상황이 "더 나쁘다"면 회귀라고 생각한다.)

1
bool is_uploaded_file (string $filename) 

filename으로 명명 된 파일이 HTTP POST를 통해 업로드 된 경우 TRUE를 반환합니다. 이는 악의적 인 사용자가 스크립트가 작동하지 않아야하는 파일 (예 :/etc/passwd) 작업을 속이려고 시도하지 않도록 도움을줍니다.

이러한 종류의 검사는 업로드 된 파일로 수행 한 작업으로 사용자 또는 동일한 시스템의 다른 사용자에게 내용을 공개 할 수있는 경우 특히 중요합니다. 적절한 작업을위한

는 함수 is_uploaded_file()는

$_FILES['userfile']['tmp_name'], 

같은 인수를 필요로 - 업로드 된 파일의 이름을 작동하지 않습니다 클라이언트 컴퓨터

$_FILES['userfile']['name'] 

에.

출처 : PHP 설명서

관련 문제