什么是CSRF?面试
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,一般缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS很是不一样,XSS利用站点内的信任用户,而CSRF则经过假装成受信任用户的请求来利用受信任的网站。数据库
CSRF攻击的本质缘由:api
CSRF攻击是源于Web的隐式身份验证机制!Web的身份验证机制大体就是说为了防止用户每次发送请求的时候都须要登陆,在进行一次登陆验证经过后,以后发向该域名的请求都会自动带上cookie。虽然能够保证一个请求是来自于某个用户的浏览器,但却没法保证该请求是用户批准发送的。CSRF攻击的通常是由服务端解决,而XSS主要是由客户端解决。跨域
CSRF攻击的原理:浏览器
1. 用户打开浏览器,访问受信任网站A,输入用户名和密码请求登陆网站A。安全
2.在用户信息经过验证后,网站A产生Cookie信息并返回给浏览器。服务器
3. 用户在未退出网站A以前,在同一浏览器中,打开一个TAB页访问网站B。cookie
4. 网站B接收到用户请求后,发出一个访问网站A的请求。session
5. 浏览器根据网站B的请求,在用户不知情的状况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求实际上是由B发起的,因此会根据用户的Cookie信息处理该请求,达到模拟用户操做的目的。dom
tips:Session Cookie(在浏览器关闭后,就会失效,保存到内存)
Third-party Cookie(关闭浏览器后,不会失效,保存到本地)
常见的CSRF攻击:
Get请求,操做数据库内容
好比网站A的修改密码接口是GET方式,经过调用api/ChangePassword?psw=123就能够进行密码的修改,因此在开发的过程当中若是涉及到数据改动都建议采用POST请求
隐藏表单提交POST请求
单纯的POST固然也是能伪造的,JS利用form表单能够跨域请求的特性的提交POST请求仍然可以产生CSRF攻击。
若是网站A有使用Flash,并将跨域策略文件中的allow-access-from domain设置为素有,也是有可能产生CSRF攻击的。
XSRF
一般来讲CSRF是由XSS实现的,因此CSRF时常也被称为XSRF,用XSS的方式实现伪造请求,好比网站A存在XSS漏洞,被注入恶意代码后,当有用户访问到有恶意代码的网页的时候,就会发送一条相似转帐,关注啊之类的请求,作到XSRF攻击。
看完这几种攻击方式,大概应该能辨别何时是CSRF攻击了,简单说就是只要发起了冒牌请求那么就算是CSRF(XSRF)
顺便再总结下XSS和CSRF的其余区别,面试官可能会问到哦~
区别一,发生位置
XSS:发生在客户端
CSRF:发生在服务端
区别二,原理
XSS:注入代码,执行代码,篡改内容
CSRF:携带Cookie模拟请求
区别三,根源
XSS:同源策略机制
CSRF:Web隐式身份验证机制
区别四,就Cookie而言
XSS:盗取Cookie来干坏事
CSRF:借用Cookie来干坏事
最后仍是要说下如何防范CSRF攻击
1、Referer(记录 HTTP 请求的来源地址) Check
好处是只须要增长一个拦截器来检查 Referer ,用于过滤非该服务器域名的地址,不须要改变当前系统的任何已有代码和逻辑,很是快捷。
可是,Referer 的值是由浏览器提供的,虽然 HTTP 协议上有明确的要求,可是每一个浏览器对于 Referer 的具体实现可能有差异,并不能保证浏览器自身没有安全漏洞。使用验证 Referer 值的方法,就是把安全性都依赖于第三方(即浏览器)来保障,不是很靠谱,而且一些低版本的浏览器像IE6等有方法对Referer 进行篡改。还有重要的一点是,用户能够设置浏览器不携带 Referer字段。
2、验证码
强制用户必须与应用进行交互,才能完成最终请求。在一般状况下,验证码能很好遏制CSRF攻击。可是出于用户体验考虑,网站不能给全部的操做都加上验证码。所以验证码只能做为一种辅助手段,不能做为主要解决方案。
3、Token
在 HTTP 请求中以参数的形式添加一个随机产生的 token,并在服务器端创建一个拦截器来验证这个 token,假设请求中没有 token 或者 token 内容不对,则以为多是 CSRF 攻击而拒绝该请求。而且涉及数据库操做的接口使用POST,由于GET很差加Token,会暴露Token的保密性。
关于Token
Token 应该保存到 local / session stograge(不会跨域工做) 或者 cookies
Tokens 除了像 cookie 同样有有效期,还要提供过时从新获取、强制刷新、撤回等操做
有须要的话,要加密而且签名 token
将 JSON Web Tokens(JWT) 应用到 OAuth 2
4、HTTP 头中自定义属性并验证
相似方法三,只不过不是以参数形式,而是请求头字段携带Token信息。可是要把全部请求都改成 XMLHttpRequest 请求。
至此,有关XSS和CSRF的内容都讲解完毕了,感谢你们抽空阅读。