这是保存上传文件的安全方法吗?

时间:2011-04-19 13:06:43

标签: php security file-upload

只检查上传文件的扩展名是否足够安全?如果不是我还应该检查什么?

public function saveUploadedFile($fileInputName, $fileLocation)
    {
        $fileName=$_FILES[$fileInputName]['name'];
        if(substr($fileName,-4,4)=='.php')
        {
            my_error('have some cake');
            return FALSE;       
        }
        else 
        {
            move_uploaded_file($_FILES[$fileInputName]['tmp_name'],$fileLocation.$fileName);
        }
    }

2 个答案:

答案 0 :(得分:4)

我要改变的一件事是你的条件:

if(substr($fileName,-4,4)=='.php')

您正在做的是将.php个文件列入黑名单,这些文件本身就是好的。但是,(正如在对问题的评论中指出的那样),您应该采用白名单文件类型的方法。所以对于条件,你会检查相反的情况。

而不是逻辑上说“如果文件是.php就失败”,你在逻辑上会说“如果文件不是.jpg或.gif或.doc等则失败”。拥有允许类型的完整列表并禁止所有其他类型通常更安全,并有助于防止人们偷偷摸摸坏文件。

这不是一个完整的安全解决方案,但通常白名单比黑名单更安全。

答案 1 :(得分:3)

您应该检查扩展名filesize($filename); MimeType finfo_open(FILEINFO_MIME_TYPE);(如果您使用> PHP 5.3;您应该检查文件是否存在file_exists($filename);我认为应该这样做。您还应该检查其他扩展名,例如.js,.phtml除非您希望将这些内容上传到您的服务器。

祝你好运。