显示由 decodeURIComponent 从 URL 解码的 HTML 代码是否安全?

Is it safe to display HTML code decoded by decodeURIComponent from a URL?

一般

我不确定以这种方式显示用户输入的某些文本是否安全:

来自 URL 的参数被 decodeURIComponent() 解码。之后,使用 text.replace(/\n/g, '<br/>').
替换换行符 生成的字符串显示在 OpenLayers 标记中。

这样,来自用户的HTML被嵌入到网页中。

具体例子

http://map.openseamap.org 允许创建永久链接(顶部菜单 > 工具 > 永久链接)
该站点如上所示解码 URL 并在页面上显示一个标记。

示例:
http://map.openseamap.org/map/?zoom=15&mlat=53.62053&mlon=11.46929&mtext=%3Cscript%3E%0A%20alert(%27Hello%20World!%27)%3B%0A%3C%2Fscript%3E&layers=BTFFFFFFFFF0FFFFFFFF

包含:

<script>
    alert('Hello World!');
</script>

代码嵌入到页面中,但未执行。

这种显示文字的方式会被利用吗?

您可以在此处找到该站点的代码:
http://github.com/OpenSeaMap/online_chart

解码代码在index.php第138行:
http://github.com/OpenSeaMap/online_chart/blob/master/index.php#L137

如果您有更好的解决方案,欢迎拉取请求!

Is it safe?

没有

示例:

我使用了 <IMG SRC=/ onerror="alert(document.domain)"></img>

的负载

这是永久链接(请注意,这会导致页面上出现几个警告,没有恶意,但有点烦人):http://map.openseamap.org/map/?zoom=17&mlat=53.62429&mlon=11.47198&mtext=%3CIMG%20SRC%3D%2F%20onerror%3D%22alert(document.domain)%22%3E%3C%2Fimg%3E&layers=BTFFFFFFFFF0FFFFFFFF

您的实施实际上有点额外危险,因为它混淆了负载,足以让 Chrome 的 XSS 审计员等内置浏览器工具无法检测到它。并不是说将其留给浏览器是可以接受的,但这会导致非常普遍的 XSS 漏洞。

您仍然需要转义 'dangerous' 个字符,例如 <>'"&。在我看来,此参数中的 HTML 根本不应呈现,因为其意图似乎是纯文本注释。我们在这里需要转义的上下文似乎是一个标准的 HTML 上下文,所以上述字符应该足以防止注入(至少在那个地方,我没有到处检查!)。这意味着 < 变为 &lt;> 变为 &gt;' 变为 &#039;" 变为 &quot;& 变成 &amp;.

我并不是说您应该从头开始进行转换,只是大致了解需要发生什么。这是每个 Web 开发人员都应该至少阅读几次的重要资源:https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet