【发布时间】:2014-07-21 16:43:44
【问题描述】:
我在 html 页面上回显搜索到的查询时使用 htmlentities 以防止 XSS 攻击(这就是我读到的),
我在 2 个地方展示它,像这样
<?echo htmlentities($_GET['q']);?>
但这会将一些字符转换为它们的 html 等价物,例如
< becomes <
> becomes >
如何显示原来输入的值,又如何防止xss攻击。
我看到一些网站显示用户输入的确切值。他们是怎么做到的?
更新:
我正在向用户显示搜索查询。 我正在使用获取参数进行搜索查询,并且在显示它时,我正在使用 htmlentities。
但在普通浏览器中是showing &lt; instead of <
while in other sites it shows exactly < in normal browser and in source it shows &lt;
更新:
使用
$searchq = htmlentities($q, ENT_QUOTES,'UTF-8', false);
解决了这个问题,需要检查双重htmlentities被应用在哪里。
【问题讨论】:
-
您是在浏览器中查看吗?使用 HTML 实体的全部意义在于它执行那些替换——这就是 HTML 实体 。在浏览器中,这些实体(例如
&lt;)应该显示为它们对应的字符(例如<)。如果您查看这些网站的源代码,您会发现它们也在使用 HTML 实体。 -
是的,我正在浏览器中查看,那么他们是如何做到这一点的。?它在浏览器中看起来很正常,而在源代码中它显示 html 等效值。
-
对——这实际上不是他们正在做的事情。浏览器为他们做这件事。它会看到这些 HTML 实体,并知道在将它们显示给最终用户时将它们转换为相应的字符。当您在自己的网页中使用它们并在浏览器中打开该页面时,您看到的是 HTML 版本,还是您想看到的版本?你不需要做任何特别的事情。
-
我看到的是html版本,而我想看到
-
当您在页面上使用“查看源代码”时,您会看到什么?我的猜测是它看起来像
&amp;gt;,表明它已被转义(htmlentities/htmlspecialchars)两次。 (&amp;是&的转义形式)。在这种情况下,您需要追踪发生这种情况的位置,因此您只需在显示之前将其转义一次。
标签: php html xss html-entities