FreeBSD 7의 libc 구현에서 관련 코드를 _gettemp으로 쫓아 낸 후 파일 tmp_name
의 내용이 어떻게 잘못되었을 수 있는지 명확하지 않습니다. (를 추적하려면, 당신은 PHP 5.2.8의 사본을 다운로드하고 main/rfc1867.c
읽을 수있는 - 라인 main/php_open_temporary_file.c
에서 1018 호출 함수는 함수의 주요 작품은, 그러나 라인 (97)에 시작입니다 않는 라인 227에 시작, 기본적으로 임의의 파일 이름을 실제로 생성하기 위해 _gettemp (위와 동일)을 사용하는 66 (링크 된) 라인의 FreeBSD libc implementation에있는 시스템의 mkstemp에 대한 래퍼입니다. 그러나 the manpage for mkstemp은 BUGS 섹션에서 arc4random()
function이 .하지 재진입이 2 개 동시 요청이 중요한 코드 섹션을 입력하고 반환 될 가능성이 될 수있는 동일 tmp_name
- 나는 (아파치가 논평하는 방법 mod_php 또는 PHP를 CGI 중 하나와 함께 작동하는 방법에 대해 너무 작은 알고 FastCGI를/PHP를 사용하지만) 나는이 시간에이 성공적으로 언급 할 수 - -cgi가 작동 할 수 있습니다.
그러나, 고유성의 유일한 소스로 tmp_name의 파일 이름 부분을 사용하는 경우, 매우 파일 tmp_name
자체가 무효 인을 겪고 있지만, (예를 들어, 다른 업로드 된 파일 대신 충돌하지 않는 경우 simpliest 솔루션을 목표로 저장된 파일 이름), birthday paradox으로 인해 충돌이 발생할 수 있습니다. another question에는 이동할 5,000,000 개의 파일이 있고, still another question에는 하루에 30-40k 업로드를 받는다고 언급되어 있습니다. 이것은 생일의 역설적 인 충돌을위한 주요 상황으로 나를 때린다. mktemp man page은 (PHP처럼 여섯 개의 'X'를 사용하는 경우) 56,800,235,584 개의 가능한 파일 이름 (62 ** 6, 또는 62 ** n, 여기서 n은 'Xs'의 수 등)이 있음을 언급합니다. 그러나 500 만 개가 넘는 파일이 있다면 충돌 가능성은 approximately 100%입니다. ((파일 * (files-1)/2)가 이미 220 충돌의 순서를 이미 경험했을 것입니다.)/(62 ** 6)은 파일이 5,000,000 인 모든 것을 의미합니다. 이 문제가 발생한 경우 ( 생성 된 업로드 된 파일 이름에 추가 엔트로피를 추가하지 않는 경우) move_uploaded_file($file['tmp_name'], UPLOADS.sha1(mt_rand().$file['tmp_name']).strrchr($file['name'], '.'))
과 같은 형식을 시도해 볼 수 있습니다. 임의의 파일 이름에 임의성을 추가하여 충돌을 방지 할 수 있습니다. 또 다른 방법은 두 번째 'X'를 134 행의 main/php_open_temporary_file.c
에 추가하고 다시 컴파일하는 것입니다.
그것은 당신의 tmp 디렉토리가 당신이 파일을 복사/이동하는 문제 또는 dir에 관한 것입니까? – Greg
FreeBSD 8 및 PHP 5.3에서 같은 문제가 발생합니다. 아주 간단한 업로드 스크립트가 있습니다. 5 번의 테스트에서 충돌 가능성이 높습니다. 이것은 정말로 나쁘다. 나는 아직 아이디어가 없다. 위에서 언급 한 것처럼이 문제는 Google에도 어렵습니다. –