即使添加了“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 & 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
Rails 5:为啥即使我删除了迁移文件,rails 也会向 schema.rb 添加列
React - 即使定义了 defaultProps,TypeScript 也会将 undefined 添加到 prop
即使我在 info.plist 中添加了 NSCameraUsageDescription,SwiftUI 应用程序也会崩溃