2012-12-08 74 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

呃...... tmp文件*是*文件,它只是在上載過程中重命名爲tmp文件,因爲它總是這樣嗎? – deceze

+0

@deceze什麼辦法可以改變它回到我原來的文件名? –

回答

1

tmp_name假定包含臨時名稱。實際的文件名在name元素中。請參閱manual

但是,使用代碼時,如果使用name元素,則會在代碼中引入一個巨大的漏洞,因爲攻擊者可能會使您的腳本從您的服務器上傳本地文件。使用move_uploaded_file()來防止這種情況。

+0

我初學者在PHP,似乎有點混亂。你可以向我展示我需要做的操作。 –

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);