Angular安全专辑之二——‘unsafe-eval’不是以下内容安全策略中允许的脚本源

一:错误出现

这个错误的意思是,拒绝将字符串评估为 JavaScript,因为'unsafe-eval'不是以下内容安全策略中允许的脚本源。

二:错误场景

javascript 复制代码
testEval() {
    const data = eval("var sum2 = new Function('a', 'b', 'return a + b'); sum2('email', 'eval');");
    const sum = new Function('a', 'b', 'return a + b');
    console.log('test eval:', data);
  }

类似的不安全的表达式还有:

  1. eval()
  2. Function() ------When passing a string literal like to methods like: setTimeout("alert(\"Hello World!\");", 500);
  3. setTimeout()
  4. setInterval()
  5. window.setImmediate
  6. window.execScript() (IE < 11 only)

三,错误原因

因为我的安全策略(CSP)白名单中并不包含'unsafe-eval'这个选项。所以抛出了异常。

不包含'unsafe-eval'的理由是eval 实际上是不安全的。 它在每种语言中的意思是"获取这个字符串并执行它的代码"。 也就是说eval本质是将字符串转成表达式并执行。容易遭到注入攻击。

四,错误解决

1 尽量避免使用eval方法,大多数情况下,eval方法是可以被避免的。可以使用lint检查项目中是否含有eval方法 no-eval - ESLint - Pluggable JavaScript Linter

上述的代码可以这样更改,代码正常工作

javascript 复制代码
testEval(): string {
    const sum1: Function = (a: string, b: string) => { return a + b };
    return sum1('test', 'eval');
  }

2 **:**如果有时候,必须动态生成方法,这部分工作可以放到服务端完成。而不是把'unsafe-eval'加入到CSP白名单中。

上述代码还可以这样更改,代码正常工作

javascript 复制代码
testEvalSolutionTwo(): Observable<Object> {
    return this.http.get(this.rootURL + '/test/eval');
  }

五,CSP 的配置补充

CSP可以在三个地方配置

1:拦截器

javascript 复制代码
import { requestInterceptor } from './http/request.intercepter';
@NgModule({
  .. .. ..
  providers: [
    {
      provide: HTTP_INTERCEPTORS,
      useClass: requestInterceptor,
      multi: true
    }
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }


import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpHandler, HttpRequest, HttpEvent } from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable()
export class requestInterceptor implements HttpInterceptor {
    constructor() {}

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
      req.headers.append('Content-security-policy', `script-src 'self';`);
      return next.handle(req);
    }
}

2:html文件

html 复制代码
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; child-src 'none';">

3:server端(推荐)

javascript 复制代码
app.use(function (req, res, next) {
  res.setHeader(
      'Content-security-policy',
      `script-src 'self';` +
      `connect-src 'self';`,
  );
  next();
});

CSP文档参见:CSP: script-src - HTTP | MDN

相关推荐
无敌喜之郎3 天前
Angular数据绑定详解
前端·javascript·angular·数据绑定
无敌喜之郎4 天前
虚拟滚动 - 从基本实现到 Angular CDK
前端·typescript·angular·虚拟滚动
金木讲编程5 天前
Angular 中 UntypedFormGroup和FormGroup的区别?
angular
无敌喜之郎10 天前
Angular 15 独立组件详解
前端·javascript·angular·独立组件
无敌喜之郎14 天前
Angular 控制流与延迟视图揭秘
typescript·angular·1024程序员节
余生H19 天前
JS异步编程进阶(二):rxjs与Vue、React、Angular框架集成及跨框架状态管理实现原理
javascript·vue.js·react.js·angular·rxjs·异步编程
职教育人22 天前
前端三大框架对比与选择
前端·vue.js·react·angular
优联前端23 天前
前端框架对比和选择
前端框架·vue·react·angular·优联前端
无敌喜之郎23 天前
Angular signal信号详细解析
前端·typescript·angular·signal
zqwang88823 天前
Angular 实现 keep-alive (路由复用)
前端·angular·angular.js