即使在添加'unsafe-eval'之后调用函数()也被CSP阻止

时间:2013-08-06 12:42:44

标签: node.js express content-security-policy

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

我正在使用csp阻止的外部插件FullCalendar,但却出现以下错误:

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'; object-src'un'; style-src'self''unsafe-inline img-src *; options eval-script;
  X-WebKit-CSP:default-src *; script-src'self''unsafe-eval'; object-src'un'; style-src'self''unsafe-inline img-src *;
  Content-Security-Policy:default-src *; script-src'self''unsafe-eval'; object-src'un'; style-src'self''unsafe-inline img-src *;

2 个答案:

答案 0 :(得分:1)

我在互联网上找到的最简单的方法。 在 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 等元文件。

答案 1 :(得分:0)

假设this.disp包含要评估的表达式。还disp: document.getElementById("id_of_text_input_field")。例如。 this.disp.value ='123/45 * 67 + 8-9%10'。它也会关心negative nos。例如。 “-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;
      }
   }

您可以根据自己的要求添加更多运营商个案。例如。 Square,x ^ y等