21

我在网上找到了一些示例,但我想从每天使用 PHP 的人那里获得关于潜在安全性或性能注意事项及其解决方案的反馈。

请注意,我只对一次上传一个文件感兴趣。

理想情况下不需要浏览器插件(Flash/Java),尽管知道使用插件的好处会很有趣。

我想知道最好的 HTML 表单代码和 PHP 处理代码。

4

4 回答 4

34

文件上传教程

HTML

<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必须出现在 type 的输入之前file。这个值很容易在客户端上被操纵,所以不应该依赖。它的主要好处是在用户上传文件之前向用户提供文件太大的早期警告。
  • 您可以使用 type 更改输入的名称file,但请确保它不包含任何空格。您还必须更新 PHP 文件(如下)中的相应值。

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可以提示正在发生的事情。例如:

    大批
    (
        [用户文件] => 数组
        (
            [名称] => 文件名.ext
            [类型] =>
            [tmp_name] =>
            [错误] => 2
            [大小] => 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 目录。tmp 目录的位置可以选择通过upload_tmp_dir.

检查文件 mimetypes

您应该检查用户上传的文件类型 - 最佳做法是根据允许的文件类型列表进行验证。允许任何文件的潜在风险是用户可能会将 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 手册中阅读有关处理文件上传的更多信息。

对于 PHP 5.3+

//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 的更多信息。

于 2008-10-13T18:07:13.140 回答
5

阅读这个介绍,它应该告诉你你需要知道的一切。用户评论也相当有用。

于 2008-10-13T17:41:34.860 回答
4

Flash 的主要好处是它允许您上传多个文件。Java 的主要好处是它允许从文件系统拖放。很抱歉没有回答中心问题,但我想我会把它扔进去,因为它相当简单。

于 2008-10-13T17:35:10.240 回答
3

安全性对于文件上传来说是一件非常重要的事情,在上传文件夹中添加一个 .htaccess 可以阻止脚本从它运行,这可以方便地添加额外的安全层。

.htaccess

Options -Indexes
Options -ExecCGI
AddHandler cgi-script .php .php3 .php4 .phtml .pl .py .jsp .asp .htm .shtml .sh .cgi 

参考:http ://www.mysql-apache-php.com/fileupload-security.htm

于 2008-10-14T03:13:56.703 回答