显示由 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 并在页面上显示一个标记。
包含:
<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 上下文,所以上述字符应该足以防止注入(至少在那个地方,我没有到处检查!)。这意味着 <
变为 <
,>
变为 >
,'
变为 '
,"
变为 "
, &
变成 &
.
我并不是说您应该从头开始进行转换,只是大致了解需要发生什么。这是每个 Web 开发人员都应该至少阅读几次的重要资源:https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet
一般
我不确定以这种方式显示用户输入的某些文本是否安全:
来自 URL 的参数被 decodeURIComponent()
解码。之后,使用 text.replace(/\n/g, '<br/>')
.
替换换行符
生成的字符串显示在 OpenLayers 标记中。
这样,来自用户的HTML被嵌入到网页中。
具体例子
http://map.openseamap.org 允许创建永久链接(顶部菜单 > 工具 > 永久链接)
该站点如上所示解码 URL 并在页面上显示一个标记。
包含:
<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 上下文,所以上述字符应该足以防止注入(至少在那个地方,我没有到处检查!)。这意味着 <
变为 <
,>
变为 >
,'
变为 '
,"
变为 "
, &
变成 &
.
我并不是说您应该从头开始进行转换,只是大致了解需要发生什么。这是每个 Web 开发人员都应该至少阅读几次的重要资源:https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet