PHP htmlentities不足以阻止黑客从表单中注入html

时间:2013-01-10 14:54:25

标签: php security html-form-post

我有一个带有文本框的表单,该文本框将数据发布到使用“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. 我如何复制它进行测试? (可以通过上述问题回答)
  3. 我做了一些研究,黑客可能会用utf-7或其他东西编写他的文本?

    我已收到几封带有相同链接的电子邮件。这个黑客显然正在测试我的网站,看看他是否可以做XSS或其他什么。

4 个答案:

答案 0 :(得分:5)

好问题!我想你可以阅读这个解释问题的link并给出一个解决方案。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

htmlspecialchars()会不会这样做? W3Schools上的article似乎表明了这一点。