【问题标题】:PHP - File Upload Security, Why Won't This Method Work?PHP - 文件上传安全,为什么这个方法不起作用?
【发布时间】:2013-05-10 20:06:50
【问题描述】:

我是文件上传的新手,我意识到安全性非常重要。现在根据测试目的,在我真正想深入研究安全性之前,我只想快速上传测试,当我尝试以下“安全性”时

<?PHP
$name = $_FILES['file']['name'];
$type = $_FILES['file']['type'];
$tmp_name = $_FILES['file']['tmp_name'];

if(isset($name)) {
    if (!empty($name)) {
    $location = "ufiles/";  
    if($_FILES['file']['type'] == "images/jpeg" || $_FILES['file']['type'] == "images/png"){

    move_uploaded_file($tmp_name, $location.$name);
                }
            }
        }
?>

此代码似乎不起作用,除非我取消文件类型检查点,否则文件不会上传。所以这显然是我的问题。但是为什么这不起作用呢?

另外:我意识到这不是保护文件类型的一种非常有效的方法,但它似乎最简单合乎逻辑,我只是​​很困惑为什么它不起作用。

编辑始终检查您的语法。哈哈

if($_FILES['file']['type'] == "images/jpeg" || $_FILES['file']['type'] == "images/png")   

【问题讨论】:

  • $_FILES $_files
  • 就是这样...天啊天啊。我现在觉得自己很蠢……DOH! =[谢谢你:P
  • @Dagon 哇...打败我。哈哈。 rbn, PHP 变量区分大小写。
  • @Oberst 是的,我就是我自己,我搞砸了,只是输入了小写字母。

标签: php file security upload


【解决方案1】:

它是“image/jpeg”而不是“images/jpeg”。 PNG 类型也是如此。

$_files 也应该是 Oberst & Dagon 提到的 $_FILES。 PHP 变量区分大小写。

像这样:

if(isset($name)) {
    if (!empty($name)) {
    $location = "ufiles/";  
    if($_FILES['file']['type'] == "image/jpeg" || $_FILES['file']['type'] == "image/png"){

    move_uploaded_file($tmp_name, $location.$name);
                }
            }
        }
?>

【讨论】:

  • PHP 变量仍然区分大小写。 ;-)(根据我上面的评论)
【解决方案2】:

尝试将内容类型更改为image/jpegimage/png

【讨论】:

    【解决方案3】:

    我觉得有问题

    $_files['file']['type'] == "images/jpeg" || $_files['file']['type'] == "images/png";
    

    请替换 $_FILES['file']['type'] 而不是那个并尝试它,或者您可以按照上面的定义输入 $type

    【讨论】:

      【解决方案4】:

      这很容易被绕过,因为$_FILES['file']['type'] 中的媒体类型可以被伪造。

      如果您只想允许图片,请确保使用适当的文件扩展名保存图片。否则,攻击者可以将.php 文件上传为image/png,从而绕过您的验证。

      【讨论】:

        猜你喜欢
        • 2021-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-05
        • 2015-07-08
        相关资源
        最近更新 更多