嘿,我正在尝试验证用户是否尝试上传双扩展文件,以便我使用以下代码
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}}我该怎么做
答案 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
?>
这样可以防止双重扩展上传,但再次设置正确的目录权限比此方法更好。