【问题标题】:XSS- Cross-Site Scripting: DOM issueXSS- 跨站点脚本:DOM 问题
【发布时间】:2014-05-07 04:27:31
【问题描述】:

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 header.ajaxstatus="加载" } }

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

【问题讨论】:

    标签: dom xss fortify


    【解决方案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 清理恶意标签和白名单,你可以做黑名单,但黑名单并不安全,因为总有标签你可能会忘记检查。

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

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

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

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

    【讨论】:

    • 感谢您提供的信息。这很有帮助。