通过php上传文件时的安全措施

时间:2011-09-16 20:30:22

标签: php security file-upload

我有一个文件上传脚本,可供公众使用(例如,不是封闭的工作环境),我对安全性感到担忧: 我想允许上传任何文件,每个文件都会上传到它自己的独特目录,显然,我无法控制人们上传恶意文件,但处理这些文件的最佳方法是什么?

我想到了:

完全删除扩展名,并且仅在提供要下载的文件时,将其原始扩展名返回给他们(因为所有文件名和位置都将保存在db中)

创建“safezone”以禁止在目录中运行多个扩展名。

禁止上传“不安全”的扩展程序。

当然问题是: 有太多“不安全”的文件扩展名来统计它们。 虽然它包含一些代码,但是可以将文件屏蔽为“安全”。 以及许多其他安全风险......

所以...有什么建议吗?

5 个答案:

答案 0 :(得分:4)

为了安全起见:

  1. 限制文件大小
  2. 不要使用任何用户提供的数据存储文件作为文件名的一部分。通过数据库跟踪上载并使用其关联记录的主键
  3. 存储文件
  4. 不要将文件放在可通过Web访问的目录中 - 仅允许通过脚本访问。然后,此脚本可以在下载标题中填写原始文件名。
  5. 无论您在何处存储文件,都应使用非执行权限存储它们。这意味着Unix-ish系统最多0640,Windows系统等效。
  6. 限制上传以防止用户使用夏季大片的最新蓝光片段来填充您的系统。节流下载,以防止您的网站成为下一个避难所。
  7. 尽可能多地跟踪您的用户数据:至少浏览器ID及其IP地址。更好的是,在将它们放在网站的文件处理部分附近之前,需要某种形式的身份验证/登录。

答案 1 :(得分:3)

如果您所做的只是作为文件存储,那么您在乎什么?你没有以任何方式执行文件或查看文件,是吗?

文件扩展名与文件的安全程度无关。

编辑:您真正要做的是将文件名与完整路径的校验和一起存储在数据库中。然后你的脚本将传递那个校验和,然后在你的数据库中查找,然后你会以某种方式返回文件。不要使用您的网络服务器来提供文件,否则(正如您在下面的评论中所说)您可能会意外地执行上传的PHP文件。

答案 2 :(得分:2)

只需将它们上传到文档根目录之外,并在需要时使用php文件提供它们

答案 3 :(得分:2)

要防止服务器端执行,请不要将它们放入Web可访问文件夹,而是使用脚本来处理发送文件。

即:

<?php

// TODO: acl related stuff
// TODO: Map request to file name
// Send the file as an attachment
header('Content-type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $givenFileName . '"');
readfile($realFileName);

答案 4 :(得分:1)

我认为您可以使用这种方式使其安全

1-不要将文件作为其名称上传(意味着您应该使用md5(rand().time().rand()) ;更改文件名称

2-在字典中添加空白页面以进行上传,你可以添加.htaccess来拒绝所有你可以使用的阅读

要显示或下载图片的文件

3-如果允许使用 - >您可以使用php中的rename()将字典重命名为其他名称

4-检查上传大小,并使用@include();

隐藏所有路径

5- as @periklis说如果您可以将文件保存在文档根目录之外,这将有助于:)

6-在strtolower文件扩展后拒绝此扩展.php , .asp .pl .py .rb .htaccess