网络安全 CSRF 跨站请求伪造介绍和防范 - 文章教程

网络安全 CSRF 跨站请求伪造介绍和防范

发布于 2021-01-25 字数 1942 浏览 993 评论 0

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

简单的说,就是利用游览器对用户的信任,比如,用户已经登录了ww.aaa.com,自然aaa这个网站就会将用户的登录状态 session 存在 cookie 中;
然后,aaa.com 这个网页有一个对作品点赞的功能,点赞提交地址为 aaa.com/api.like?id=777

这时,另外一个叫 www.bbb.com 的网站,放了这样一个元素 <img src="aaa.com/api.like?id=888">,我们知道,请求静态资源用的是 get 方法,这样的话,一旦用户进入这个 bbb.com 页面,就会请求 aaa.com 这个网站的点赞接口,而且点赞的用户对象是 888;

最后因为用户的登录信息尚未过期,那就等于给 id 为 888 这个作品点赞了,然而,用户并不知情。

防御方式

有两种方法:

  1. 后端判断 referer 是否合法(不推荐)
    通过HTTP的 referer 可知道,用户是通过哪个网站发送这个请求的。但是 referer 的判断并不是好方法,有各种方式可以绕过的方法,具体可见 CSRF 花式绕过Referer技巧>>
  2. 每次请求带上 token
    比如 laravel,在后端模板渲染的时候会提供一个csrf的token,这样的话,不同域的网站是拿不到token的,所以也就防止了csrf了。

补充

使用 iframe 会引出一些不安全的问题,比如绕过 referer 验证,比如资源盗用等,所以,很多网站会设置 X-Frame-OptionsDENY,这也是一个安全的补充点。

Q&A

问:既然请求静态资源都是 get 请求,那么要是后端把点赞接口改为 post 的方式也可以吧?

答:不可以。因为,bbb.com 网站完全可以设置一个 form 表单,action 为 bbb.com,method 为 post,接着 input 的 name 为 id,value 为 888,然后,script 代码直接 submit 表单。为了页面不重定向,还可以在 form 外层加一个 iframe。由于 form 表单其实是直接跳转,所以不存在跨域的问题。

总结

防止CSRF的最好方法还是带token吧~

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

目前还没有任何评论,快来抢沙发吧!

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

2583 文章
29 评论
84935 人气
更多

推荐作者

猫性小仙女

文章 1 评论 0

qq_VO6LhT

文章 0 评论 0

猿舌电影

文章 0 评论 0

7556275422

文章 0 评论 0

YYQ_139

文章 0 评论 0