0

我相信这个问题很常见:​​您希望允许用户将他们的文件上传到您的服务器。防止安全问题的一种常用技术是检查文件扩展名以防止可执行文件。

但这很无辜,我相信。例如,用户可以上传一个 php 文本文件,以便它可以简单地打印 phpinfo()。它不应该只是 PHP 的问题——它可以是服务器想要自动执行的任何文件。

那么有没有办法配置APACHE,以便有一个安全目录(用于存储静态上传的文件),以便该文件夹中的文件足够安全而不能执行(这意味着当用户请求此类文件时,它们会直接发送到浏览器对服务器没有任何副作用)?

4

4 回答 4

3

检查文件扩展名是一种无用的技术。考虑某人在做

ren nastyvirus.exe cutekittens.jpg

在进行上传之前。

上传最安全的方法是将它们放在站点文档根目录之外的某个位置,这样实际上就不可能指定可以直接访问它们的 URL。唯一的访问将通过您控制的脚本。

于 2012-05-08T15:26:39.650 回答
1

安全问题通常不是来自上传,而是来自托管。

托管文件时,您需要

  1. 在被监禁的域上提供服务,以便与您的主域相关的任何 cookie 或其他凭据不会泄漏到上传的 HTML/Flash/等。文件。此外,被监禁的域必须是 JavaScript 无法设置document.domain = ...为特权域的域。
  2. 检查内容并拒绝任何不属于白名单类型的内容。
  3. 规范化内容。例如,图像可用于攻击机器,因为大多数图像解码器不如浏览器的图像解码器安全。规范化内容通过用更常见、更好测试的结构替换古怪的结构来减少二进制和文本数据的攻击面。
  4. 使用您允许的适当的 mime 类型和编码标头为它提供服务——不要使用 apache 所做的抓取方法来推断 mime 类型。这是防止多语言攻击(如gifargif/JSlcamt​​uf 的 HTML/JPEG 多语言)所必需的
  5. 让内容远离你的其他东西。信不信由你,仍有人使用sudo bash他们.的 PATH,并且这种行为会启用木马。它不应该在任何人的 PATH、PYTHONPATH 等上。理想情况下,有一个具有自己的角色帐户的 apache 实例具有读取权限,并且没有其他帐户具有读取权限。如果您的主 apache 实例可以写入但不能读取这些文件,那么它可以上传它们但不能提供它们。
  6. 不要让上传者控制文件名。参见上面的木马。
于 2012-05-08T15:31:23.080 回答
1

这足以将您上传的文件保存在 htdocs 路径之外的目录中。

于 2012-05-08T15:27:20.657 回答
0

一开始可能是个坏主意——因为他们可以上传诸如 Javascript 之类的东西,这些东西可以从您自己的域名提供,因此能够在文档对象模型中做任何事情。

可执行病毒通常将自己命名为 kitten.jpg.exe - 由于 Windows 默认隐藏文件名的最后部分,因此它只会显示为“kitten.jpg”,人们会立即下载、单击并运行。

谷歌和雅虎花费了大量的时间和精力来做到这一点——而且他们不允许这样的事情很容易。不要这样做,尤其是不要相信任何你没有明确信任的东西。

如果你真的想这样做——盲目地允许任何人上传他们想要的任何东西而不检查仍然是一个非常糟糕的主意——那么你至少可以关闭 PHP 在 Apache 中运行

<IfModule mod_php5.c>
  php_value include_path ".:/usr/local/lib/php"
  php_admin_flag engine on
</IfModule>
于 2012-05-08T15:29:51.453 回答