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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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下载脚本)_Php_Security_Download - Fatal编程技术网

这安全吗?(PHP下载脚本)

这安全吗?(PHP下载脚本),php,security,download,Php,Security,Download,我有一个快速的问题,关于这样做有多安全。我已经编写了一个php强制下载脚本,实际用于该文件的部分应该非常熟悉: header('Content-Description: File Transfer'); header('Content-Type: application/force-download'); header('Content-Length: ' . filesize("user_files/".$temp_actual)); header('Content-Disposition:

我有一个快速的问题,关于这样做有多安全。我已经编写了一个php强制下载脚本,实际用于该文件的部分应该非常熟悉:

header('Content-Description: File Transfer');
header('Content-Type: application/force-download');
header('Content-Length: ' . filesize("user_files/".$temp_actual));
header('Content-Disposition: attachment; filename="'.$filename."\"");
readfile("user_files/".$temp_actual);
$filename
是他们看到的文件名,
$temp\u actual
是我服务器上的真实文件名。显然,上面有一大堆代码可以防止不好的事情发生,但基本上,用户应该能够下载他们上传的任何内容。如果他们上传一个.php文件,我真的不希望它在服务器上运行,我希望它通过强制下载交付给他们(他们需要能够上传任何类型的文件)

它按预期工作,所有文件扩展名都被强制下载,但我只想绝对确保它们不能在我的服务器上运行任何php或html文件

其他信息

user\u文件
位于网站根目录中,但是.htaccess“拒绝所有用户”
user\u files
目录中的每个文件都会被追加。当用户下载其文件时,原始扩展名会被替换,而不是原始扩展名(可能有点过头)。

是网站根目录中的
user\u files
文件夹吗?如果是这样,他们可以上传一个php文件并导航到
http://mysite.com/user_files/somefile.php
并运行代码。当然,他们需要知道文件的临时名称,但是如果您还没有,您应该确保您的web服务器设置为不允许从该文件夹提供页面(或将其移到文档根目录之外)。

您是否考虑过在上传时更改(附加)文件扩展名? 说
myFile.php
变成
myFile.php.txt


您仍然可以使用类似substr()的东西将文件(用于下载目的)显示为.php,但是使用.txt扩展名将使它们无法在服务器上实际运行—无论目录层次结构/位置如何。

清理文件名。有人将尝试上载
.htaccess
以替换您的

即使您将扩展名替换为
.file
,也会有人尝试上载
.htaccess\0.txt
,这将由于以下原因而起作用

有人将尝试
\301\250taccess
(无效的UTF-8序列,可能会解码为
h

此外,还会有人尝试下载
。/../../../../../etc/shadow

如果您在Windows上,有人会尝试
.HTACCESS
。\..\..\..\..\..\Windows\system32\conf\sam

“user\u file/”$temp\u actual
部分在这里很重要:它防止触发。可能会添加这样的注释,这样它就不会被重构了

为了完全确定,如果方便的话,将文件名编码为安全字符。例如,
strtr(base64\u encode($filename),“/”,“\u”)
好,那么答案是:

这样做似乎很安全。对于你们所说的输入过滤等等。。让我给你一个简单的消息:

听着,伙计们,显然需要更多的检查,所以请不要回答用户可能会上传xx.xx并覆盖您的xx或从/../../../../../../../../.下载xx的问题,尽管我非常感谢您的帮助,但我应该重新处理一下这个问题。假设上传和下载是密封的

示例文件名evil.php

  • 上载脚本获取用户文件 去除任何不是: a-zA-Z0-9-_

  • 然后删除扩展名,将其和实名存储在数据库#(以及新文件名)中

  • 该文件被重命名,例如12345.file,并存储在用户_文件中

  • 用户_文件的CHMOD为700,并且.htaccess读取拒绝来自所有

  • 当用户想要获取他们的文件时,一个脚本访问数据库并获取真实的文件名、旧文件名和扩展名,它告诉用户浏览器文件名是oldfilename.extension(evil.php),但它仍然作为12345.file存在于文件系统中。然后设置下载的标题,并使用readfile()将内容读取到浏览器

为了检查用户无法让我的服务器解析php,我注释掉了打开保存文件下载框的标题,并使用了readfile()。结果是php被转储到页面中,但未被解析。对eval()的进一步测试表明它也没有被解析。这是最有帮助的

(在读了一点之后,上面的标题应该从应用程序/强制下载更改为应用程序/八位字节流(正确的mime类型)

感谢所有回复您帮助的人-我希望这可以为将来偶然发现这个问题的人澄清问题


和平!

您的问题与前面的所有代码有关,您称之为“防止坏事发生的代码山”不要使用application/force下载,而是使用application/octet-stream。那么这些变量是从哪里来的???你明白什么是输入验证吗?lol@Rook如果我发布了你将要阅读一个小时的全部代码…请阅读“aaz”的注释下面-也许你可以帮忙。我只是想知道,用户不能告诉我的服务器显示php文件,而不是下载它。我不想让php atall解析该文件。正如我所说,现在效果很好,但可能有一个我不知道的窍门。@Grant cool好吧,你没有给任何人足够的信息来告诉你这是否安全。我会的假设它100%安全。祝你愉快。嘿,它在网站根目录中,但文件夹中有一个.htaccess文件,其中包含来自所有人的拒绝:)感谢javascript和可以欺骗IE6将其解释为javascript(这意味着几乎任何文件类型)的文件也是如此。@aaz-很好,我不知道这一点。我的目标是一样的。保持简单,让它变得无用。。。即使有bug,也不会在上传时检查“htaccess”