代码之家  ›  专栏  ›  技术社区  ›  Mads Mobæk

安全的PHP文件上传

  •  0
  • Mads Mobæk  · 技术社区  · 16 年前

    我正在尝试在我们的新网站上开发一个文件上传模块,允许您上传 任何 文件到我们的服务器。上载的文件将上载到 /files

    <Files *.*>
    ForceType applicaton/octet-stream
    </Files>
    

    这会触发浏览器下载窗口(至少在FF和Safari中是这样),但是否可以安全地假设该文件不会使用此方法在服务器上运行?如果没有,您将如何实施这样的解决方案?

    6 回复  |  直到 6 年前
        1
  •  3
  •   Paolo Bergantino    16 年前

    我认为最安全的做法是限制对目录的100%web访问,并使用类似的脚本 download.php 通过它,您可以传递一个文件id,然后获取相应的文件并将其输出到浏览器。然而,我非常确信你所拥有的一切都会起作用并且是安全的。

        2
  •  2
  •   Community CDub    7 年前

    使用此方法假定文件不会在服务器上运行是否安全?

    有点,但这取决于配置中有哪些其他指令;也许还有其他规则允许PHP文件运行。如果启用PHP的唯一方法是在文件类型上键入PHP处理程序,那么应该停止PHP的执行。

    然而,停止PHP执行只是您担心的问题之一。如果人们上传包含活动内容的文件,例如HTML或Flash,即使文件类型说它是一个无辜的图像,他们也可以通过跨站点脚本(XSS)控制其他用户在您站点上的会话。看见 Stop people uploading malicious PHP files via forms 关于这方面的一些讨论。

    使用Content Disposition始终触发下载框的download.php接口,再加上将文件存储在非用户提供的文件名(如1234.dat)下,更安全。

        3
  •  1
  •   David Z    16 年前

    我想你真的想要这个:

    <Directory /path/to/files>
        SetHandler default-handler
    </Directory>
    

    您所拥有的可能在实践中起作用,因为默认情况下,服务器配置为不执行任何操作,除非明确要求这样做,但它并不能真正保证不会执行任何操作。 ForceType

        4
  •  1
  •   user79701 user79701    16 年前

    HTTP_Download 模块提供文件服务。

        5
  •  0
  •   St. John Johnson    16 年前

    我同意保罗的观点,他的方式更安全。总有人利用你的PHP文件执行上传的文件的问题。坏例子:

    include_once("/modules/".$_GET["module"].".php");
    

    module=../Files/exploit

        6
  •  0
  •   eliego    16 年前

    为了获得最大的安全性,您需要将包含上载文件的文件夹从一个单独的分区装入,并带有no exec标志。