将.tmp文件而不是所需文件上载到服务器

时间:2012-12-08 18:04:51

标签: php curl

我正在将文件上传到box.net。 我使用Curl发送文件,

但我遇到的问题是它没有上传我选择的文件,而是上传了一些.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>

我做错了吗? 请任何人帮我解决这个问题。

2 个答案:

答案 0 :(得分:1)

tmp_name 假设包含临时名称。实际文件名在name元素中。请参阅manual

但是,使用您拥有的代码,如果您使用name元素,则会在代码中引入一个巨大的漏洞,因为攻击者可能会使您的脚本从您的服务器上传本地文件。使用move_uploaded_file()来阻止这种情况。

答案 1 :(得分:1)

据我所见,curl不提供选择一个文件,但在上传过程中为其发送了不同的名称。除非您想自己制作整个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);