如果允许用户上传的所有文件类型扩展名,则存在安全风险


Security risk if allowing all file type extensions on user uploads

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

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

信息:

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

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

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

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

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

像这样,example.com/files?filename=malicious.php

"用户将没有机会"运行"文件">

只要你100%确定这是真的,它就是安全的。 但是,请确保 Web 服务器无法执行该文件。 例如,如果用户上载.php文件,请确保服务器不执行该文件。

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

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