【问题标题】:Is allow_url_fopen safe? [duplicate]allow_url_fopen 安全吗? [复制]
【发布时间】:2014-07-25 19:37:11
【问题描述】:

我目前正在使用file_get_contents() 来获取网页的标题(给定 URL)。在 wamp 上,这工作得很好。然而,当我将它转移到我的网络服务器时,我遇到了一个问题,导致我找到了this 的答案。 (即设置allow_url_fopen1)。

设置此选项是否存在重大安全风险?如果是,是否有其他方法可以从 URL 本身获取网页标题?

(另外,不确定这个标签,所以请随意添加/删除如果合适的话!)

编辑(1):进一步的研究将我引向this 问题,它几乎说这也是一种风险,如果应用程序不需要它,请禁用它。不幸的是,这并没有充分说明所涉及的风险。

编辑 (2) :快速说明,我将在 用户输入(URL)中使用此功能,而不是在内部使用,这就是为什么我要确保绝对不涉及安全风险

【问题讨论】:

  • 对于您的编辑 1:这里没有关于 SO 的答案可以告诉您应用程序或代码中涉及的风险,因为只有您才能说出实际的风险是什么。对于您的编辑 2:您永远无法确保绝对不涉及安全风险。但是,您可以查看您的程序,然后确保正在使用的值包含您所期望的信息。这应该可以确保应用程序按预期工作。

标签: php file-get-contents


【解决方案1】:

allow_url_fopen 很好。如果您需要该功能,请启用它。有更好的工具可以从远程 URL 加载数据(例如 curl 扩展),但对于一些简单的用例来说已经足够了。

它的近亲allow_url_include,是安全的。它允许像 include()require() 这样的函数从远程 URL 加载和运行代码,这是一个非常糟糕的主意。让那个关闭。

在过去,allow_url_include 并不总是作为一个独特的选项存在,因此有必要关闭 allow_url_fopen 以防止编写不当的脚本包含来自远程 URL 的数据。不过,情况已不再如此。

【讨论】:

  • 请记住,allow_url_include 可以使用allow_url_fopen 和eval 关键字来模拟。尽管如此,我认为仅将用户限制在本地计算机上几乎是不可能的。有很多方法可以访问互联网,例如 curl 和 stream 函数。
  • @TheWavelength:当然。但是eval(file_get_contents($user_input)) 至少是你不太可能偶然写出的东西。 :)
  • 如果您想使用 curl 作为 file_get_contents 的 HTTP 包装器,您需要结束该设置。也可以看看:php.net/manual/en/context.curl.php - 仅供参考,因为我看到这最近被忽视了,并且卷曲扩展被认为根本不附带包装器。
  • 我想听听为什么 allow_url_fopen 很好,如果整个问题在 2016 年发生变化?
  • @Vaia 还可以。自从我写这篇文章以来,一切都没有真正改变。
【解决方案2】:

这只是您可能希望将 allow_url_fopen 设置为 0 的原因之一

假设您允许用户输入一个 url,并且您让您的服务器获取该 url。

您可能会编写如下代码:- 您不应该编写此代码 -

echo file_get_contents($_POST['url']);

问题是这里存在安全问题。有人可以传递文件路径而不是 url 并可以访问您服务器的文件。

例如,有人可能将/etc/passwd 作为网址传递,并能够查看其内容。

现在,如果 allow_url_fopen 设置为 0,您将不会使用 file_get_contents 来获取 URL,而是使用 CURL。

【讨论】:

  • 啊,那个例子说的很清楚了,谢谢!
  • 你真的应该强调你写的代码应该被使用。人们倾向于复制/粘贴。我见过这种级别的漏洞利用软件,它来自不称职的开发人员。
  • Curl 没有面临与file_get_contents 相同的安全威胁?
  • 好的,在我的帖子中添加了一些重点。而Curl没有这个问题。
  • 经验法则通常是,如果您从外部 URL(使用 libcurl 或任何其他方法)获取数据,则应将其视为不受信任的输入。如果您牢记这一点,获取外部数据可能是非常安全的;这完全取决于您允许在服务器环境中使用数据的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多