保存上传的文件安全吗?

时间:2015-01-29 16:40:58

标签: php file validation upload code-injection

我正在尝试使用PHP构建一个简单的图像上传器。我知道如何编码,但我有一些顾虑..

我的问题如下:保存用户发送的文件是否可以保存为原始文件?我的意思是:当我保存用户发送的文件时,我是否会收到任何漏洞?

假设我的PHP脚本执行此操作:它检索POST数据,其中包括我网站上的人发送的文件。将文件移动到具有原始名称,内容等的目录是否可以保存?这样做有什么害处,还是应该将这些文件重命名为随机字符串?

如果这不是一种安全的方法,那么它是什么?我如何验证发送内容无害?

4 个答案:

答案 0 :(得分:1)

存储和提供客户提供的内容总是存在漏洞。

此博客文章详细介绍了您可能面临的漏洞,漏洞利用方式以及如何防范这些漏洞。我建议您将此作为参考:http://blog.insicdesigns.com/2009/01/secure-file-upload-in-php-web-applications/

答案 1 :(得分:0)

确保只处理具有正确结尾的文件。图像文件永远不会被Web服务器执行,但是.php文件就是例如。因此,请确保用户不上传任何可执行的文件。

我不知道有害的文件名。对于内容,这很难回答。我记得在Windows上有一个带有修改后的TIFF图像的攻击向量,在* nix系统上有一个libjpeg中的一个。但是,您可能无法在不完全解码图像的情况下找到这些内容。

答案 2 :(得分:0)

这是另一种方法:使用这个(https://hacks.mozilla.org/2011/03/the-shortest-image-uploader-ever/)非常短的图片上传器,由Paul Rouget根据Imgur.com的API。

不要直接上传到您的数据库,而是让imgur完成所有安全性和验证,然后如果您需要,通过Imgur链接或下载(安全)图像。

对于非商业性而言是免费的,对商业而言非常便宜。

基本上,您可以使用imgur的API安全地从HTML页面上传图片,而根本没有服务器端代码

这是一个现场演示:( http://paulrouget.com/miniuploader/

答案 3 :(得分:-1)

I would say 100% user upload file are NOT 100% SAFE

除了实际的图像数据外,JPEG文件还可以包含任意数据;它是规范的一部分。因此,仅仅检查图像是否是有效的JPEG并不意味着该文件必然是完全无害的。

未经验证的文件上传

HTML Form:
<form enctype="multipart/form-data" action="uploader.php" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="100000" /> Choose a file to upload: <input name="uploadedfile" type="file" /><br /> <input type="submit" value="Upload File" /> </form>
PHP Code:
<?php
$target_path  =  "uploads/";
$target_path  =  $target_path  .  basename($_FILES['uploadedfile']['name']);
if (move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
echo "The file " . basename($_FILES['uploadedfile']['name']) . " has been uploaded";
} else {
echo "There was an error uploading the file, please try again!";
}
?>
  • 定义一个只允许访问文件的.htaccess文件 允许扩展。
  • 不要将.htaccess文件放在同一目录中 上传的文件将被存储。它应该放在父母中 目录。
  • 典型的.htaccess,只允许gif,jpg,jpeg和png文件 应包括以下内容(根据您的需要进行调整)。这将 也防止双重扩展攻击。

    deny from all <Files ~ “^w+.(gif|jpe?g|png)$”> order deny,allow allow from all </Files>

  • 如果可能,请将文件上载到服务器根目录之外的目录中。 防止覆盖现有文件(以防止.htaccess 覆盖攻击)。

创建一个已接受的mime类型列表(来自这些mime类型的地图扩展)。 生成随机文件名并添加以前生成的扩展名。 不要仅依赖客户端验证,因为它还不够。理想情况下,应该实现服务器端和客户端验证。