2

new guy here asking a question that what should be met with simple solutions.

I have tried a bunch of code. It seems I can get the file stream for getimagesize and get other things to work without crashing.

I'm dusting off an old project that needs to limit the files uploaded so that they are only image files and nothing evil.

This code always give me an error message no matter what

$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;  
}  

Here is the black list effort

$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();
}
} 

Here is another 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"); 

On each of these I get the error message no matter if a file is uploaded or not.

I just need to place these controls somewhere in my file so that if the uploaded file passes the checks then everything just passes through as the uploader and everything else works like it should but without the benefit of these limiters and checks.

Also, the user should not be required to upload file. There are 3 fields, subject, body and file upload. Only subject and body are required to have data and that works right now.

Any help will be greatly appreciated.

Thanks,

James

4

3 回答 3

1

在第一个片段中。好吧,getimagesize()实际上返回 MIME 类型(与 Baba 所说的相反),但您不应该依赖它。完全有可能制作一开始看起来像的文件PNGGIF(有什么理由阻止 PNG?),但在标题之后有<?php dangerous_code(); ?>. 另外,我不知道你在尝试什么[$key]。我不知道它的作用和数组是什么样$_FILES[$form_name][$file_field]的(例如$_FILES['file_input']['tmp_size']。没有第三个字段。除非您正在上传多个文件,否则请查看 Baba 所说的内容(这是非常 hacky 的功能)。接下来,PHP 没有alert()- 你可能是说echo

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

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

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

tl;dr - 正确学习 PHP

于 2012-04-24T16:08:31.577 回答
1

您的脚本到处都是示例

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

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

您为什么不看一下类似问题的详细信息示例

文件上传时多张图片上传数量错误

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

于 2012-04-24T15:47:25.700 回答
0

到目前为止,最安全的方法是阻止您的网络服务器在用户可以完全上传到的文件夹中执行动态内容。然后,他们上传什么都没关系。

上传目录中包含的 .htaccess 文件php_flag engine off将阻止 php.ini 文件。无论如何,其他可执行的东西应该默认被禁用,但你一定要检查。

于 2012-04-24T16:42:22.837 回答