javascript 如何防止DOM XSS加载 AJAX 响应到.html()

0wi1tuuw  于 2023-03-11  发布在  Java
关注(0)|答案(1)|浏览(124)

我使用 AJAX .get()方法为“Product Search”应用程序加载HTML,并将其呈现到HTML节点($searchModalBody)中:

productSearch: function productSearch(e, element) {
        var $searchModal = $('#product-search-modal');
        var $searchModalBody = $searchModal.find('.modal-body');
        var url = $searchModal.data('url');
        ...
        $.get(url, {
            fromQuote: true, customerNumber: custNumber, hasQtyField: false
        }).done(function (response) {   
            $searchModalBody.html(response);
        })

如何净化响应以避免任何DOM XSS?
我读到过.text().html()更受欢迎,但是由于我加载的是HTML,.text()将完全转义。
如果我错过了什么,我很抱歉。我一直在努力阅读XSS预防,但没有找到任何东西。我可能只是不完全明白我需要做什么/寻找什么。

q8l4jmvw

q8l4jmvw1#

您应该避免使用.html().innerHTML,因为正如您提到的那样,它们会带来安全风险。
jquery文档:
不要使用这些方法插入从不受信任的源(如URL查询参数、Cookie或表单输入)获取的字符串。这样做可能会引入跨站点脚本(XSS)漏洞。请在向文档添加内容之前删除或转义任何用户输入。
innerHTML上的MDN:
注:如果要插入的字符串可能包含潜在的恶意内容,则会存在安全风险。插入用户提供的数据时,应始终考虑改用Element.SetHTML(),以便在插入内容之前对其进行清理。
因此,使用setHTML可能更安全一些,演示:

const elm = document.querySelector('.demo');

elm.setHTML('<script>alert("XSS");</script\><h1>Oups!</h1>');
<div class="demo"></div>

此外,OWASP建议使用library
HTML清理将从变量中剥离危险的HTML并返回安全的HTML字符串。OWASP建议使用DOMPurify进行HTML清理。

let clean = DOMPurify.sanitize(dirty);

还有一些需要进一步考虑的事项:

  • 如果您对内容进行了清理,然后又进行了修改,则很容易使您的安全措施无效。
  • 如果你清理了内容,然后将其发送到库中使用,请检查它是否以某种方式改变了该字符串。否则,同样,你的安全努力是无效的。你必须定期修补DOMPurify或其他HTML清理库。
  • 浏览器更改功能和绕过被发现定期。

另请注意,有一个Sanitizer API,即not yet well supported
一个三个三个一个

相关问题