Web安全(CSP、SRI、XFrameOptions、HSTS)

web安全是一个很大的话题,XSS、CSRF大家都有所耳闻,这里简单记录下最近碰到的几种,别的慢慢补充吧。

X-Frame-Options MDN

看这个源自于一天要测一下某手机上iframe内嵌网页的某些兼容问题,想随便找网页塞进去试试,代码都是下面这个模子的,最最最最简单的模板。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <title>Web</title>
  </head>
  <body>
    <iframe src="https://www.zhihu.com" frameborder="0"></iframe>
  </body>
</html>
知乎
百度
新浪

发现情况不太一样,知乎的不展示,手浪的有额外报错,稍微看了下。

知乎的设置了X-Frame-Options,只允许同域SAMEORIGIN

同时可见,知乎也启用了 CSP(下面介绍),和HTTP2。

知乎

此外根据Log,注意新浪的做了一些骚操作😂

(index):1 Uncaught DOMException: Failed to set the 'href' property on 'Location': 
The current window does not have permission to 
navigate the target frame to 'https://sina.cn/'.

这里是chrome上默认阻止了,要是手机上,页面会直接重定向到手浪。想要防止这个也很简单,iframe上添加sandbox="allow-forms allow-scripts allow-same-origin"。这个又属于iframe的安全问题了,此处先不扩展了。

Content Security Policy(CSP) MDN

Content Security Policy(CSP)定义了内容安全策略,它是一种缓解web应用受到内容注入攻击(如跨站脚本攻击XSS)的机制。它是一种由作者或服务器管理员声明的策略,用于描述web应用的客户端可以加载哪些源的资源。

简单来说
CSP 通过告诉浏览器一系列规则,严格规定页面中哪些资源允许有哪些来源, 不在指定范围内的统统拒绝。相比同源策略,CSP 可以说是很严格了。

知乎,Twitter,Github等都启用了CSP。

CSP可以严格到哪个地步呢?严格到内联脚本和样式都可以不让你执行。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta http-equiv="Content-Security-Policy" content="default-src 'self';" />
    <title>CSP Test</title>
    <style>
      body {
        color: red;
      }
    </style>
  </head>
  <body>
    <script>
      window.addEventListener('load', () => {
        alert('what?!')
      });
    </script>
  </body>
</html>

上面的这个页面输出:

想要如此严格的同时,还想运行内联脚本,也是可以的。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta
      http-equiv="Content-Security-Policy"
      content="default-src 'self'; script-src 'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng=' 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'"
    />
    <title>CSP Test</title>
  </head>
  <body>
    <!-- <script src="./test.js"></script> -->
    <!-- <script>alert('Hello, world.');</script> -->
    <script nonce="EDNnf03nceIOfn39fn3e9h3sdfa">
      window.onload = function() {
        alert('What?!');
      };
    </script>
  </body>
</html>

可以给脚本加上nonce="EDNnf03nceIOfn39fn3e9h3sdfa" nonce后面是随机数,可以让后端自动生成,每次都不一样,这样来防止被注入。

当然这个也可以支持hash。下面script中的脚本,改一个字符都不可以。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta
      http-equiv="Content-Security-Policy"
      content="default-src 'self'; script-src 'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng='"
    />
    <title>CSP Test</title>
  </head>
  <body>
    <script>alert('Hello, world.');</script>
  </body>
</html>

连hash,随机数都可以支持,那么url匹配来允许指定域下的资源当然也都是可以的了。

例如 *://*.example.com:* 会匹配所有 example.com 的子域名,但不包括 example.com

同时,资源限制可以精细到img、font、style、frame等粒度,可以说是相当的牛逼了。

在此推荐一篇个人认为讲解的非常好的文章。
Content Security Policy (CSP) 介绍

CSP3策略简介

Subresource Integrity MDN

面对国内的形式,各种灰产,比如你的脚本被注入,导致打开网页就弹支付宝花呗红包之类的....
子资源完整性 Subresource Integrity 简称 SRI 是一种安全机制,它用于让浏览器检查所下载的来自第三方的资源(例如 CDN)未被恶意篡改。它使用哈希值检查确保第三方资源的完整性。只要开发者提供了被需下载资源的哈希值,浏览器就可以检查实际下载的文件是否与预期的哈希值匹配。

依靠浏览器的检测,我们可以保证内容的安全性,如果内容被篡改,会触发error事件,我们可以再这里进行一些日志收集以备分析。

收集error事件需要注意一点,需要指定script的crossorigin字段,且服务器要开启CORS允许当前域名可以获取错误信息。

可参考爝神在知乎的回答 应对流量劫持,前端能做哪些工作?

HSTS

HSTS 主要是通过服务器发送响应头的方式来控制浏览器操作:

  1. 首先在服务器响应头中添加 HSTS 响应头:
Strict-Transport-Security: max-age=expireTime [; includeSubDomains] [; preload]

此响应头只有在 https 访问返回时才生效,其中[ ]中的参数表示可选;

  1. 设置 max-age 参数,时间设置不宜过长,建议设置时间为 6 个月;
  2. 当用户下次使用 HTTP 访问,客户端就会进行内部跳转,并且能够看到 307 Redirect Internel 的响应码;
  3. 网站服务器变成了 HTTPS 访问源服务器。

开启 HSTS 后网站可以有效防范中间人的攻击,同时也会省去网站 301/302 跳转花费的时间,大大提升安全系数和用户体验。

可参考:
Web 应用安全性: 使用这些 HTTP 头保护 Web 应用

SSRF(Server-Side Request Forgery:服务器端请求伪造)

简单来说,允许用户输入URL,服务器去发起请求。这个可能会暴露内网资源。

RCE(remote command/code execute: 远程命令/代码执行漏洞)

eval(xxxx)

可以通过AST Node类型识别,干掉不安全的代码执行。

任意文件读取/下载

前端输入路径,后端用 path拼接
可能会拼出 ../../../../的路径

End

先记这么多 Web安全是一个很大的话题,以后有空了可以来补充。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,333评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,812评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,016评论 0 246
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,293评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,650评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,788评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,003评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,741评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,462评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,681评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,168评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,528评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,169评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,119评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,902评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,846评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,719评论 2 274

推荐阅读更多精彩内容