Dre*_*kes 21 php upload file-upload
我在网上找到了一些样本,但我想从每天使用PHP的人那里获得反馈,以了解潜在的安全性或性能考虑因素及其解决方案.
请注意,我只对一次上传单个文件感兴趣.
理想情况下,不需要浏览器插件(Flash/Java),尽管知道使用插件的好处会很有趣.
我想知道最好的HTML表单代码和PHP处理代码.
Dre*_*kes 33
<form enctype="multipart/form-data" action="action.php" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
<input name="userfile" type="file" />
<input type="submit" value="Go" />
</form>
Run Code Online (Sandbox Code Playgroud)
action.php 是将处理上传的PHP文件的名称(如下所示)MAX_FILE_SIZE必须在输入类型之前出现file.这个值很容易在客户端上操作,所以不应该依赖它.它的主要好处是在用户上传之前向用户提供文件过大的早期警告.file,但请确保它不包含任何空格.您还必须更新PHP文件中的相应值(如下所示).<?php
$uploaddir = "/www/uploads/";
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
echo '<pre>';
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 "</pre>";
?>
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
您可以在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
Run Code Online (Sandbox Code Playgroud)
您可以在PHP.net文档中阅读有关FILEINFO_MIME_TYPE的更多信息.
| 归档时间: |
|
| 查看次数: |
17627 次 |
| 最近记录: |