即使添加了“unsafe-eval”,CSP 也会阻止对 function() 的调用

Posted

技术标签:

【中文标题】即使添加了“unsafe-eval”,CSP 也会阻止对 function() 的调用【英文标题】:Call to function() blocked by CSP even after adding 'unsafe-eval' 【发布时间】:2013-08-07 11:30:04 【问题描述】:

我正在开发一个 NodeJS 项目,我正在使用 CSP (Content Security Policy)。

我正在使用一个外部插件 FullCalendar,它被 csp 阻止,并出现以下错误:

Error: call to Function() blocked by CSP

我使用script-src 'self' 'unsafe-eval'; 覆盖它,但在 Firefox 中不起作用。在其他浏览器中它工作正常。

我在这个问题上卡住了 4 小时。

得到解决方案会很有帮助。

我在 CSP 限制中使用以下格式。

X-Content-Security-Policy: default-src *; script-src 'self' 'unsafe-eval';对象源“无”; style-src 'self' 'unsafe-inline img-src *;options eval-script; X-WebKit-CSP: default-src *; script-src 'self' 'unsafe-eval';对象源“无”; style-src 'self' 'unsafe-inline img-src *; 内容安全策略:default-src *; script-src 'self' 'unsafe-eval';对象源“无”; style-src 'self' '不安全的内联 img-src *;

【问题讨论】:

你想在CSP中使用eval函数吗? 没有得到任何其他选择而不是使用所以是的,我想使用eval function.@VarunMalhotra 我将回答更合适的 eval 用法,而不是直接在 CSP 中使用 eval 已贬值或违反 CSP 规则。 好的没问题,我也试试那个.. 你使用的是什么版本的火狐?您的政策在我看来很可靠:-/ 虽然 X-Content-Security-Policy 标头中的“unsafe-eval”无效,但可能是导致问题的原因。有趣的是,对于 FF 【参考方案1】:

假设this.disp 包含要计算的表达式。还有disp: document.getElementById("id_of_text_input_field")。例如。 this.disp.value = 123/45*67+8-9%10。它还将关心negative 编号。例如。 -123+3 = -120。耶!

compute: function compute() 

  var sign = 1;
  if (this.disp.value[0] == '-') sign = -1;
  this.disp.value = this.calculate(this.disp.value,sign);
  this.update(this.disp.value.length);
  return this.disp.value;
  ,

  calculate: function calculate(input,sign)

   var opr_list =  add : '+'
           , sub : '-' 
           , div : '/'
           , mlt : '*'
           , mod : '%'
            ;

   opr_list.opr = [[ [opr_list.mlt] , [opr_list.div] , [opr_list.mod]],
            [ [opr_list.add] , [opr_list.sub] ]];

   input = input.replace(/[^0-9%^*\/()\-+.]/g,'');      

   var output,n;
   for(var i=0, n=opr_list.opr.length; i<n; i++ )

      var re = new RegExp('(\\d+\\.?\\d*)([\\'+opr_list.opr[i].join('\\')+'])(\\d+\\.?\\d*)');
      re.lastIndex = 0;                                     
            while( re.test(input) )

         output = this.compute_result(opr_list,sign*RegExp.$1,RegExp.$2,RegExp.$3);

         if (isNaN(output) || !isFinite(output)) return output; 
         input  = input.replace(re,output);
      
   

   return output;
,

   compute_result: function compute_result(opr_list,a,op,b)
      a=a*1; b=b*1;
      switch(op)
         case opr_list.add: return a+b; break;
         case opr_list.sub: return a-b; break;
         case opr_list.div: return a/b; break;
         case opr_list.mlt: return a*b; break;
         case opr_list.mod: return a%b; break;
         default: null;
      
   

您可以根据需要添加更多操作员案例。例如。方、x^y

【讨论】:

伙计,我没有使用任何eval(),我在 csp 中阻止了一个功能,它属于eval script base restriction 得到建议我们应该使用unsafe-eval &amp; unsafe-inline,但对我来说它不起作用所以问对于任何其他选择... 哦,你可以在 irc 上联系 Mozilla 开发人员。他们会帮助你走出去。 感谢您的建议 有幸联系 Firefox 开发人员解决这些问题吗?【参考方案2】:

我在 Internet 上找到的最简单的方法。 在 index.html 文件中嵌入 Meta 标签:

<meta http-equiv="Content-Security-Policy"
        content="
        default-src *
        style-src * 'unsafe-inline'
        script-src *
        img-src * data:
        'unsafe-eval'
        " />

这将允许渲染和使用来自其他来源或平台的图像、javascript、CSS 等元文件。

【讨论】:

这很危险; unsafe-eval 是 XSS 攻击的常见原因。删除 eval/Function 构造函数的使用比允许来自任何来源的 eval 要好得多。

以上是关于即使添加了“unsafe-eval”,CSP 也会阻止对 function() 的调用的主要内容,如果未能解决你的问题,请参考以下文章

如何获得符合 unsafe-eval 的 Fabric js 和 lodash js

cspj一等奖好拿吗

Rails 5:为啥即使我删除了迁移文件,rails 也会向 schema.rb 添加列

React - 即使定义了 defaultProps,TypeScript 也会将 undefined 添加到 prop

即使条件不满足,处理库 CSV 也会继续添加行

即使我在 info.plist 中添加了 NSCameraUsageDescription,SwiftUI 应用程序也会崩溃