【问题标题】:PHP htmlentities not enough to stop hackers injecting html from formPHP htmlentities 不足以阻止黑客从表单中注入 html
【发布时间】:2013-01-10 14:54:24
【问题描述】:

我有一个带有文本框的表单,它可以将数据发布到一个使用“htmlentities”功能的 php 文件中,以便安全地通过电子邮件发送给网站所有者。

问题是有人设法在文本中获得了超链接,而 htmlentities() 没有删除它。

这是我的文本框 html:

<input name="usertext" type="text" />

这是我接收帖子数据的 PHP 代码(我将电子邮件代码省略了,因为这不是问题。我将其更改为仅回显接收到的数据,以便我可以尝试复制黑客所做的事情。如果我知道如何他做到了,我可以找到阻止它发生的方法):

echo trim(htmlentities($_POST["usertext"], ENT_QUOTES));

现在黑客发送了一些数据,这是结果 html(源代码 - 这意味着它在浏览器中显示了一个正常的链接):

<a target="_blank" href="mailto:nyjfvw@fbjgzy.com">nyjfvw@fbjgzy.com</a>

我认为 htmlentities() 总是会阻止任何人输入任何类型的 html。如果我输入一个超链接,例如:

<a href="aaa" />

我明白了:

&lt;a href="aaa" /&gt;

但是黑客的文本不是这样编码的。

所以我的问题是:

  1. 黑客如何输入 html 标签以使 htmlentities() 函数对它没有任何作用?
  2. 如何复制它进行测试? (可以通过上面的问题来回答)

我做了一些研究,黑客有可能将他的文本编码为 utf-7 或其他什么?

我已经收到了几封包含这些相同链接的电子邮件。这个黑客显然是在测试我的网站,看看他能不能做 XSS 什么的。

【问题讨论】:

  • 在提交时使用 $_POST["usertext"] 字段的内容记录原始请求。您还可以将编码添加到应该与内容编码匹配的 htmlentities。
  • 您是否在某处检查了包含的 JavaScript,也许它是动态创建的?
  • 在发送之前您是否正确编码了您的 html 内容?
  • 担心表单发送数据的方式的问题我认为是无关紧要的,因为黑客可以只使用程序来发布数据(例如 libcurl)。所以我只想弄清楚为什么php代码不起作用。

标签: php security forms http-post


【解决方案1】:

好问题!我认为您可以阅读此 link 来解释问题并给出解决方案。

建议的解决方案是(通过元标记)向浏览器指定页面中使用的字符集。

【讨论】:

  • 谢谢。该链接非常有趣,看起来黑客可能使用了 utf-7。唯一的问题是,当我将 utf-7 示例复制到我的文本框并提交时,浏览器只会显示确切的字符,而不会将它们转换为 html 标签。无论如何,这似乎是黑客可能会这样做的唯一方法。我将在我可以指定的地方指定 utf-8 例如。(php 代码) header('Content-Type: text/html; charset=utf-8');那可能行得通。因为我无法复制黑客所做的事情,所以在他再次尝试之前我永远不会知道它是否有效:)
【解决方案2】:

我认为strip_tags 完全符合您的需求:http://php.net/manual/en/function.strip-tags.php

【讨论】:

    【解决方案3】:

    这不是最优雅的解决方案,但在不查看其余代码的情况下,您可以检查 usertext 字段是否包含字符串“href”并拒绝它。

    【讨论】:

    • 这是一种方法,如果没有人能弄清楚黑客是如何通过 htmlentities 函数的,我会这样做
    【解决方案4】:

    htmlspecialchars() 能解决问题吗? W3Schools 上的 article 似乎暗示了这一点。

    【讨论】:

      猜你喜欢
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 2011-06-05
      • 2012-07-30
      相关资源
      最近更新 更多