使用 “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 做了如下配置。


脚本:只信任当前域名

标签:不信任任何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-12-12

声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。
随机推荐
Node.js 简介
WordPress 文章页作者信息 get_the_author() 和 get_the_author_meta()
JavaScript 数据类型和变量
JavaScript EventSource 服务器发送事件 Server-Sent Events(SSE)
JavaScript 鼠标事件
用 JavaScript 实现数字增加滚动动画
Nine 主题
JavaScript 中 0.1 加 0.2 不等于 0.3 的原因和解决方法