当前位置:网站首页 > Java教程 > 正文

java csrftoken 教程



项目地址: https://github.com/morethink/web-security

CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。

你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。

下图简单阐述了CSRF攻击的思

从上图可以看出,要完成一次CSRF攻击,受害者必须依次完成两个步骤:

  1. 登录受信任网站A,并在本地生成Cookie。
  2. 在不登出A的情况下,访问危险网站B。

看到这里,你也许会说:“如果我不满足以上两个条件中的一个,我就不会受到CSRF的攻击”。是的,确实如此,但你不能保证以下情况不会发生:

  1. 你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站。
  2. 你不能保证你关闭浏览器了后,你本地的Cookie立刻过期,你上次的会话已经结束。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了......)
  3. 上图中所谓的攻击网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站。

下面讲一讲java解决CSRF攻击的方式。

用户名和密码都是admin。

:

:

:

明显看到B网站是8082端口,A网站是8081端口,但是B网站的删除2号帖子功能依然实现。

简单来说,CSRF 就是网站 A 对用户建立信任关系后,在网站 B 上利用这种信任关系,跨站点向网站 A 发起一些伪造的用户操作请求,以达到攻击的目的。

而之所以可以完成攻击是因为B向A发起攻击的时候会把A网站的cookie带给A网站,也就是说cookie已经不安全了。

Synchronizer Tokens: 在表单里隐藏一个随机变化的 csrf_token csrf_token 提交到后台进行验证,如果验证通过则可以继续执行操作。这种情况有效的主要原因是网站 B 拿不到网站 A 表单里的 csrf_token

这种方式的使用条件是PHP和JSP等。因为cookie已经不安全了,因此把csrf_token值存储在session中,然后每次表单提交时都从session取出来放到form表单的隐藏域中,这样B网站不可以得到这个存储到session中的值。

下面是JSP的:

 

但是我现在的情况是html,不是JSP,并不能动态的从session中取出csrf_token值。只能采用加密的方式了。

这可能是最简单的解决方案了,因为攻击者不能获得第三方的Cookie(理论上),所以表单中的数据也就构造失败了。

我采用的hash加密方法是JS实现Java的HashCode方法,得到hash值,这个比较简单。也可以采用其他的hash算法。

前端向后台传递hash之后的csrf_token值和cookie中的csrf_token值,后台拿到cookie中的csrf_token值后得到hashCode值然后与前端传过来的值进行比较,一样则通过。

我们通过UserFilter.java给攻击者返回的是403错误,表示服务器理解用户客户端的请求但拒绝处理。

:

攻击者不能删除4号帖子。

前端代码:

deletePost.html

 

后台代码:

UserInterceptor.java

 

注意

  1. cookie必须要设置PATH才可以生效,否则在下一次请求的时候无法带给服务器。
  2. Spring Boot 出现启动找不到主类的问题时可以mvn clean一下。
  3. Filter设置response.sendError(403)在Spring Boot没有效果。

参考文档

  1. 浅谈CSRF攻击方式
  2. jQueue 动态设置form表单的action属性的值和方法
  3. javascript的String到int(32位)的hash算法

  • 上一篇: java+视屏教程
  • 下一篇: pc蛋蛋java教程
  • 版权声明


    相关文章:

  • java+视屏教程2025-03-05 13:10:01
  • 42集java教程2025-03-05 13:10:01
  • 兄弟连 java教程2025-03-05 13:10:01
  • java11安装教程2025-03-05 13:10:01
  • 走搭教程java2025-03-05 13:10:01
  • pc蛋蛋java教程2025-03-05 13:10:01
  • java邮箱使用教程2025-03-05 13:10:01
  • java geoserver开发教程2025-03-05 13:10:01
  • java导入教程2025-03-05 13:10:01
  • java教程482025-03-05 13:10:01