【问题标题】:If the name of the uploaded image contains .php.jpg如果上传的图片名称中包含 .php.jpg
【发布时间】:2014-02-05 13:33:42
【问题描述】:

我 preg_replace 任何东西,例如 .php.jpg.php.png.js.jpg.js.png,出于安全目的,以上传文件(图像)的名称,想知道是否有任何扩展名我应该上传完成后将文件移动到相应文件夹之前是否也考虑替换?

【问题讨论】:

  • 这个替换想要达到什么目的?
  • 排除文件上传后作为php文件运行的可能性。
  • Security threats with uploads 的可能重复项
  • 您正在使用黑名单方法处理安全问题。这永远都行不通。永远不要逐字使用上传文件的名称。
  • @deceze,你的意思是在将文件保存到某个目录时永远不要使用文件的实际名称?

标签: javascript php image upload


【解决方案1】:

仅查看文件名确实不是防止恶意代码/可执行文件被上传的安全方法。

根据您接受上传的文件类型,有更好的方法来保证它的安全。

一般来说,在您知道 100% 没有任何可疑之处之前,切勿将任何文件上传到可从网络公开访问的任何地方。

如果您允许上传图片 - 使用服务器端技术(例如 GD 或 ImageMagick)在使用之前重新保存文件。如果这些工具无法从已上传的内容中加载有效图像(捕获错误以便您知道...),请删除或隔离文件,直到您手动调查。

在任何情况下,即使扩展名被换出/替换,也不要以上传的原始文件名存储文件。

在网站上搜索上传安全以获取更详细的提示 - 这个问题确实经常出现。

【讨论】:

  • 如果我通过 chmod() 设置文件访问权限,我看不到权限有任何变化。如果我在更改之前和更改之后通过 fileperms() 回显权限模式,则值是相同的。 Ajax 响应文本包含相同的值 - 33206。这是否意味着该文件的权限没有更改,还是与我目前正在 Windows 环境中测试脚本有关?
【解决方案2】:

根据您需要对文件执行的操作,可以对文件进行加密或仅运行 gzip。在那里你可以节省服务器空间,如果有人上传脚本文件,他们就不能通过 http 请求运行。我要做的是检查是否有任何来自该文件的公共访问权限和/或设置一个 htaccess 文件。

【讨论】:

  • 如何做到这一点?
  • 对于 php 有我可以使用的 zlib,我认为对于 htaccess 文件有很多互联网上的教程
【解决方案3】:

简短的回答,是的,如果您要使用黑名单方法,您还应该考虑阻止许多其他可执行扩展,例如“phtml”、“java”、“perl”、“py”、“asp” , 'go' 并且您应该考虑 exe 和 bat 以及其他可能传播恶意软件的文件。

但是,如果您要完全阻止移动它们(或者甚至可能在进入更复杂的部分之前作为一种表单验证上传),我只会使用黑名单,而不是如果您要上传和更改移动的名字。无论您不希望服务器上有什么未知的 Java 或 Go 或 Python 等,无论它被称为什么,即使您不在 Apache 上(这使您可以将可执行扩展名放在最后一段之外的位置)。为什么允许该上传继续进行?不允许 3 级以上的名称可能更简单(您会看到人们推荐),但三层名称有很多合法用途,例如用于语言识别。然而,这种方法本身并不能保护您免受可执行代码的影响。这需要成为您使文件上传尽可能安全的一大组事情的一部分(例如,您还想检查图像文件中的嵌入代码)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-04-30
  • 2014-05-04
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 2012-09-02
  • 2013-06-21
相关资源
最近更新 更多