cors能防御csrf吗?
跨域请求
跨域即cross-domain,它和同源相对,要求两个URL协议、端口号和域名都一致才能同源。
cors概念
cors是一个W3C(万维网联盟)模型,全称是Crossing-origin resource sharing(跨域资源共享),是一种允许当前域的资源(比如html/js/web_service)被其他域的脚本请求访问的机制。跨域请求分为以下两种。
一、 简单请求
二、 复杂请求
一个简单请求大致满足以下条件。
一、HTTP方法是下列之一
1、HEAD
2、GET
3、POST
二、HTTP头包含
1、Accept
2、Accept-Language
3、Content-Language
4、Last-Event-ID
5、Content-Type但只能是下列之一
1⃣️application/x-www-form-urlencoded
2⃣️multipart/form-data
3⃣️text/plain
任何一个不满足上述要求的请求,即被认为是复杂请求。
一次CORS跨域的完整流程
一、左
http 请求被发起之后,浏览器会根据是否是跨域请求(判断标准就是同源策略三要素:协 议、域名、端口),决定是否在http请求的头部添加“Origin”字段,并将发起请求的域名附加在该 字段的后面。
服务器接收到客户端的http请求后,会先尝试读取“Origin”字段,如果不存在,说明该请求不是跨域请求,直接将该请求放行,把结果返回给客户端;
如果头部存在“Origin”字段,说明该请求来自和当前服务器不同源的一个客户端,是一个跨域请求,这时先判断“Origin”字段后的域名和请求方式(request method)是否合法,如果不合法,就直接返回403错误码,如果合法,再根据上面说的原则判断该请求是简单请求还是复杂请求,如果是简单请求,就进入简单请求流程,如果是复杂请求,进入复杂请求流程。
二、中
服务端根据自己设置的CORS跨域规则,配置相应的Access-Control-Allow-Origin和Access-Control-Allow-Methods等响应头信息。
当收到客户端的请求后,服务端将验证客户端请求头中的信息是否符合设置的CORS规则,如果符合,则将请求的资源连同跨域响应头返回给客户端。客户端(浏览器)收到Response Headers后,会验证这些响应头信息,判断是否通过了跨域请求,如果通过,则返回状态码200,并成功获取到跨域资源。
如果不符合设置的CORS规则,这时则不会将配置的跨域响应头返回给客户端。客户端收到Response Headers后,验证跨域响应头信息,没有发现相应的跨域响应头,说明跨域请求不通过,将不会返回资源。返回403错误码。
三、右
一个复杂请求不仅包含通信内容的请求,同时也包含预请求(preflight request)。
浏览器发现是复杂请求的时候,并不会直接发起原请求,而是先发送Preflight requests,这是一个OPTION请求,用于询问服务器是否允许当前域名下的页面发起跨域请求。
OPTIONS请求头部中一般会包含以下头部:Origin、Access-Control-Request-Method、Access-Control-Request-Headers。
服务器收到OPTIONS请求后,设置Access-Control- Allow-Origin、Access-Control-Allow-Method、Access-Control-Allow-Headers头部与浏览器沟通来判断是否允许这个请求。如果Preflight requests验证通过,浏览器才会发送真正的跨域请求。如果Preflight requests验证失败,浏览器则不会发送真正的跨域请求。
跨站请求
跨站即cross-site,它和同站相对,对协议和端口号无要求,只要两个URL的eTLD+1(有效顶级域名二级域名)一致,就能称为同站。
CSRF
跨站请求伪造(Cross-site request forgery),也称为one-click attack或者session riding, 是一种挟制用户在当前已登陆的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS利用的是用户对指定网站的信任,CSRF利用的是网站对用户网页浏览器的信任。
简单的说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这里用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
防御措施:
检查Referer字段,HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,通常来说,Referer字段应和请求的地址位于同一域名下。
添加校验token,由于CSRF的本质在于攻击者欺骗油壶去访问自己设置的地址,所以如果要求在访问敏感数据请求时,要求用户浏览器提供不保存在cookie中,并且攻击者无法伪造的数据作为校验,那么攻击者就无法再运行CSRF攻击。这种数据通常是窗体中的一个数据项。服务器将其生成并附加在窗体中,其内容是一个伪随机数。当客户端通过窗体提交请求时,这个伪随机数也一并提交上去以供校验。正常的访问时,客户端浏览器能够正确得到并传回这个伪随机数,而通过CSRF传来的欺骗性攻击中,攻击者无从事先得知这个伪随机数的值,服务端就会因为校验token的值为空或者错误,拒绝这个可疑请求。
CSRF场景模拟
跨源
撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G
合理的创建标题,有助于目录的生成
直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC
语法后生成一个完美的目录。
如何改变文本的样式
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
插入链接与图片
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block
var foo = 'bar';
生成一个适合你的列表
- 项目
- 项目
- 项目
- 项目
- 项目1
- 项目2
- 项目3
- 计划任务
- 完成任务
创建一个表格
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
设定内容居中、居左、居右
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' | ‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" | “Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash | – is en-dash, — is em-dash |
创建一个自定义列表
-
Markdown
- Text-to- HTML conversion tool Authors
- John
- Luke
如何创建一个注脚
一个具有注脚的文本。1
注释也是必不可少的
Markdown将文本转换为 HTML。
KaTeX数学公式
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
新的甘特图功能,丰富你的文章
- 关于 甘特图 语法,参考 这儿,
UML 图表
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:
这将产生一个流程图。:
- 关于 Mermaid 语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart的流程图:
- 关于 Flowchart流程图 语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
注脚的解释 ↩︎