停止双延伸上传

时间:2016-07-26 09:04:41

标签: php regex file-upload

嘿,我正在尝试验证用户是否尝试上传双扩展文件,以便我使用以下代码

function ExtensionValide($sFileName) {

        $fileNameInfo = array();
        if (preg_match('/.php.|.js./',$sFileName)) {
            return false;   # Tentative de masquer des extensions dangereuses !
        }
        else {
            $extension_valide = array('gif','png','jpg','jpeg','txt','pdf','html','mp3','csv');
            $extension_upload = strtolower(substr(strrchr($sFileName,'.'),1));
            $fileNameInfo[0] = in_array($extension_upload,$extension_valide);
            $fileNameInfo[1] = ".$extension_upload";
            $fileNameInfo[2] = basename($sFileName,$fileNameInfo[1]);
            return $fileNameInfo;
        }
    }

但问题仍然是用户可以用大写字母上传.PHP.png所以我试图找到是否有任何正则表达式可以处理preg_match('/.php.|.js./',$sFileName)中的thnig我想说{{ 1}}我该怎么做

2 个答案:

答案 0 :(得分:1)

如果将正则表达式修改为preg_match('/.php.|.js.|.PHP.|.JS./'),则使用大写PHP或JS的文件匹配。如果您想匹配所有字符,就像您在preg_match('/.any_string./',$sFileName)中提到的那样,正则表达式为preg_match('/。[a-zA-Z] *。/', $sFileName)。 如果要检查,如果字符串中有多个句点字符,只需使用以下代码段作为条件:

$condition = substr_count($sFileName, '.') > 1

希望它有所帮助:)

答案 1 :(得分:1)

我猜你在这里试图阻止文件上传漏洞。停止双extension upload经常被上传php文件滥用并执行它们。阻止此类攻击的正确方法是在上传目录中设置适当的权限。添加读写权限但不是执行权限。

如果您使用亚马逊s3或其他东西,这将更简单。

具体到您的用例,这是一个可以使用的示例代码

<?php
$file_name = ''; //Unsecure file with double extention
$file_explode = explode(".",$file_name);
$extention = $file_explode[sizeof($file_explode)]; // Last extention
$file_new_name = uniqid()+"."+$extention;

//Save the file using $file_new_name
//Add database entry that maps $file_name to $file_new_name
?>

这样可以防止双重扩展上传,但再次设置正确的目录权限比此方法更好。