2012-12-08 6 views
0

파일을 box.net에 업로드하는 중입니다. Curl을 사용하여 파일을 보내고 있습니다.원하는 파일 대신 .tmp 파일을 서버에 업로드

하지만 내가 직면 한 문제는 내가 선택한 파일을 업로드하지 않고 일부 .tmp 파일을 업로드한다는 것입니다. 내가 잘못 어떤 일을하고

<?php 
$upload_url = 'Server-Url'; 

$tmpfile = $_FILES['new_file1']['tmp_name']; 
$_POST['new_file1'] = '@'.$tmpfile; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $upload_url); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $_POST); 

$response = curl_exec($ch); 
curl_close($ch); 
echo $response;  
?> 


<form action="" 
    enctype="multipart/form-data" accept-charset="utf-8" method="POST"> 
<input type="file" name="new_file1" /> 
<input type="text" name="share" value="1" /> 
<input type="submit" name="upload_files" value="Upload File" /> 
</form> 

암 :

다음은 내 코드입니다? 이 문제를 해결하려면 아무도 도와주세요.

+1

Uhm ... tmp 파일 *은 * 파일이며, 업로드하는 동안 항상 tmp 파일로 이름이 바뀌 었습니다. – deceze

+0

@deceze 어쨌든 원래 파일 이름으로 되돌릴 수 있습니까? –

답변

1

tmp_name이고 임시 이름은입니다. 실제 파일 이름은 name 요소에 있습니다. manual을 참조하십시오.

그러나 코드를 사용하면 name 요소를 사용하면 공격자가 서버에서 로컬 파일을 업로드하도록 스크립트에 큰 취약점을 도입 할 수 있습니다. 이를 방지하려면 move_uploaded_file()을 사용하십시오.

+0

나는 PHP에서 초보자입니다, 조금 혼란스러워 보입니다. Plz 내가 당신이해야 할 조작을 보여줄 수 있습니다. –

1

필자가 말했듯이 컬은 업로드하는 동안 하나의 파일을 선택하고 다른 이름을 보내지는 않습니다. 이러한 유연성을 위해 전체 HTTP 요청을 직접 작성하고 싶지 않으면 디스크의 파일 이름을 바꿔야합니다. 파일 이름을 임의의 사용자 제공 이름으로 변경하는 것은 항상 거대한 보안 위험입니다. 아래에서 고유 한 임시 디렉토리를 만들고이 파일을 해당 디렉토리로 이동시켜 경로 주입 공격을 피하고 다른 파일을 덮어 쓰지 않도록합니다. 더 많은 공격 벡터가있을 수도 있고 없을 수도 있습니다.

do { 
    $tmpDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . uniqid('upload'); 
} while (file_exists($tmpDir)); 
$uploadFile = realpath($tmpDir . DIRECTORY_SEPARATOR . basename($_FILES['new_file1']['name'])); 

if (strpos($uploadFile, $tmpDir) !== 0) { 
    trigger_error('File path not within expected directory', E_USER_ERROR); 
    exit; 
} 

mkdir($tmpDir, 0600); 
move_uploaded_file($_FILES['new_file1']['tmp_name'], $uploadFile); 

... 
curl_setopt($ch, CURLOPT_POSTFIELDS, array('file' => "@$uploadFile")); 
... 

unlink($uploadFile); 
rmdir($tmpDir);