浏览器安全之 CSRF
CSRF (Cross-Site Request Forgery)跨站请求伪造,从字面上看,一个是 跨站点
,表示恶意攻击的请求是来自不同域的;另一个是 伪造
,表示这个请求并非用户真实意愿发出的,而是通过某种欺骗手段诱使用户去点击从而产生攻击。
一个例子
现在我们有以下两个站点:
假设 a 站点有个文章列表,点击按钮可以删除文章,对应的请求是 www.a.com/article/del?id=1
那么 CSRF 的攻击思路是什么呢?
- 首先,既然是跨站,那么在 b 站点构造一个
www.b.com/csrf.html
页面 - 然后,利用 img 标签没有跨域的限制,在页面里放置一张图片
<img src="http://www.a.com/article/del?id=1" />
- 接下来,还有一个关键点,就是欺骗已经登录网站 a 的用户,来访问 b 站点构造的这个页面,这个时候有了登录态,img 发出请求就会携带 cookie,然后就可以不知不觉地把这篇文章删掉了
上面这种是 GET 请求,另外还有 POST 请求,思路是一样的:例如要在 a 站点新增一篇文章,那就在 b 站点里伪造页面后,使用 JavaScript 构造一个表单, action 地址指向 a 站点新增文章的 api 地址,用户访问后,请求就会携带 cookie,经过身份认证后,就能不知不觉新增一遍文章了。
CSRF 分类
- HTML CSRF 攻击
- JSON 劫持攻击
- Flash CSRF 攻击 (Flash 退出历史舞台了,了解就好)
HTML CSRF 攻击简单来说就是请求是由 HTML 元素发出的,比如 img
, link
, a
这些自带跨域的标签。
JSON HiJacking 攻击就是对 AJAX 请求返回的 json 数据进行劫持,比如某个接口 url 提供了 callback 回调来处理数据,那么利用这个 callback 伪造出 CSRF 请求,对数据进行操纵攻击。
CSRF 的危害
- 篡改目标网站上的用户数据
- 利用用户 cookie 信息做一些恶意操作
- 传播 CSRF 蠕虫
防范 CSRF
- 针对跨站问题,可以判断请求来源,具体是优先判断 origin,因为它考虑安全,origin 只包含域名信息;其次是 referrer ,里面包含了详细 path
- 针对 cookie 被盗用问题,可以对 cookie 设置
Samesite
属性,这个属性支持三个值:Strict
:开启严格模式,这种模式下 cookie 在任何时候都不能作为第三方 cookie 来使用Lax
:宽松模式,允许部分请求携带 cookie,通常是 GET 请求None
:不做啥限制,每次请求都可以携带 cookie 发送
CSRF token
:既然是通过伪造请求实现攻击,那么可以由服务端下发一个 token 给客户端,客户端妥善保管好它,然后每次请求时携带这个 token ,服务器校验 token 的合法性,以此来区分正常用户请求和非法请求。- 对于普通用户来说,不要随便打开一些来路不明的链接,尤其是邮件里收到的一些垃圾邮件
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论