首页 > 解决方案 > 客户端 DOM XSS、Checkmarx 标记 JavaScript/jQuery 代码、需要清理帮助

问题描述

我有一个遗留的自定义脚本,它通过 jQuery append() 方法操作现有的 HTML。

Checkmarx 正在标记此错误消息,类似于:

应用程序的函数 XXX 在生成的输出中嵌入不受信任的数据,并在第 XXX 行附加。这种不受信任的数据直接嵌入到输出中,没有经过适当的清理或编码,使攻击者能够将恶意代码注入到输出中。

我必须更新此代码,所以我正在查看第三方 JS 库,例如 XSS ( https://www.npmjs.com/package/xss ) 或 dompurify ( https://www.npmjs.com /package/dompurify ) 使用白名单。

我的问题是这个脚本中有很多 HTML 标签是用 jQuery 操作的。table、tr、td、a、input、select等元素以及各种属性。属性列表必须包含多个 aria-xxx 标记,例如 aria-disabled、aria-owns、aria-pressed、ad nausem 才能使 jQuery UI 正常工作。

可以为 dompurify 添加钩子,我想我可以允许任何以“aria-”开头的属性。这似乎是一个丑陋的解决方案。

我只希望代码在任何 <script> 标记和其他潜在 XSS 被删除时是安全的。我可以编写自己的 sanitizer 函数,但我宁愿不重新发明轮子,如果 Checkmarx 不够彻底,它仍然可能无法通过我的新代码。有很多不同的攻击向量和变体。

是否有任何东西,例如不同的库或可以被列入白名单的通用元素列表或更好的方法来做到这一点?这里公认的做法是什么?

这是 Checkmarx 标记的部分代码。

var $clone;
switch ($context.get(0).nodeName.toLowerCase()) {
    case "table":
        if ($context.find("tbody").length == 0) {
            $clone = $entityRangeTemplate.find("tbody").clone();
            $context.append($clone);
        } else {
            $clone = $entityRangeTemplate.find("tr").clone();

            $context.find("tbody").append($clone);
        }
        break;
    case "tbody":
        $clone = $entityRangeTemplate.find("tr").clone();
        $context.append($clone);
        break;
    default:
        return;
} //switch $clone

标签: jqueryasp.netdomxsscheckmarx

解决方案


推荐阅读