.php
或.jsp
或.asp
的文件名:if (preg_match('/\.(jpeg|jpg|gif|png|bmp|jpe)$/i', $var) && preg_match('/\.(asp|jsp|php)$/i', $var) == false)
{
echo "No way you have extension .php or .jsp or .asp after this check.";
}
尽管我已经尝试了很多方法并在网络上搜索,但我仍然无法找到一个可以使这种事情成为可能的漏洞。我是否忽略了什么?如果“null字节”漏洞得到解决,还可能有什么问题呢?
注意:我绝不意味着这段代码是检查文件扩展名的完美方法,preg_match()
函数可能存在缺陷,或者文件内容可能是不同的格式,我只是就正则表达式语法本身提出问题。
编辑-实际代码:
if (isset($_FILES["image"]) && $_FILES["image"]["name"] && preg_match('/\.(jpeg|jpg|gif|png|bmp|jpe)$/i', $_FILES["image"]["name"]) && preg_match('/\.(asp|jsp|php)$/i', $_FILES["image"]["name"]) == false) {
$time = time();
$imgname = $time . "_" . $_FILES["image"]["name"];
$dest = "../uploads/images/";
if (file_exists($dest) == false) {
mkdir($dest);
}
copy($_FILES['image']['tmp_name'], $dest . $imgname);
}else{
echo "Invalid image file";
}
PHP版本:5.3.29
编辑:尾声
结果发现这个“漏洞”只出现在Windows上。无论如何,它确实做到了我的同事告诉我的那样——通过正则表达式检查并保存带有可执行文件扩展名的文件。以下是在WampServer 2.2
和PHP 5.3.13
上进行测试的:
将以下字符串传递给上面的正则表达式检查test.php:.jpg
(注意所需扩展名末尾的“:”冒号符号)将对其进行验证,并且函数copy()
似乎省略了冒号符号之后的所有内容,包括符号本身。再次强调,这只适用于Windows。在Linux上,文件将完全按照传递给函数的相同名称编写。
==
。 - Casimir et HippolyteD (PCRE_DOLLAR_ENDONLY)
。请参考 http://php.net/manual/en/reference.pcre.pattern.modifiers.php。 - Mariano