PHP上传文件扩展名安全性

时间:2018-01-27 20:34:35

标签: php security upload

我目前在我的软件中使用该代码,检查文件扩展名是否安全或有没有办法绕过它?

                $ext = explode('.',$_FILES['file']['name']);
                $extension = end($ext);
                if($extension == 'jpg' || $extension == 'png' || $extension == 'JPG' || $extension == 'jpeg' || $extension == 'gif' || $extension == 'pjpeg' || $extension == 'x-png'){
                    $extension = $extension;
                }
                else {
                    echo 1;
                    die();
                }

谢谢..

3 个答案:

答案 0 :(得分:2)

  

有没有办法绕过它?

绕过它的一种方法是简单地重命名文件..

毕竟,您目前只是检查文件名部分。

为了安全地处理图片上传,OWASP建议使用重写方法。

在PHP中,您可以通过使用gdimagick加载图像并根据输入保存新图像来实现此目的。这可能听起来像是一个相对无用的步骤,但它确保你真正处理图像是一种非常安全的方式。

修改:另请参阅this answer

答案 1 :(得分:0)

我个人不建议仅单独检查文件扩展名。根据您当前的方法,您需要考虑几点:

  1. 想象一下,如果我上传一个名为mypicture.jpg.php的文件,你当前的if语句逻辑会抓住它吗?可能值得一试吗?
  2. 关注(1)如果答案为否,那么下一个问题是你的应用程序会检查jpg图像中是否包含任何php代码,这可能导致网络服务器上的各种权限升级?
  3. 因此,按照Stratadox之前的回答,我也会阅读这个OWASP Unrestricted File Upload页面。 Stratadox友情提供的OWASP链接更多地关注预防技术,我提供的链接更多是攻击方面。我认为这应该有所帮助。

    总之,您可以保留当前的文件扩展名检查,但可以在if语句中扩展一些更高级的检查。上面已经提到的好建议是本机PHP图像检查功能/库,例如gd或imagick。

    注意 - 始终研究任何本机PHP图像检查功能/库是否存在安全漏洞(Google会提供帮助),并确保正确配置功能/设置。这是一个很好的做法,让你成为一个更安全的开发人员(并赚取一些大的$):))

    希望这有帮助。

答案 2 :(得分:-1)

最好的方法是:

<?php //A function to return the extension if you'll want use IT
function EXTENSION($sr){
$path_parts = pathinfo($sr);
$exte='.'.$path_parts['extension'];
return $exte;
;}

;?&GT;

    <?php 
//OR Other way
// then test if is a Pic
    list($width, $height, $type, $attr) = getimagesize($_FILES["file"]['tmp_name']); 

    if(preg_match("#.jpg|.jpeg|.png|.gif#i", $_FILES['file']['name']) AND $width > 2 ){
    //Do what you want

    ;}else{
    echo 1;
    die();
    ;}

    ;?>
像这个兄弟一样非常安全。