Content Security Policy 与跨域脚本攻击 XSS

跨域脚本攻击 XSS 是最常见、危害最大的网页安全漏洞。XSS:Cross Site Scrit 跨站脚本攻击(为与 CSS 区别,所以在安全领域叫 XSS)。攻击原理是代码被恶意注入到页面中(例如评论),然后其他用户在访问页面时,浏览器执行了代码逻辑。


为了防止它们,要采取很多编程措施,非常麻烦。很多人提出,能不能根本上解决问题,浏览器自动禁止外部注入恶意脚本?这就是"网页安全政策"(Content Security Policy,缩写 CSP)的来历。


CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。

CSP 大大增强了网页的安全性。攻击者即使发现了漏洞,也没法注入脚本,除非还控制了一台列入了白名单的可信主机。

两种方法可以启用 CSP。

一种是通过 HTTP 头信息的Content-Security-Policy的字段。

Content-Security-Policy: script-src 'self'; object-src 'none';style-src cdn.example.org third-party.org; child-src https:


另一种是通过网页的<meta>标签。

<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">


上面代码中,CSP 做了如下配置。

  • 脚本:只信任当前域名
  • <object>标签:不信任任何URL,即不加载任何资源
  • 样式表:只信任cdn.example.org和third-party.org
  • 框架(frame):必须使用HTTPS协议加载
  • 其他资源:没有限制

启用后,不符合 CSP 的外部资源就会被阻止加载。


Node.js 中也可以使用 helment,koa-helmet: 设置Http头保障应用程序安全koa-helmet 主要是通过 npm 包 helemt 来实现开发者的应用程序更加安全。

// This...
app.use(helmet());
 
// ...is equivalent to this:
app.use(helmet.contentSecurityPolicy());
app.use(helmet.dnsPrefetchControl());
app.use(helmet.expectCt());
app.use(helmet.frameguard());
app.use(helmet.hidePoweredBy());
app.use(helmet.hsts());
app.use(helmet.ieNoOpen());
app.use(helmet.noSniff());
app.use(helmet.permittedCrossDomainPolicies());
app.use(helmet.referrerPolicy());
app.use(helmet.xssFilter());


更详细的设置在这里: https://helmetjs.github.io/docs/



参考:

http://www.ruanyifeng.com/blog/2016/09/csp.html

https://juejin.cn/post/6844903699584647175

https://www.npmjs.com/package/koa-helmet


修改时间 2021-01-23

真诚赞赏,手留余香
赞赏
随机推荐
实现图片懒加载的两种方法
高并发 php uniqid 用md5生成不重复唯一标识符方案
STS临时授权访问OSS设置
CentOS 7 中,Apache 2.4 的 mod_evasive 无法正常工作,不能屏蔽IP
HTML,CSS,font-family:中文字体的英文名称
微信小程序官方Demo登录失败,原因:PHP7.1以上版本废弃了Mcrypt
织梦DedeCMS任意位置调用自定义字段的方法
Javascript实现长按按钮触发事件的方法
JavaScript 连等赋值
MAC 升级 Nodejs 和 Npm 到最新版