7

我有一个简单的网页,它接受查询项并将它们制作到页面中。示例网址:

http://quir.li/player.html?media=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D0VqTwnAuHws

然后页面会在页面某处显示 URL:

<span id="sourceUrlDisplay">http://www.youtube.com/watch?v=0VqTwnAuHws</span>

我觉得这会使页面容易受到 XSS 的攻击,以防页面加载包含类似于以下内容的 URL

http://quir.li/player.html?media=<script>alert('test')</script>

我发现,将 URL 呈现为<pre>标签并没有帮助。有没有一个简单的解决方案,比如一个 HTML 标签,它的内容真的没有被解释而只是打印出来?

注意:这个问题与这个问题有些相似,但更笼统。

4

3 回答 3

11

不,HTML 中没有这样的标签可以防止 XSS 攻击,而且不可能制作一个。让我们假设有这样一个标签,比如说,<safe>。攻击者只需要关闭它:</safe><script> malicious code </script><safe>.

在这种特定情况下停止 XSS 的方法是将特殊字符转义为对应的 URL 编码,这样http://quir.li/player.html?media=<script>alert('test')</script>就变成 http://quir.li/player.html?media=%3Cscript%3Ealert('test')%3C%2Fscript%3E.

于 2013-01-04T13:45:09.453 回答
1

您应该转义 HTML 的特殊字符以删除它们的特殊含义。例如,在 PHP 中,htmlspecialchars()函数旨在用于这种转义。

于 2013-01-04T13:44:37.617 回答
0

我认为值得一提的是,实际上有 2 个(已弃用)HTML 标签可以完全满足您的需求:<xmp><listing>. 这些标签中的任何 HTML 在大多数浏览器中都将显示为文本。

这里的关键词是:大多数。自 HTML 3.2 以来,这些标签已被弃用,虽然 Chrome 和 Firefox(可能还有更多浏览器)似乎仍支持它,但谁知道它们何时会被完全删除。最重要的是,某些浏览器可能错误地实现了它并非不可能。

最后,您最好还是像其他答案所说的那样转义 HTML。

于 2021-05-26T18:07:52.123 回答