【发布时间】:2012-04-24 15:34:27
【问题描述】:
这里的新人提出了一个问题,即应该用简单的解决方案来解决什么问题。
我已经尝试了一堆代码。看来我可以获取 getimagesize 的文件流并让其他事情正常工作而不会崩溃。
我正在清理一个旧项目,该项目需要限制上传的文件,以便它们只是图像文件而不是邪恶的。
无论如何,这段代码总是给我一个错误信息
$imageinfo = getimagesize($_FILES['bf_file'][$key]['tmp_name']);
if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg') {
alert ("Sorry, we only accept GIF and JPEG images");
exit;
}
这是黑名单工作
$blacklist = array(".php", ".phtml", ".php3", ".php4", ".js", ".shtml", ".pl" ,".py"
,".txt", ".doc");
foreach ($blacklist as $file)
{
if(preg_match("/$file\$/i", $_FILES['bf_file'][$key]['tmp_name']))
{
alert "ERROR: Uploading executable files Not Allowed\n";
exit();
}
}
这是另一个getimagesize
$size = getimagesize($_FILES[bf_file][$key][tmp_name]);
$fp = fopen($_FILES[bf_file][$key][tmp_name], "rb");
if ($size && $fp) {
header("Content-type: {$size['mime']}");
fpassthru($fp);
continue;
} else
// error
alert("Inappropriate file type");
无论文件是否上传,我都会收到错误消息。
我只需要将这些控件放在我的文件中的某个位置,这样如果上传的文件通过了检查,那么所有内容都只是作为上传者通过,其他所有内容都可以正常工作,但没有这些限制器和检查的好处。
此外,不应要求用户上传文件。有3个字段,主题,正文和文件上传。只有主体和主体需要拥有数据,并且现在有效。
任何帮助将不胜感激。
谢谢,
詹姆斯
【问题讨论】:
-
$key的值是多少?不管它包含什么,由于很久以前某些 PHP 作者的一些 premium 愚蠢,您需要引用$_FILES['bf_file']['tmp_name'][$key]而不是$_FILES['bf_file'][$key]['tmp_name']。另请注意,getimagesize()是唯一明智的做法,我什至无法在评论给我的少量空间中开始解释您的黑名单方法有什么问题。 -
这是一个:您的 preg_match 不是多行的,因此容易受到空格攻击。使用白名单而不是黑名单的一千个理由之一。此外,您确实需要从图像画布中复制像素数据,如果您只是按原样保存文件,那么您很容易受到恶意用户上传包含嵌入式服务器端脚本的图像文件的攻击。
-
@Cheekysoft,还有
index.php5(可能存在)和index.php.fr(content negotiation)
标签: php security validation image-uploading