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

时间:2012-05-08 00:52:32

标签: php security codeigniter file-upload

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

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

的信息:

  • 用户只能重新下载同一个文件
  • 用户无法“运行”文件
  • 他们只能将其下载回自己。
  • 没有其他用户可以访问其他用户文件
  • 对说(例如2mb)
  • 会有一个尺寸限制

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:3)

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

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

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