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