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

标签 php security validation image-uploading

这里有新人问一个问题,简单的解决方案应该满足什么要求。

我已经尝试了一堆代码。看来我可以获取 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/

相关文章:

php - 如何在同一个 php 中将两个 Select 查询的输出合并到一个 JsonObject 中?

Oracle 10g Express - 让另一个用户查看另一个用户的表

php - 将 MySQL tinyint bool 值 (0/1) 转换为 PHP bool 值 (true/false)

php - 使用 SPL ArrayObject、ArrayIterator、RecursiveArrayIterator 而不是常规数组有什么好处?

c - 字符串变量的安全处理

python - 清理、调整和验证数据的最佳方式

jquery - 使用 Html.ValidationMessage 通过 jQuery 进行 ASP.NET MVC 客户端验证?

javascript - 验证 ExtJS CheckboxGroup 复选框

php - 从自定义自动建议自动完成创建链接

c# - 存储经过良好散列处理的密码及其散列方法是否很危险?