猿问

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

我目前有一个上传表单,该表单通过其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 Timeout

curl_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第二行让我感到困扰。不好的做法是用这个吗?即使是“只读”模式,我也可以接收恶意文件并破坏系统吗?


波斯汪
浏览 169回答 3
3回答

PIPIONE

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

狐的传说

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

交互式爱情

如果您使用的是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中。
随时随地看视频慕课网APP
我要回答