我不确定以这种方式显示用户输入的文字是否安全:
来自网址的参数由decodeURIComponent()
解码。然后,使用text.replace(/\n/g, '<br/>')
替换换行符
结果字符串显示在OpenLayers标记中。
通过这种方式,用户的HTML嵌入在网页中。
http://map.openseamap.org允许创建永久链接(顶级菜单&gt;工具&gt;永久链接)
该站点如上所示对URL进行解码,并在页面上显示标记。
包含:
<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
如果您有更好的解决方案,欢迎提出拉取请求!
答案 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上下文,所以前面提到的字符应该足以防止注入(至少在那个地方,我没有到处检查!)。这意味着<
变为<
,>
变为>
,'
变为'
,"
变为"
,并且&
变为&
。
我不是说你应该从头做转换,只是粗略地了解需要发生什么。这是一个很好的资源,每个Web开发人员应至少阅读几次:https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet