阻止人们通过表单上传恶意PHP文件

时间:2009-03-02 14:34:16

标签: php security upload zip

我在我的网站上用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。

10 个答案:

答案 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类型检测:

http://ca.php.net/manual/en/ref.fileinfo.php

答案 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文件,它现在解决了你的最大问题