Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用cURL上传不带@symbol的文件?_Php_File_Curl_Upload - Fatal编程技术网

Php 使用cURL上传不带@symbol的文件?

Php 使用cURL上传不带@symbol的文件?,php,file,curl,upload,Php,File,Curl,Upload,我在这里有一个小问题,我如何告诉cURL将文件附加到请求 如果我正在上载带有cURL的文件,那么常用的方法是将其作为POST数据数组的一部分附加,其值前面有@,例如: CURLOPT_POSTFIELDS=>array('my-file'=>'@my-file.txt') 这显然是可行的,但我有两个问题: 如果它不是我正在上传的文件呢?如果我的POST值实际上是'@my-file.txt',并且它试图上传文件,该怎么办?它制造了一个我拼命想避免的漏洞 如何从URL上传文件?我是否

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

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

CURLOPT_POSTFIELDS=>array('my-file'=>'@my-file.txt')
这显然是可行的,但我有两个问题:

  • 如果它不是我正在上传的文件呢?如果我的POST值实际上是'@my-file.txt',并且它试图上传文件,该怎么办?它制造了一个我拼命想避免的漏洞
  • 如何从URL上传文件?我是否需要下载它,将其存储在临时文件夹中,然后从该临时文件夹中用@附加它?为什么我不能只给cURL我希望用作文件的内容
cURL CURLOPT_infle不是一个选项,因为它不会显示为$\u文件数组的一部分

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


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

我最后做的是检测是否有任何输入数据以@符号开头,如果是,则将其作为GET变量提交(作为cURL中提交URL的一部分)。这对所有情况都没有帮助(比如提交了一个以@开头的大字符串),但解决了我在Twitter句柄上遇到的问题。

如果有人在2019年及以后在谷歌上找到这个结果后看到这个结果(正如我所做的),这个问题已经按照解决了

您现在可以使用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);

可以找到更多信息。

关于漏洞,这似乎是不可修复的:在检查输入值时,您必须手动检查是否存在
@
。也许,就像?谢谢Pekka,我只希望有一个解决方案。但是mAu:这不起作用,因为我的API还需要支持文件上传。如果可以将文件与POST字段分开提交,并且我还需要在POST中提交一些数据,那么一切都会很好(因为POST没有获取这些数据的限制)。@Pekka手动检查
@
不是解决方案,因为有些情况下,POST值需要以true开头,文字
@
。如果您检查并看到该值以
@
开头,您有哪些选项?如果不触发上传文件机制,或者不剥离
@
,就无法发布该表单,这可能会极大地改变值的语义,并且如果post接收者不在您的控制之下,您就几乎完蛋了。@lanzz我同意,但似乎没有更好的方法请不要在答案上添加链接。请尝试复制此处最重要的信息。抱歉@KingMidas,我刚刚修复了此问题。我是一个新的回答,所以让我知道如果你有任何进一步的反馈。谢谢。现在好多了!