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

时间:2015-10-17 08:56:03

标签: javascript html security xss openlayers

一般

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

来自网址的参数由decodeURIComponent()解码。然后,使用text.replace(/\n/g, '<br/>')替换换行符 结果字符串显示在OpenLayers标记中。

通过这种方式,用户的HTML嵌入在网页中。

具体示例

http://map.openseamap.org允许创建永久链接(顶级菜单&gt;工具&gt;永久链接)
该站点如上所示对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

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

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

1 个答案:

答案 0 :(得分:4)

  

安全吗?

实施例

我使用了<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