JAVA年度安全 第六周 防止CSRF

本系列的译文暂停很久了,今后每周一篇直至完成

原文地址:

http://www.jtmelton.com/2012/02/07/year-of-security-for-java-week-6-csrf-prevention-in-java/

Whatis it and why should I care?

跨站点请求伪造(CSRF)是指受害者当被一个网站授权后,在其未知觉的情况下被强行向这个网站发起一个未知的或者未期望的请求。网站的授权凭证通常以浏览器的cookie方式保存,每次请求会自动传送到服务器。利用这种原理,攻击者可以诱使受害者对网站执行几乎所有存在CSRF漏洞的请求。

下面图片简要揭示了CSRF攻击的基本流程:

第一步:诱使受害者访问一个恶意网站(evil.com)

第二步:受害者的浏览器加载拥有一个隐藏图片的恶意网站,这张图片有一个指向目标网站good.com的脚本指令。

第三步:受害者的浏览器将good.com会话cookie(通常是认证信息)发送到good.com上,并且在good.com上执行这个指令

第四步:指令执行之后受害者才知道结果,或者全然不知。

Whatshould I do about it?

既然知道了CSRF的原理和危害,那考虑一些解决方案:

 

Token令牌

经典的CSRF解决方案是为每个session分配一个token(例如同步标志位设计方案):

基本流程:

第一步:用户登陆之后,将一个随机字符串放到用户session中

第二步:在所有的非幂等性的表单提交请求中(意思是任何修改服务器状态的请求应该是通过HTTP Posts的方式提交的),当表单提交的时候,token也是其中的一个请求参数。

第三步:负责这个非幂等性请求的处理器会验证提交进来的token参数是否和session中保存的token参数一致。如果提交的token缺失或者不一致,则拒绝这个请求。

经过多年的验证这个方案能够完美适用于几乎所有的场景。但是也有缺点:

1、 实现这个方案很耗时间。

2、 特殊情况下能绕过某些请求的验证。

ESAPI(https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API)项目内置基于授权模型的CSRF防护实现。这里有一份我之前写的关于ESAPI CSRF实现的文章:(http://www.jtmelton.com/2010/05/16/the-owasp-top-ten-and-esapi-part-6-cross-site-request-forgery-csrf/)

CSRFGuard

OWASP CSRFGuard项目(https://www.owasp.org/index.php/Category:OWASP_CSRFGuard_Project)是一个可靠的CSRF防护方案,使用这个方案仅仅需要在你的应用中添加一个filter和相应的配置文件。这是一个值得研究的项目。

Stateless CSRFProtection

还有一个有趣的防护实现是stateless CSRF方案(http://appsandsecurity.blogspot.com/2012/01/stateless-csrf-protection.html),作者是John Wilander(https://twitter.com/#!/johnwilander)。John提出一个有创意的想法:服务器端不需要在用户会话中保存相应的token,由客户端来生成一个防止CSRF
Token的cookie(每次请求都提交到服务器),同时每次提交都将这个token当做一个请求参数。因为攻击者不能同时获取到目标网站的token cookie和token请求参数,服务端只需要验证这个token请求参数和token cookie是否一致就可以了。在我的印象中,这个方案还没有被广泛的测试验证过,但能够优雅解决这个复杂的问题,或许时间能够证明stateless CSRF是一个更好的方案。

CSRF攻击是一个流行且危险的攻击方式,但是通过上面的防护方案,就能妥善解决这个风险。

最后需要注意的是token令牌方式在有XSS漏洞的网站上是无法起作用的。因为攻击者可以根据XSS漏洞读取当前正在使用的token令牌,这样就能够绕过基于Token方式的防护方案。解决方法很简单:修复XSS漏洞!

References

———–

https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29

https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29_Prevention_Cheat_Sheet

http://www.cgisecurity.com/csrf-faq.html

http://www.jtmelton.com/2010/05/16/the-owasp-top-ten-and-esapi-part-6-cross-site-request-forgery-csrf/

https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API

https://www.owasp.org/index.php/Category:OWASP_CSRFGuard_Project

JAVA年度安全 第六周 防止CSRF

时间: 2024-12-29 10:33:15

JAVA年度安全 第六周 防止CSRF的相关文章

201671010140. 2016-2017-2 《Java程序设计》java学习第十六周

java学习第十六周         本周对十三章:"部署java应用程序"进行了课堂学习,在老师思路牵引下,对这一章知识进行学习,对实例程序运行和注释,对比课前对书本上知识的浅显预习,半知半解,课堂学习后,对这部分知识的理解也更加深入,尤其是在JAR文件这部分,感觉掌握的不错,对Java程序为何要打包成JAR文件,如何去做都有了进一步学习,认知,之前并不理解如何使用jar程序制作JAR文件,在课堂上同学的演示下,也理解了这部分知识.在对JAR文件中的包的密封,属性映射等方面的知识掌握

20165324 《Java程序设计》 第六周

学号 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 第八章 常用实用类 String类 构造String对象:常量对象:String对象:引用String常量. 字符串的并置:String对象使用"+"进行并置运算,即首尾相接. String类的常用方法 public int length():获取String对象的长度. public boolean equals(String s):比较当前String对象的字符序列是否与参数s指定的St

20165318 2017-2018-2 《Java程序设计》第六周学习总结

20165318 2017-2018-2 <Java程序设计>第六周学习总结 教材内容学习总结 第八章 常用实用类 1.String类 String类用来处理字符序列,在java.lang包中,程序可以直接使用String类.需要注意的是Java把String类声明为final类,因此用户不能扩展String类,即String类不可以有子类. 常量对象:字符串常量对象是用双引号括起的字符序列,例如:"你好"."12.97"."boy"

2017-2018-2学期 20172324《Java程序设计》第六周学习总结

20172324<Java程序设计>第六周学习总结 教材学习内容总结 如何创建数组以及int[] X与int X[]的区别(编译时是没有差别的,只是前者与其他类型的声明方式有一致性) 每一个java数组都是一个迭代器. 数组是作为参数传递给一个方法的,实际上传递的是原始数组引用的副本. 对象数组(基本数据类型+对象) 二维数组中前一个索引值代表行,另一个索引值代表列. 可变长度参数用... 教材学习中的问题和解决过程 问题1: Family代码中String...name中的...是什么意思.

杨其菊201771010134《面向对象程序设计(java)》第六周学习总结

<面向对象程序设计(java)>第六周学习总结 第一部分:理论知识 1)类.超类和子类2)Object:所有类的超类 3)泛型数组列表4)对象包装器和自动打包 5)参数数量可变的方法 6)枚举类7)继承设计的技巧 第二部分:实验部分 继承定义与使用<代码测试和示例程序的注释> 1.实验目的与要求 (1) 理解继承的定义: (2) 掌握子类的定义要求 (3) 掌握多态性的概念及用法: (4) 掌握抽象类的定义及用途://不能创建自己的对象,特殊类 (5) 掌握类中4个成员访问权限修饰

杨玲 201771010133《面向对象程序设计(java)》第六周学习总结

杨玲 201771010133<面向对象程序设计(java)>第六周学习总结 第一部分:理论知识学习部分 1.继承 用已有类来构建新类的一种机制.新类可以继承父类的方法和域,同时可以在新类中添加新的方法和域. 已有类称为:超类.基类或父类.新类称作:子类.派生类或孩子类. 子类的构造器不能直接访问超类的私有域,必须通过调用超类构造器,而且必须是第一条语句.子类不能直接访问超类的私有域,必须和其它方法一样,使用公有接口. 在子类中可以增加域.增加方法或覆盖超类的方法,但绝对不能删除超类的任何域和

20175202 《Java程序设计》第六周学习总结

20175202 2018-2019-2 <Java程序设计>第六周学习总结 教材知识点总结 1.内部类: Java支持在一个类中定义另一个类,称作内部类,包含内部类的类叫做外嵌类. 内部类的外嵌类的成员变量在内部类中仍然有效,内部类也可以调用其方法. 内部类的类体中不能声明变量和方法. 内部类仅供其外嵌类使用. 2.匿名类: 匿名类可以继承和重写父类的方法,且匿名类一定是内部类. 匿名类可以访问外嵌类的变量和方法,匿名类的类体不能声明static变量和方法. 创建对象时,必须使用父类的构造方

学号 20175329 2018-2019-3《Java程序设计》第六周学习总结

学号 20175329 2018-2019-3<Java程序设计>第六周学习总结 教材学习内容 第七章 内部类与异常类 内部类与外嵌类之间的重要关系如下: 内部类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法. 内部类的类体中不可以声明类变量和类方法.外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员. 内部类仅供它的外嵌类使用,其他类不可以用某个类的内部类声明对象. 2.匿名类 匿名类可以继承父类的方法也可以重写父类的方法. 使用匿名类时,必然是在某个类中直接

20175317 《Java程序设计》第六周学习总结

20175317 <Java程序设计>第六周学习总结 教材学习内容总结 第六周我学习了教材第七章与第十章的内容,了解了内部类.异常类与输入输出流的知识,学到了以下内容: 什么是内部类 如何编写与运行内部类 了解了和子类有关的匿名类与和接口有关的匿名类 如何自定义异常类.try-catch语句的使用方式 如何使用File类查看文件属性.创建目录.创建删除文件和运行可执行文件 文件字节输入流的构造 在看完课本知识的同时我也将教材配套视频看完了,教材代码也逐一进行了编译运行,通过实践进一步学习了本章