2012-05-08 42 views
0

背景:我有一个网站,人们可以在其中存储交易。作为这项交易的一部分,他们可以附加收据,如果他们想要的话。如果允许用户上传所有文件类型扩展名,则存在安全风险

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

信息:

  • 用户将只能不断重新下载同一个文件的人
  • 将有用户“运行”文件
  • 他们将没有机会只能将其下载回自己。
  • 没有其他用户永远不会有机会到其他用户的文件
  • 将有上说大小限制(比如2MB)

更多信息:我本来要去的文件限制“pdf/doc/docx” - 但后来实现了一些人可能想要存储JPG,或.xls等 - 并意识到他们“可能”想要存储的文件列表相当大...

编辑:该文件将存储在public_html之外 - 并通过“读取文件()“函数接受文件名(而不是路径) - 那么有什么可以'挫伤'readfile()?

+1

的文件扩展名是没有意义的 - 它不会_really_告诉你有关的任何文件,特别是因为它可以由用户轻易改变。 – nickb

+0

确保你做了基本的消毒,所以用户不能像“myimage /../../../php.ini” – JoeCortopassi

回答

3

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

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

喜欢的东西,example.com/files?filename=malicious.php

+0

-1 [服务器配置](http://www.electrictoolbox.com/disable-php-apache-htaccess/)可以阻止执行'/ uploads /'中的PHP文件。简单地访问以'.php'结尾的URL **不代表任何PHP代码将被执行。 – nickb

+1

当然,服务器配置可以阻止执行。这将是防止执行的一种方法。我只是提供了一种不同的方式。还有其他方法(例如通过'.htaccess'文件) – xbonez

+1

不是每个人都可以访问服务器配置。至少在我的服务器上,我不会将这些权利授予我的开发人员。所以即使配置可以这样做,我也希望程序也可以清理数据。 – iWantSimpleLife

2

“不会有任何机会为用户‘运行’文件”

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

计算机不会自行运行程序,因此基本上只需确保用户无法欺骗服务器运行该文件。这意味着确保正确的处理程序被禁用,如果这些文件是在Web根目录下,或者如果它们不是通过代理脚本传递它们(基本上echo file_get_contents('/path/to/upload')与其他逻辑)

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

+0

这样的文件名实际上可以附加自定义扩展名(不能替换它),然后应该没有需要保留原始名称的列表。或者我错了? –

+0

@ EugeneMayevski'EldoSCorp哦哇......我应该意识到这一点。这确实是正确的。 – Corbin

相关问题