使用cURL上传没有@符号的文件?

时间:2012-08-11 09:36:07

标签: php file curl upload

我这里有一个小问题,如何告诉cURL专门将文件附加到请求?

如果我使用cURL上传文件,那么通常的方法是将其作为POST数据数组的一部分附加,其值前面带有@,例如:

CURLOPT_POSTFIELDS=>array('my-file'=>'@my-file.txt')

这显然有效,但我有两个问题:

  • 如果它实际上不是我上传的文件怎么办?如果我的POST值实际上是'@ my-file.txt'并且它试图上传文件怎么办?它造成了我迫切想要避免的漏洞。
  • 如何从网址上传文件?我是否必须下载它,将其存储在临时文件夹中,然后用@临时文件夹附加它?为什么我不能仅仅提供我希望用作文件的内容?

cURL CURLOPT_INFILE不是一个选项,因为它不会显示为$ _FILES数组的一部分。

在cURL中似乎有一个漏洞依赖于POST字段值中的@符号。有办法解决吗?为什么没有CURLOPT_FILEFIELDS数组?命令行cURL有一个单独的标志(-F),但由于某种原因,我不认为它是PHP中的一个选项。

非常感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:2)

如果有人在Google上找到此结果后(如我所知)在2019年及以后查看此问题,则该问题已按照this bug fix解决。

您现在可以使用CURLFile通过PHP CURL请求发送文件,如下所示:

$fullpath = '/var/www/html/website/test.png';
$mime = 'image/png';
$publicname = 'testpic';
$cfile = curl_file_create($fullpath,$mime,$publicname);
$fields[$publicname] = curl_file_create($fullpath,$mime,$publicname);

然后将在其中使用

curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);

可以找到更多信息here

答案 1 :(得分:1)

我最终做的是检测是否有任何输入数据以@符号开头,如果是,则将它们作为GET变量提交(作为cURL中提交URL的一部分)。它对所有情况都没有帮助(比如当提交一个以@开头的大字符串时),但是切断了Twitter处理的问题。