Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 使用fopen执行文件上传卷曲是否安全?_Php_Curl_File Upload_Dropbox Api - Fatal编程技术网

Php 使用fopen执行文件上传卷曲是否安全?

Php 使用fopen执行文件上传卷曲是否安全?,php,curl,file-upload,dropbox-api,Php,Curl,File Upload,Dropbox Api,我目前有一个上传表单,通过它的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.dro

我目前有一个上传表单,通过它的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
感到不安。这是一个坏习惯吗?即使是“只读”模式,我是否可以接收到恶意文件并破坏系统?

这是非常安全的。PHP将其作为纯数据读取,而不是试图执行它
curl
只需将其传递给DropBox API即可。在这一点上,这是DropBox的问题(如果他们执行用户上传的代码,这将是非常令人惊讶的,除非他们有严重的安全缺陷)。

这是完全安全的。PHP将其作为纯数据读取,而不是试图执行它
curl
只需将其传递给DropBox API即可。在这一点上,这是DropBox的问题(如果他们执行用户上传的代码,这将非常令人惊讶,除非他们有严重的安全漏洞)。

是的,如果使用只读模式,这是安全的,因为文件没有被执行,内容只是被读取。

是的,如果使用只读模式,这是安全的,由于文件没有被执行,所以内容只是被读取。

如果您使用的是linux或MacOS*或*BSD,并且不关心windows兼容性,那么这是正确的方法,但我还是想了解一下您的代码:

如果您编写的任何代码可能在windows上运行,请养成使用fopen模式
rb
而不是
r
,因为windows上的fopen
r
模式可能会损坏二进制数据(根据
octet流
头,它是二进制数据)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,
    ))
));

它只是更可读,更易于维护,更易于修改。虽然我必须说,Dropbox方面将这些数据作为HTTP头是一个糟糕的设计决策,但HTTP头中的一些字符是非法的,而这些字符在大多数文件系统标准的文件名中是完全合法的,这意味着我怀疑有可能制作一个包含无法进行HTTP头编码的有效文件名的有效json。。他们应该使用多部分/表单数据,而只是将文件和json作为两个单独的表单变量,依我看。

如果您使用的是linux或MacOS*或*BSD,并且不关心windows兼容性,那么这是正确的方法,但我仍然想选择您的代码:

如果您编写的任何代码可能在windows上运行,请养成使用fopen模式
rb
而不是
r
,因为windows上的fopen
r
模式可能会损坏二进制数据(根据
octet流
头,它是二进制数据)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,
    ))
));
它只是更可读,更易于维护,更易于修改。虽然我必须说,Dropbox方面将这些数据作为HTTP头是一个糟糕的设计决策,但HTTP头中的一些字符是非法的,而这些字符在大多数文件系统标准的文件名中是完全合法的,这意味着我怀疑有可能制作一个包含无法进行HTTP头编码的有效文件名的有效json。。他们应该使用multipart/form数据,只需将文件和json作为两个单独的表单变量,imo