我在网上找到了一些样本,但我想从每天使用PHP的人那里获得反馈,以了解潜在的安全性或性能考虑因素及其解决方案.
请注意,我只对一次上传单个文件感兴趣.
理想情况下,不需要浏览器插件(Flash/Java),尽管知道使用插件的好处会很有趣.
我想知道最好的HTML表单代码和PHP处理代码.
action.php
是将处理上传的PHP文件的名称(如下所示)
MAX_FILE_SIZE
必须在输入类型之前出现file
.这个值很容易在客户端上操作,所以不应该依赖它.它的主要好处是在用户上传之前向用户提供文件过大的早期警告.
您可以使用类型更改输入的名称file
,但请确保它不包含任何空格.您还必须更新PHP文件中的相应值(如下所示).
'; if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "Success.\n"; } else { echo "Failure.\n"; } echo 'Here is some more debugging info:'; print_r($_FILES); print ""; ?>
upload-to文件夹不应该位于可通过HTTP访问的位置,否则可以上传PHP脚本并在服务器上执行它.
打印价值$_FILES
可以暗示正在发生的事情.例如:
Array ( [userfile] => Array ( [name] => Filename.ext [type] => [tmp_name] => [error] => 2 [size] => 0 ) )
此结构提供有关文件名称,MIME类型,大小和错误代码的一些信息.
0表示没有错误且文件已成功上载
1表示文件超过了php.ini中定义的最大文件大小.如果要更改最大文件大小,则需要打开php.ini文件,标识读取的行:upload_max_filesize = 2M并将值从2M(2MB)更改为您需要的值
2表示最大文件大小手动定义,在页面内已超出脚本
3表示文件仅部分上载
4表示尚未指定文件(空文件字段)
5尚未定义
6表示没有临时文件夹
7表示该文件无法写入磁盘
php.ini
组态使用较大的文件运行此设置时,您可能会收到错误.检查php.ini
文件中的这些键:
max_execution_time = 30
upload_max_filesize = 2M
适当增加这些值可能会有所帮助.使用Apache时,对此文件的更改需要重新启动.
最大内存允许值(设置为via memory_limit
)在此处不起作用,因为文件在上载时写入tmp目录.可以选择通过控制tmp目录的位置upload_tmp_dir
.
您应该检查用户上传内容的文件类型 - 最佳做法是根据允许的文件类型列表进行验证.允许任何文件的潜在风险是用户可能将PHP代码上载到服务器然后运行它.
您可以使用非常有用的fileinfo
扩展(取代旧mime_content_type
功能)来验证mime类型.
// FILEINFO_MIME set to return MIME types, will return string of info otherwise $fileinfo = new finfo(FILEINFO_MIME); $file = $fileinfo->file($_FILE['filename']); $allowed_types = array('image/jpeg', 'image/png'); if(!in_array($file, $allowed_types)) { die('Files of type' . $file . ' are not allowed to be uploaded.'); } // Continue
您可以在PHP.net手册上阅读有关处理文件上传的更多信息.
//For those who are using PHP 5.3, the code varies. $fileinfo = new finfo(FILEINFO_MIME_TYPE); $file = $fileinfo->file($_FILE['filename']['tmp_name']); $allowed_types = array('image/jpeg', 'image/png'); if(!in_array($file, $allowed_types)) { die('Files of type' . $file . ' are not allowed to be uploaded.'); } // Continue
您可以在PHP.net文档中阅读有关FILEINFO_MIME_TYPE的更多信息.
阅读本介绍,告诉您需要知道的一切.用户评论也非常有用.