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

发布于 2021-01-25 17:09:11 字数 1363 浏览 1060 评论 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吧~

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

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

列表为空,暂无数据

关于作者

JSmiles

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

0 文章
0 评论
84935 人气
更多

推荐作者

待"谢繁草

文章 0 评论 0

战皆罪

文章 0 评论 0

子英

文章 0 评论 0

爱的十字路口

文章 0 评论 0

孤者何惧

文章 0 评论 0

xi霄xi

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击“接受”或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。