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

相关推荐
DEMO派4 天前
前端如何防止接口重复请求方案解析
前端·vue.js·react.js·前端框架·angular
KenkoTech6 天前
Angular进阶之十五:使用 mat-button 替换 Bootstrap button 一:实战迁移与落地
angular
KenkoTech14 天前
Angular由一个bug说起之二十三:记一次“时好时坏”的CI测试的debug过程
angular
添加shujuqudong1如果未回复1 个月前
Comsol多场耦合:解锁地质能源开采新视野
angular
询问QQ688238862 个月前
Transformer-LSTM 多变量回归预测:Matlab 实现与探索
angular
Q688238862 个月前
8位40M采样频率异步SAR ADC设计与仿真全集(SMIC18mmrf工艺)
angular
KenkoTech2 个月前
Angular由一个bug说起之二十:Table lazy load:防止重复渲染
angular
CodeCraft Studio3 个月前
前端表格工具AG Grid 34.3 发布:重磅引入AI工具包,全面支持 React 19.2!
前端·人工智能·react.js·angular·ag grid·前端表格工具·透视分析
黄毛火烧雪下3 个月前
Angular 入门项目
前端·angular