新人在这里问一个问题,应该遇到什么简单的解决方案。验证文件上传服务器端 - 只允许图像与php
我试了一堆代码。看起来我可以获取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作者的某些*高级*愚蠢,您需要引用'$ _FILES ['bf_file'] ['tmp_name'] [$ key]'而不是$ _FILES ['bf_file'] [$ key] ['tmp_name']'。另外请注意,'getimagesize()'是唯一明智的方法,我甚至无法在评论给我的少量空间中解释你的黑名单方法是错误的。 – DaveRandom 2012-04-24 15:39:07
这里有一个:你的preg_match不是多行的,所以很容易受到空白的攻击。使用白名单的原因之一,而不是黑名单。另外,您确实需要从图像画布中复制像素数据,但如果您仅保存文件,则容易受到恶意用户上载包含嵌入式服务器端脚本的图像文件的影响。 – Cheekysoft 2012-04-24 16:10:29
@Cheekysoft,还有'index.php5'(它可能存在)和'index.php.fr'([content negotiation](http://httpd.apache.org/docs/current/content-negotiation.html) ) – xfix 2012-04-24 16:14:43