Fortify扫描发现以下错误是至关重要的。可以请一些帮忙吗?
switchcontent.loadpage = function(page_request,header){ var innercontent = document.getElementById(header.id.replace(“ - title”,“”))//此标题的引用内容容器 innercontent.innerHTML = switchcontent_ajax_msg //显示“抓取页面消息” if(page_request.readyState == 4&&(page_request.status == 200 || window.location.href.indexOf(“http”)== - 1)){ 的 innercontent.innerHTML = page_request.responseText header.ajaxstatus = “加载” } }
修复此代码以避免XSS需要进行哪些更改?任何帮助是极大的赞赏。谢谢。
答案 0 :(得分:1)
在responseText中插入了HTML标记,还是只是要插入/更改的文本?经验法则总是清理/编码从用户输入生成的所有用户输入和输出。如果它只是你要插入的文本使用document.createTextNode
(example)并将文本追加到所需的元素(也总是编码),我会建议使用jQuery .text()和纯javascript一样有点累赘。如果需要插入HTML,请确保它不是用户输入,因为这是一个漏洞。如果文本需要来自用户,请使用白名单来检查用户是否只编写了您期望的标记,例如<p></p>
。
Fortify将此视为漏洞,因为如果用户发送了responseText <script>alert('XSS')</script>
,则该页面会将其呈现为HTML,如果您对此进行编码,则会执行该脚本,它只会显示为文本而不会被执行,不仅可以执行脚本,还可以呈现HTML并使页面变形。您可以在以下网址阅读更多内容:OWASP DOM Prevention Sheet
点数:
1:始终编码用户输入!
2:如果它只是文本创建文本节点并将它们附加到元素以使这更容易使用jQuery,如果可能的话.text()
而不是.html()
,因为.htlm()
函数将呈现HTML
3:如果是用户生成的HTML再次清理恶意标签WHTELIST你可以做黑名单但黑名单不安全,因为总有标签你可能忘记检查。
4:如果HTML是服务器生成的并且没有用户输入,那么你应该没问题。
5:知道Fortify只是一个扫描工具,它有误报,所以如果你有正确的对策,你应该没有XSS。
白名单:再次检查可用标签列表。只允许您知道用户的标签可以使用<p></p><br/>
。
黑名单:检查“不受欢迎”标签列表。这意味着要有一个列表,其中包含您不想让用户使用的标签。