【问题标题】:Security risk if allowing all file type extensions on user uploads如果在用户上传时允许所有文件类型扩展名,则存在安全风险
【发布时间】:2012-05-08 00:52:31
【问题描述】:

背景:我有一个网站,人们可以在其中存储交易。作为交易的一部分,他们可以根据需要附上收据。

问题:如果允许用户将任何类型的文件扩展名上传到我的网站,是否存在安全风险?

信息:

  • 用户将是唯一可以重新下载相同文件的人
  • 用户将没有机会“运行”该文件
  • 他们只能将其下载回给自己。
  • 其他用户将永远无法访问其他用户的文件
  • say 会有大小限制(比如 2mb)

更多信息:我最初打算将文件限制为“pdf/doc/docx” - 但后来意识到有些人可能想要存储 jpg 或 .xls 等 - 并意识到他们“可能”想要存储的文件列表非常大......

编辑:该文件将存储在 public_html 之外 - 并通过接受文件名(不是路径)的“readfile()”函数提供服务 - 所以有什么可以“扰乱”readfile ()?

【问题讨论】:

  • 文件扩展名毫无意义 - 它真的不会告诉您有关文件的任何信息,尤其是因为用户可以轻松更改它。
  • 确保您进行了基本的清理工作,这样用户就无法使用“myimage/../../../php.ini”之类的文件名

标签: php security codeigniter file-upload


【解决方案1】:

是的,除非您采取预防措施,否则这绝对是一种安全风险。可以说,要重新下载文件,用户必须转到example.com/uploads/{filename}。用户可以上传恶意 PHP 文件,然后通过转到 example.com/uploads/malicious.php 来“重新下载”它。当然,这会导致 PHP 脚本在您的服务器上执行,从而使他有足够的能力彻底破坏一切。

为防止这种情况发生,请创建一个接收文件名作为参数的页面,然后使用正确的content-type 将该页面提供给用户。

类似example.com/files?filename=malicious.php

【讨论】:

  • -1 Server configurations 可以阻止在/uploads/ 中执行PHP文件。简单地访问一个以.php 结尾的 URL 并不意味着任何 PHP 代码都会被执行。
  • 当然服务器配置可以阻止执行。那将是阻止执行的一种方式。我只是提供了一种不同的方式。还有其他方法(例如通过.htaccess 文件)
  • 不是每个人都可以访问服务器配置。至少在我的服务器上,我没有将这种权利授予我的开发人员。所以即使配置可以这样做,我希望程序也能清理数据。
  • 另外,服务器配置有时会出错。最好同时采取这两种措施
  • 感谢 Xbonez - 我应该提到文件是通过 readfile() 从 public_html 位置之外的位置提供的 - 所以他们不能“运行” php AFAIK?我现在将编辑我的问题
【解决方案2】:

“用户将没有机会“运行”文件”

只要您 100% 确定这将成立,它就是安全的。但是,请确保该文件将无法由网络服务器执行。例如,如果用户上传一个 .php 文件,请确保服务器不执行它。

计算机本身不会神奇地运行程序,所以基本上你只需要确保用户没有能力欺骗你的服务器运行文件。这意味着如果文件位于 web 根目录下,则确保禁用正确的处理程序,或者如果文件不在则通过代理脚本传递它们(基本上 echo file_get_contents('/path/to/upload') 与其他一些逻辑)

另一种选择是将文件存储为name.upload,但这需要保留一个映射到存储名称的原始名称列表。

【讨论】:

  • 实际上可以附加自定义扩展名(而不是替换它),然后应该不需要保留原始名称列表。还是我错了?
  • @EugeneMayevski'EldoSCorp 哇哦……我应该意识到这一点。这确实是正确的。
猜你喜欢
  • 2012-08-16
  • 2016-03-30
  • 2012-01-03
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 2015-05-20
  • 2021-06-05
  • 1970-01-01
相关资源
最近更新 更多