网络安全 CSRF 跨站请求伪造介绍和防范
跨站请求伪造(英语: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 这个作品点赞了,然而,用户并不知情。
防御方式
有两种方法:
- 后端判断 referer 是否合法(不推荐)
通过HTTP的 referer 可知道,用户是通过哪个网站发送这个请求的。但是 referer 的判断并不是好方法,有各种方式可以绕过的方法,具体可见 CSRF 花式绕过Referer技巧>> - 每次请求带上 token
比如 laravel,在后端模板渲染的时候会提供一个csrf的token,这样的话,不同域的网站是拿不到token的,所以也就防止了csrf了。
补充
使用 iframe 会引出一些不安全的问题,比如绕过 referer 验证,比如资源盗用等,所以,很多网站会设置 X-Frame-Options
为 DENY
,这也是一个安全的补充点。
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论