验证文件上传服务器端 - 仅允许使用 PHP 的图像


validating file upload server side - allow only images with 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();
}
} 

这是另一个获取图像大小

$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个字段,主题,正文和文件上传。只有受试者和正文需要有数据,并且现在有效。

任何帮助将不胜感激。

谢谢

詹姆斯

在第一个片段中。好吧,getimagesize()实际上返回了MIME类型(与Baba所说的相反),但你不应该依赖它。完全有可能制作一开始看起来像 PNG GIF 的文件(阻止

PNG 的任何理由?),但在标题之后有<?php dangerous_code(); ?>.另外,我不知道你在用[$key]尝试什么.我不知道它的作用和数组看起来像$_FILES[$form_name][$file_field](例如$_FILES['file_input']['tmp_size'].没有第三个领域。除非您正在上传多个文件,否则请查看 Baba 所说的内容(这是非常黑客的功能)。接下来,PHP 没有alert() - 你可能的意思是echo .

在第二个片段中,我看到你做错了。点是正则表达式中的元字符,但在这种情况下,这并不重要。无论如何,黑名单方法都是有缺陷的,因为您不知道您的服务器是否不支持.php5扩展名。即使没有,有人也可以通过制作文件hack.php.fr来滥用Apache中的内容协商(Apache认为.fr是语言)。您的方法是有缺陷的 - 只需为 PNG 文件提供扩展名.png无论原始扩展名是什么等等。

在第三个示例中,您激活了错误的变量 - 但也使用了裸词(您不应该,虽然我知道您应该使用大写常量(因此与 PHP 所说的相反,如果您有常识,裸词并不是那么危险),它们非常慢,比普通字符串慢得多,如果您有E_NOTICE,会犯很多错误(提示: 你应该))。接下来,continue不适用于if条件 - 它适用于循环条件(它也适用于switch(如break),但我想这只是为了保持一致性)。

至于不必上传文件,这很容易。只是对isset($_FILES['file_input_name'])做条件。

tl;dr - 正确学习PHP

你的脚本到处都是示例

$imageinfo = getimagesize($_FILES['bf_file'][$key]['tmp_name']);

要获取临时名称,应该$_FILES['bf_file']['tmp_name'][$key]并且文件大小已经通过$_FILES['bf_file']['size'][$key]返回

你为什么不看看类似问题的细节例子

多图像上传文件数量错误

借助数组上传图像并获取错误

到目前为止,最安全的方法是防止您的网络服务器在用户可以完全上传到的文件夹中执行动态内容。那么他们上传什么就无关紧要了。

上传目录中包含php_flag engine off的 .htaccess 文件将阻止 php。无论如何,默认情况下应该禁用其他可执行内容,但您绝对应该检查。