为了账号安全,请及时绑定邮箱和手机立即绑定

使用fopen在文件上传中执行cURL是否安全?

使用fopen在文件上传中执行cURL是否安全?

PHP
波斯汪 2021-05-02 16:31:40
我目前有一个上传表单,该表单通过其API将文件发送到Dropbox。执行cURL之后将文件接收到的.php如下:$localFile = $_FILES["file_key"]['tmp_name'];$fp = fopen($localFile, 'r');$ch = curl_init();curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");curl_setopt($ch, CURLOPT_URL, 'https://content.dropboxapi.com/2/files/upload');curl_setopt($ch, CURLOPT_HTTPHEADER, array(    "authorization: Bearer MY-TOKEN",    "content-type: application/octet-stream",    "dropbox-api-arg: {\"path\": \"/tmp/a.txt\",\"mode\": \"add\",\"autorename\": true,\"mute\": false,\"strict_conflict\": false}"));curl_setopt($ch, CURLOPT_UPLOAD, 1);curl_setopt($ch, CURLOPT_TIMEOUT, 86400); // 1 Day Timeoutcurl_setopt($ch, CURLOPT_INFILE, $fp);curl_setopt($ch, CURLOPT_NOPROGRESS, false);curl_setopt($ch, CURLOPT_BUFFERSIZE, 128);curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localFile));curl_exec ($ch);这很完美,但是fopen第二行让我感到困扰。不好的做法是用这个吗?即使是“只读”模式,我也可以接收恶意文件并破坏系统吗?
查看完整描述

3 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

是的,如果您使用只读模式,这是安全的,因为未在执行文件,因此仅在读取内容。


查看完整回答
反对 回复 2021-05-14
?
狐的传说

TA贡献1804条经验 获得超3个赞

非常安全。PHP会将其读取为纯数据,它不会尝试执行它。curl只需将其传递给DropBox API。到那时,这是DropBox的问题(如果他们执行用户上传的代码,这将是非常令人惊讶的,除非他们存在严重的安全漏洞)。


查看完整回答
反对 回复 2021-05-14
?
交互式爱情

TA贡献1712条经验 获得超3个赞

如果您使用的是Linux或MacOS *或* BSD,并且不关心Windows兼容性,那么这是正确的方法,但是我仍然想对您的代码进行检查:


如果您曾经编写过任何可能在Windows上运行的代码,请养成使用fopen模式rb而不是的习惯r,因为rWindows上的fopen模式可能会破坏二进制数据(并且按octet-stream标题显示,它是二进制数据),并且linux / macos / * BSD全部对待方式r和rb方式相同,因此


$fp = fopen($localFile, 'rb');

这条线


curl_setopt($ch, CURLOPT_HTTPHEADER, array(

    "authorization: Bearer MY-TOKEN",

    "content-type: application/octet-stream",

    "dropbox-api-arg: {\"path\": \"/tmp/a.txt\",\"mode\": \"add\",\"autorename\": true,\"mute\": false,\"strict_conflict\": false}"

));

应该实际阅读


curl_setopt($ch, CURLOPT_HTTPHEADER, array(

    "authorization: Bearer MY-TOKEN",

    "content-type: application/octet-stream",

    "dropbox-api-arg: " . json_encode(array(

        'path' => '/tmp/a.txt',

        'mode' => 'add',

        'autorename' => true,

        'mute' => false,

        'strict_conflict' => false,

    ))

));

它更具可读性,更可维护且更易于修改。尽管我必须说将数据作为HTTP HEADER放置是Dropbox的错误设计决定,但HTTP头中的字符是非法的,而对于大多数文件系统标准而言,这些头在文件名中都是完全合法的,这意味着我怀疑可以制作包含以下内容的有效json:一个有效的文件名,不能使用http-header-encoded ..他们应该使用multipart / form-data,并将文件和json放在2个单独的表单变量imo中。


查看完整回答
反对 回复 2021-05-14
  • 3 回答
  • 0 关注
  • 168 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信