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

aAX*_*XEe 4 html javascript security xss openlayers

一般的

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

来自 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>
Run Code Online (Sandbox Code Playgroud)

代码嵌入在页面中,但不会执行。

这种显示文本的方式可以被利用吗?

你可以在这里找到该站点的代码:http :
//github.com/OpenSeaMap/online_chart

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

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

Gra*_*ray 6

安全吗?

不。

例子:

我使用了有效载荷 <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