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

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

本文关键字:解码 HTML 代码 是否 安全 URIComponent URL 显示      更新时间:2023-09-26

General

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

来自 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

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

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

安全吗?

不。

例:

我使用的有效载荷为 <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 漏洞。

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

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