0

Fortify 扫描将此以下错误视为严重错误。有人可以帮忙吗?

switchcontent.loadpage=function(page_request, header){ var innercontent=document.getElementById(header.id.replace("-title", "")) //引用这个header的内容容器 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 标头。 ajaxstatus="加载" } }

修复此代码以避免 XSS 需要进行哪些更改?任何帮助是极大的赞赏。谢谢你。

4

1 回答 1

1

在 responseText 中是否插入了 HTML 标记,或者只是您想要插入/更改的文本?一个经验法则总是清理/编码从用户输入生成的所有用户输入和输出。如果它只是您要插入的文本,请使用document.createTextNode示例)并将文本附加到需要的元素(也总是编码),我会建议使用 jQuery .text() 与纯 javascript 一样,这有点麻烦。如果需要插入的是 HTML,请确保它不是用户输入,因为这是一个漏洞。例如,如果文本需要来自用户,请使用白名单检查用户是否只编写您期望的标签<p></p>

Fortify 将此视为漏洞,因为如果用户在 responseText<script>alert('XSS')</script>中发送,页面会将其呈现为 HTML,如果您对其进行编码,脚本将被执行,它只会显示为文本而不被执行,不仅可以执行脚本,而且可以执行 HTML也将被渲染并使您的页面变形。您可以阅读更多内容:OWASP DOM 预防表

要点:

1:始终编码用户输入!

2:如果它只是文本,则创建文本节点并将它们附加到元素以使其更容易使用 jQuery 如果可能的函数,.text()而不是函数将呈现 HTML。.html().htlm()

3:如果它是用户生成的 HTML 清理恶意标签和白名单,你可以做黑名单,但黑名单不是那么安全,因为总有标签你可能会忘记检查。

4:如果 HTML 是服务器生成的并且没有用户输入,你应该没问题。

5:要知道 Fortify 只是一个扫描工具,它有误报,所以如果你有正确的对策,你应该是 XSS 免费的。

白名单:再次检查可用标签列表。只允许您知道用户可以使用的标签 like <p></p><br/>

黑名单:检查“不受欢迎”标签列表。这意味着拥有一个包含您不想让用户使用的标签的列表。

于 2014-03-27T23:38:02.523 回答