You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The Origin request header indicates where a fetch originates from. It doesn't include any path information, but only the server name. It is sent with CORS requests, as well as with POST requests. It is similar to the Referer header, but, unlike this header, it doesn't disclose the whole path.
The Referer request header contains the address of the page making the request. When following a link, this would be the url of the page containing the link. When making AJAX requests to another domain, this would be your page's url. The Referer header allows servers to identify where people are visiting them from and may use that data for analytics, logging, or optimized caching
前言
无论是
BS时代
还是CS时代
,计算机诞生之初安全问题就一直是重中之重。安全也从来都是们大课题,是你出招我接招的武功比拼。本文仅结合当前见识过的一些招数,管中窥豹地去记录一些日常。安全是体系
面向安全问题,自己问问自己:
linux
环境,那前端代码的宿主浏览器
和node
本身你又了解多少呢?XSS
的温床吗?cookie
可以根据domain
字段判断是否携带。那Same Site
、secure
和第三方cookie
又了解多少呢?XSS
、CSRF
之外,网络劫持
、非法调用
又该如何防范呢?安全是一个体系,在恶意攻击面前,每一端每一环都是至关重要。程序从前端到后端,需要把安防这套组合拳打好配合,每个环节都至关重要。
CSRF
CSRF
(Cross-Site-Request-Forgery)
,中文称之为跨站点伪造攻击
。主要流程如下受害者
在正常网站
登录,并保存登录态到cookie
中。攻击者
诱导受害者
进入事先准备好的第三方网站。攻击者
准备好的第三方网站的恶意脚本中,会向被攻击网站
发送跨站请求。被攻击网站
中留下的cookie
注册凭证,通过受攻击网站
的后端用户检验。转移资产
、查询敏感信息
等)。原理与特点
受害者
可能就不小心点击了一个恶意连接
,打开的页面一闪而过,攻击可能就完成了。各色各样的CSRF
Get请求
CSRF攻击,通常会埋藏在恶意网站中的一个图片链接中,或者给出一个超链接引诱用户点击。img
请求可以绕过浏览器同源策略限制更换用户绑定的安全手机号
。没错,利用的是你当前浏览器中cookie
中的身份token
做的身份验证。POST
类型的CSRF表单自提交
请求仍然能够轻松模拟POST
请求,并且不阻碍浏览器携带用户token
。http
协议的同学,也知道GET
与POST
在请求上其实是相同的,只是两端的读取方式上不一致罢了。CORS
类型的CSRF大家会也许好奇,为什么要把个类型拎出来?
CORS
不也是归类到POST
或者GET
吗?Response Header
中的Access-Controll-Allow-Origin
的时候,为什么不建议设置为*
的原因。*
意味着来自所有域的脚本,都可以对这个借口进行跨域访问,多增加了一层风险。防范措施
知己知彼,从上面的总结可以看出
CSRF
的特点第三方网站
,除非你的网站已经被XSS
攻击了。cookie
信息,只是借用你的cookie
而已针对
CSRF
特点,我们针对性可以做出防范:直接阻止外域访问
cookie
中的token
。添加外域获取不到的信息到请求中
CSRF-Token
方案。判断请求来源
都知道
http
请求是无状态、无连接的,每一次请求的信息都携带在了请求与相应头中,大家是否还记得Origin
和Referer
这两个Request Header
呢?Origin 与 Referer
以上分别是是
MDN
对Origin
和Referer
的描述,都可以标明当前请求的来源,而Referer
更详细。但我们更需要关心的是这二者发送与不发送的情况。POST
请求下携带CORS
请求也不会写带Origin
请求头302
重定向之后的请求中,不包含Origin
请求头IE 6
和IE 7
下,使用location.href
或者window.open
进行跳转都不携带referer
防范措施
Origin
或者Referer
属于自己的白名单中,则直接拒绝访问。简单粗暴地处理,会有以下问题:Origin
和Referer
请求头是不完全可靠,只能够借助这两个请求头进行初步防御
。搜索引擎
跳转访问页面的时候,referer
一定会是搜索引擎
的域名。会拒绝掉正常流量。XSS
攻击后,那么攻击方
就会很粗暴地成为你自己的Origin
了。使用 CSRF Token
要说读取
Origin/Referer Header
信息像是检查你的车票
,那么CSRF Token
则像是则是检查你的身份证
了。区别就在于你能够拿出一些,别人拿不出来的东西,以证明该请求的合法性。实现步骤
CSRF Token
(一般为随机字符串和时间戳的哈希),服务器存储一份,下发给客户端一份。CSRF
攻击者利用,不再使用Cookie
存储和提交CSRF Token
请求参数
中携带这个CSRF Token
beforeSend
的intercepter
中统一添加Token
的合法性,决定是否要处理此请求时间戳
是否超过有效期存在的难度
Token
是页面级别的,在大型网站中session
存储大量的CSRF Token
压力是巨大的。Redis
作为多台服务器的公共存储空间页面
为维度去处理Token
,工作量巨大。<a>
标签跳转、<form>
提交,则需要手动添加CSRF Token
验证码 与 支付密码
回想我们使用
金融类
的App时候,就算你已经登录了,在支付的时候也需要再次输入支付密码
呢?这里面的支付密码
和验证码
,其实就相当于支付
这个请求的CSRF Token
。这个方法适用于少数关键
的几个接口。简化版(反向) CSRF Token
在业务处理中去验证token的有效性极大地添加了开发工作量。那么有没有更轻便的形式完成简单的
CSRF Token
工作呢?尝试一下流程:signKey
,作为后续加密使用。signKey
和请求参数
,生成请求的signature
:path
、当前时间timestamp
、本应用的idappName
作为、签名参数signKey
作为准备参数md5
进行加密生成signature
input
(app、timestamp)与output
(signature)通过请求头传递到后端nginx
+ 本地脚本校验的形式完成前端
请求中携带的app
、timestamp
与signature
参数,结合nginx
中拦截到的请求path
,和前端一样重新计算一次signature
,并且比对结果timestamp
字段则另外再加一个防重放时间的检测signKey
两端该如何同步呢?CSRF Token
不同,这次我们反向去考虑问题app.config.ts
中配置的signKey
加入到发布脚本中ci
机器一般拥有ssh
到正式环境的权限。ci
发布流程完成后。执行特定的script
以启动服务器上更新signKey
为前端本地的值。优缺点
signKey
的更新是由前端驱动的,只有在发版的时候才会更新,实时性并不如第一种方案。nginx
层处理,可以大量减少后端同学的开发工作量。SameSite Cookie
所谓成也
Cookie
,败也Cookie
。CSRF
则是利用浏览器的这个规则漏洞建立起来的攻击方式。前面说到,安全每一个环节都有责任,那么作为前端主要运行环境的浏览器,是否也可以在Cookie
规则上进行优化呢?时间来到了
2020年秋天
,SameSite Cookie
已经被大多数浏览器所支持了,甚至于有“浏览器全面禁止第三方Cookie”
的传闻(连接),这里推荐一个小工具给大家测试自己浏览器的Same-Site Cookie
支持情况,传送门==>将
cookie
中授权token
的same-site
属性设置为Strict
则可以直接防止CSRF
的发生。发现CSRF
根据上面的总结,
CSRF
攻击,通常有以下的特点img
作为CSRF
请求时,Request Header
中的MIME Type
为图片,而想要窃取的数据返回的MIME Tpye
一般为plain/text
、json
等文本信息总结
事小
而不为。被攻击时,每一个环节都不是无辜的。CSRF
请求参考文章
[1] HTTP headers 之 host, referer, origin
[2] 浏览器的沙箱模式
[3] 前端优化 - by Alex 百度
[4] 前端安全系列(二):如何防止CSRF攻击? - 美团技术团队
[5] CSRF 漏洞的末日?关于 Cookie SameSite 那些你不得不知道的事
The text was updated successfully, but these errors were encountered: