0

我正在将文件上传到 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>

难道我做错了什么?请任何人都可以帮我解决这个问题。

4

2 回答 2

1

tmp_name应该包含一个临时名称实际文件名在name元素中。请参阅手册

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

于 2012-12-08T18:08:47.733 回答
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);
于 2012-12-09T10:04:40.560 回答