我在我的网站上用php创建了一个上传表格,人们可以上传一个zip文件。然后提取zip文件,并将所有文件位置添加到数据库中。上传表单仅供人们上传图片,显然,文件在zip文件夹中我无法检查文件被提取之前要上传的文件。我需要一段代码来删除所有非图像格式的文件(.png,.jpeg等)。我真的很担心人们能够上传恶意的php文件,存在很大的安全风险!我还需要注意人们改变php文件的扩展,试图绕过这个安全功能。
这是我使用的原始脚本http://net.tutsplus.com/videos/screencasts/how-to-open-zip-files-with-php/
这是实际提取.zip文件的代码:
function openZip($file_to_open) {
global $target;
$zip = new ZipArchive();
$x = $zip->open($file_to_open);
if($x === true) {
$zip->extractTo($target);
$zip->close();
unlink($file_to_open);
} else {
die("There was a problem. Please try again!");
}
}
谢谢,Ben。
答案 0 :(得分:63)
答案 1 :(得分:15)
首先,您应该禁止每个没有正确图像文件扩展名的文件。之后,您可以使用getimagesize
function检查文件是否是常规图像文件。
但此外,您应该知道某些图像格式允许注释和其他元信息。这可以用于恶意代码,例如某些浏览器在某些情况下会执行的JavaScript(请参阅Risky MIME sniffing in Internet Explorer)。
答案 2 :(得分:9)
那么你可能不应该只依赖文件扩展名。尝试通过图像库传递每个文件以验证它真的是一个图像。
答案 3 :(得分:2)
我没有看到在您的数据库中重命名php文件的风险... 只要你不将它们作为PHP文件进行评估(或根本就没有评估),它们就不会造成太大的伤害,并且由于没有.php扩展名,因此php引擎不会触及它们。
我猜你也可以搜索<?php
...
:假设上传到您计算机的文件最糟糕。重命名您要将其保存为“病毒”的文件夹并对其进行相应处理。不要公开,不要给任何文件启动权限(特别是php用户)等。
答案 4 :(得分:2)
您可能还想考虑使用以下库进行mime类型检测:
答案 5 :(得分:1)
现在你依靠你的硬盘空间来提取。您可以检查文件头以确定它们是什么类型的文件。那里可能有图书馆。
offtopic:不要让用户选择几张图片而不是上传一个zip文件。对于那些不知道拉链是什么的人来说更好(是的,它们存在)
答案 6 :(得分:1)
如果你将php设置为仅解析以.php结尾的文件,那么你可以将文件从somename.php重命名为somename.php.jpeg,你就是安全的。
如果你真的想要删除这些文件,那么php可以使用zip library。您可以使用它来检查上传的zip存档中所有文件的名称和扩展名,如果它包含php文件,则给用户一条错误消息。
答案 7 :(得分:1)
就个人而言,我会在Apache配置中添加一些东西,以确保它从文件上传到的位置将PHP文件作为文本提供,因此您是安全的,并且可以允许其他文件类型上传到将来
答案 8 :(得分:0)
要知道通过getimagesize传递恶意PHP()
通过尝试确保图像的图像功能注入PHP 使用getimagesize()函数
是安全的
在此处阅读更多内容http://ha.ckers.org/blog/20070604/passing-malicious-php-through-getimagesize/
更好地为您的用户徽标使用Stackoverflow使用的gravatar;)
答案 9 :(得分:0)
使用getimagesize功能。
完整程序: -
1.)提取图像/上传文件的扩展名,然后将扩展名与允许的扩展名进行比较。
2.)现在创建一个随机字符串,用于重命名上传的文件。最好的想法是md5(session_id().microtime())
。它不能重复,如果您的服务器速度非常快,并且处理时间小于一微秒,则使用递增变量并使用字符串添加它们。
现在移动该文件。
提示 在上传目录中禁用PHP文件处理,它总是会阻止你从任何服务器端攻击,如果可能的话,在根目录或httpd配置文件中添加你的htaccess并从那里禁用htaccess文件,它现在解决了你的最大问题