我在网上找到了一些样例,但我想从每天使用PHP的人那里得到反馈,以了解可能存在的安全或性能问题及其解决方案。
请注意,我只对一次上传一个文件感兴趣。
最好不需要浏览器插件(Flash / Java),尽管了解使用插件的好处是很有意思的。
我想了解最佳的HTML表单代码和PHP处理代码。
我在网上找到了一些样例,但我想从每天使用PHP的人那里得到反馈,以了解可能存在的安全或性能问题及其解决方案。
请注意,我只对一次上传一个文件感兴趣。
最好不需要浏览器插件(Flash / Java),尽管了解使用插件的好处是很有意思的。
我想了解最佳的HTML表单代码和PHP处理代码。
<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>
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>";
?>
上传文件夹不应该位于可以通过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时,更改此文件需要重新启动。
允许的最大内存值(通过memory_limit
设置)在此处没有作用,因为文件在上传时将被写入tmp目录。可以通过upload_tmp_dir
可选地控制tmp目录的位置。
应该检查用户正在上传的文件类型 - 最佳实践是针对允许的文件类型列表进行验证。允许任何文件的潜在风险是用户可能会将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的更多信息。
Flash的主要优点在于它允许你上传多个文件。而Java的主要优点则是它允许从文件系统中进行拖放操作。很抱歉我没有回答中心问题,但我认为这非常简单。
Options -Indexes
Options -ExecCGI
AddHandler cgi-script .php .php3 .php4 .phtml .pl .py .jsp .asp .htm .shtml .sh .cgi
这篇文章主要介绍了如何确保文件上传的安全性,包括限制文件类型、大小和使用合适的文件命名等。此外,还需要对上传的文件进行验证,并避免直接在服务器上执行上传的文件。通过采取这些措施,可以有效地提高文件上传的安全性,防止恶意攻击。