这里有新人问一个问题,简单的解决方案应该满足什么要求。
我已经尝试了一堆代码。看来我可以获取 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 个字段,主题、正文和文件上传。只有主题和正文需要有数据并且现在可以使用。
任何帮助将不胜感激。
谢谢
詹姆斯
最佳答案
在第一个片段中。好吧,getimagesize()
实际上返回 MIME 类型(与 Baba 所说的相反),但你不应该依赖它。完全有可能制作一开始看起来像 PNG GIF 的文件(有什么理由阻止 PNG 吗?),但在 header 之后有 <?php dangerous_code(); ?>
。另外,我不知道你想用 [$key]
做什么。我不知道它的作用,数组看起来像 $_FILES[$form_name][$file_field]
(例如 $_FILES['file_input']['tmp_size']
。没有第三个字段。除非你要上传多个文件,否则看看 Baba 所说的(这是非常hacky的功能)。接下来,PHP不会' t 有 alert()
- 你可能指的是 echo
。
在第二个片段中,我发现您做的事情不正确。点是正则表达式中的元字符,但在本例中它并不重要。无论如何,黑名单方法都是有缺陷的,因为您不知道您的服务器是否不支持 .php5
扩展名。即使没有,有人也可以通过创建文件 hack.php.fr
来滥用 Apache 中的 content negotiation (Apache 认为 .fr
是语言)。你的方法是有缺陷的 - 只需给 PNG 文件 .png
扩展名,无论原始扩展名是什么等等。
在第三个例子中,你激活了错误的变量 - 但也使用了裸字(你不应该,虽然我知道你应该有大写的常量(所以与 PHP 所说的相反,如果你有常识),它们非常慢,比普通字符串慢得多,并且如果您有 E_NOTICE
(提示:您应该),则会出现很多错误。接下来, continue
不适用于 if
条件 - 它是 for 循环条件(它也适用于 switch
(如 break
),但我想这只是为了一致性)。
至于不用上传文件,很简单。只需对 isset($_FILES['file_input_name'])
进行条件操作即可。
tl;dr - 正确学习 PHP
关于php - 验证文件上传服务器端 - 只允许使用 php 的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10301200/