如何确保上传的文件是MS Word文档?

时间:2011-06-15 19:15:23

标签: php security file-upload mime-types

我正在考虑将上传的文档保存到webroot之外的文件夹中,并使用readfile(file)为脚本提供下载。

但是,我想知道以下内容是否足以消除可能出现的任何威胁:

$filename = basename($_FILES['uploaded_file']['name']);
$ext = substr($filename, strrpos($filename, '.') + 1);
if (($ext == "doc") && ($_FILES["uploaded_file"]["type"] == "application/msword"))
{
execute rest of the code
}

我读过使用finfo_open()推荐的人,但我的服务器是在php 5.3.0下,所以我不能使用它。我已经尝试过使用mime_content_type(),但它总是会给我发送一个“text / plain”,其中包含我发送的任何文件(我不知道我是否做错了)。

有什么我可以添加的,以使这个过程更加安全吗?

1 个答案:

答案 0 :(得分:2)

您将不可避免地遇到的一个问题是,浏览器可能会不恰当地标记文件的mime类型。例如,有一个常见的Firefox错误,可以将大多数文件标记为application / octet-stream,即使该文件确实是doc或pdf,或xls文件等。“最安全”的事情是扫描文件服务器端,其中还应包括病毒检查。但是,如果您的服务器访问受限,则可能无法执行此操作。

我过去曾使用过ClamAv(http://www.clamav.net/lang/en/)来做到这一点。

有关详细信息,请参阅http://sourceforge.net/projects/php-clamav/