【问题标题】:Using cURL to upload a file without @ symbol?使用 cURL 上传没有@符号的文件?
【发布时间】:2012-08-08 10:58:33
【问题描述】:

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

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

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

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

  • 如果它实际上不是我要上传的文件怎么办?如果我的 POST 值实际上是“@my-file.txt”并且它尝试上传文件怎么办?它创造了一个我极力避免的漏洞。
  • 如何从 URL 上传文件?我是否必须下载它,将其存储在临时文件夹中,然后使用该临时文件夹中的 @ 附加它?为什么我不能只给 cURL 我希望用作文件的内容?

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

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

任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 又是漏洞,这似乎无法修复:bugs.php.net/bug.php?id=46439 在检查输入值时,您必须手动检查 @ 的存在。
  • 可能是http_build_query,如this answer?
  • 谢谢 Pekka,我只希望有一个解决方案。但是 mAu:这不起作用,因为我的 API 也需要支持文件上传。如果可以将文件与 POST 字段分开提交,并且我还需要在 POST 中提交一些数据(因为 GET 存在 POST 不存在的限制),那么一切都会好起来的。
  • @Pekka 手动检查@ 不是解决方案,因为 种情况下,发布的值需要以真实的文字@ 开头。如果您检查并看到该值以@ 开头,您有什么选择?如果不触发上传文件机制或剥离@,则无法发布该表单,这可能会极大地改变值的语义,如果发布接收者不受您的控制,那么您就完蛋了。
  • @lanzz 我同意,但似乎没有更好的办法

标签: php file curl upload


【解决方案1】:

如果有人在 2019 年及以后在 Google 上找到此结果后查看此结果(就像我一样),问题已根据 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找到。

【讨论】:

  • 请不要在答案上放置链接。尝试在此处复制最重要的信息。
  • 对不起@KingMidas,我刚刚解决了这个问题。我是新手,所以如果您有任何进一步的反馈,请告诉我。谢谢。
  • 现在,好多了!
【解决方案2】:

我最终做的是检测是否有任何输入数据以 @ 符号开头,如果是,则将它们作为 GET 变量提交(作为 cURL 中提交 URL 的一部分)。它并不适用于所有情况(例如提交以 @ 开头的大字符串时),但可以解决我在 Twitter 句柄方面遇到的问题。

【讨论】:

    猜你喜欢
    • 2015-05-14
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 2018-04-08
    • 2012-09-21
    • 2016-09-27
    • 2017-11-12
    相关资源
    最近更新 更多