设置 CSP 标头时 underscore.js 中的“new Function()”问题

信息安全 xss javascript 铬合金 内容安全策略
2021-08-29 14:12:12

在 underscore.js 中,模板渲染会导致违反 'unsafe-eval' 属性,并在以下行出现 CSP 错误:

render = new Function(settings.variable || 'obj', '_', source);

一些论坛上的解决方案是根据Chrome 文档将下划线沙盒化。

但是,该解决方案如何适用于基于 Web 的应用程序,其中有许多用户使用不同的浏览器?有没有其他解决方案可以解决这个问题?请注意,我正在处理的应用程序又大又重,因此更改代码将花费大量时间。

2个回答

html5rocks中,在 Content-Security-Policy 标头中设置随机数:

Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'

将 nonce 放在页面上的某个位置:

...
<body data-nonce="EDNnf03nceIOfn39fn3e9h3sdfa">
...

在开始在脚本中使用下划线之前,使用相关的 nonce 值调用下面的函数。

function handleFnNonceRequirement(nonce) {
    window.Function = function () {
        var renderNode = document.createElement("script"),
            len = arguments.length,
            source = arguments[len-1],
            args = [];

        if ( 1 < len ) {
            for ( var i=0; i<(len-1); i++ ) {
                args.push(arguments[i]);
            }
        }

        renderNode.text = "function __ifYouAbsolutelyMustUseIt() { return function("+args.join(", ")+") {" + source + "}}";
        renderNode.setAttribute('nonce', nonce);

        document.head.appendChild(renderNode).parentNode.removeChild(renderNode);
        return __ifYouAbsolutelyMustUseIt();
    };
}

handleFnNonceRequirement(document.getElementsByTagName("BODY")[0].getAttribute('data-nonce'));

希望有比这更好的方法。

@Sand建议的解决方案对我有用。但是,为了使整个事情更加独立,以便我可以轻松地将代码放置在多个页面中,我从script元素本身获取随机数。

<script type="text/javascript" id="noncense" nonce="...">
   function handleFnNonceRequirement(nonce) {
    .
    .
    .
   }
   handleFnNonceRequirement($("#noncense")[0].nonce);
</script>

如果这种方法有问题,请告诉我。