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