(转)java使用jsp servlet来防止csrf 攻击的实现方法
2017-02-10 09:54
441 查看
背景:
1.csrf知识
CSRF(Cross-site request forgery跨站请求伪造,也被称为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
常见的解决方法:
Cookies Hashing:每一个表单请求中都加入随机的Cookie,由于网站中存在XSS漏洞而被偷窃的危险。
HTTP refer:可以对服务器获得的请求来路进行欺骗以使得他们看起来合法,这种方法不能够有效防止攻击。
验证码:用户提交的每一个表单中使用一个随机验证码,让用户在文本框中填写图片上的随机字符串,并且在提交表单后对其进行检测。
令牌Tocken:一次性令牌在完成他们的工作后将被销毁,比较安全。
2. 在jsp 表单中产生一个加密随机数,传入到serlet中进行验证。
解决方法如下:
1. 产生随机数。
<%
SecureRandom random=SecureRandom.getInstance("SHA1PRNG");
long seq=random.nextLong();
String random=""+seq;
session.setAttribute("random_session",random);
%>
2. 使用隐藏域传递比较值。
<input type="hidden" name="random_form" value=<%=random%>></input>
3. servlet控制器获取参数比较。
小结:
1. jsp中使用java代码,使用<%=%>形式,错误使用过'${}'.
2. 隐藏区域使用简化形式<input type="hidden" name="random_form" value=<%=random%>/>将会把/当成字符串解析,而不是结束符。
3. 日志或者打印出random_form、random_session 的值,防止出现无法调试的情况。
4. jsp中规规矩矩的使用session.setAttribute()设值,servlet中使用request.getSession().getAttribute() 取值最保险。
5. 隐藏区一定要位于提交按钮前面,否则将读取不到隐藏区的值。
6. 见我的前两篇文章。
http://www.cnblogs.com/davidwang456/p/3579339.html 使用filter来做
http://www.cnblogs.com/davidwang456/p/3579444.html 使用tag或者spring security包含的东西来做。
摘自:http://www.cnblogs.com/davidwang456/p/3585162.html
1.csrf知识
CSRF(Cross-site request forgery跨站请求伪造,也被称为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
常见的解决方法:
Cookies Hashing:每一个表单请求中都加入随机的Cookie,由于网站中存在XSS漏洞而被偷窃的危险。
HTTP refer:可以对服务器获得的请求来路进行欺骗以使得他们看起来合法,这种方法不能够有效防止攻击。
验证码:用户提交的每一个表单中使用一个随机验证码,让用户在文本框中填写图片上的随机字符串,并且在提交表单后对其进行检测。
令牌Tocken:一次性令牌在完成他们的工作后将被销毁,比较安全。
2. 在jsp 表单中产生一个加密随机数,传入到serlet中进行验证。
解决方法如下:
1. 产生随机数。
<%
SecureRandom random=SecureRandom.getInstance("SHA1PRNG");
long seq=random.nextLong();
String random=""+seq;
session.setAttribute("random_session",random);
%>
2. 使用隐藏域传递比较值。
<input type="hidden" name="random_form" value=<%=random%>></input>
3. servlet控制器获取参数比较。
String random_form=request.getParameter("random_form"); String random_session=(String)request.getSession().getAttribute("random_session"); out.println("random_form:"+random_form); out.println("random_session:"+random_session); if(random_form!=null&&random_session!=null&&random_form.equalsIgnoreCase(random_session)){ //business }
小结:
1. jsp中使用java代码,使用<%=%>形式,错误使用过'${}'.
2. 隐藏区域使用简化形式<input type="hidden" name="random_form" value=<%=random%>/>将会把/当成字符串解析,而不是结束符。
3. 日志或者打印出random_form、random_session 的值,防止出现无法调试的情况。
4. jsp中规规矩矩的使用session.setAttribute()设值,servlet中使用request.getSession().getAttribute() 取值最保险。
5. 隐藏区一定要位于提交按钮前面,否则将读取不到隐藏区的值。
6. 见我的前两篇文章。
http://www.cnblogs.com/davidwang456/p/3579339.html 使用filter来做
http://www.cnblogs.com/davidwang456/p/3579444.html 使用tag或者spring security包含的东西来做。
摘自:http://www.cnblogs.com/davidwang456/p/3585162.html
相关文章推荐
- java使用jsp servlet来防止csrf 攻击的实现方法(二)
- java使用jsp servlet来防止csrf 攻击的实现方法
- java使用jsp servlet来防止csrf 攻击的实现方法
- java使用jsp servlet来防止csrf 攻击的实现方法
- java使用jsp servlet来防止csrf 攻击的实现方法
- java使用jsp servlet来防止csrf 攻击的实现方法(一)
- JAVAWEB开发之Servlet3.0新特性的使用以及注解的详细使用和自定义注解的方法、动态代理的使用、利用动态代理实现细粒度的权限控制以及类加载和泛型反射
- Java Web学习(30): 使用JSP+Servlet+JavaBean实现用户登录
- 使用Java提供的方法防止IE缓存JSP文件
- jsp+servlet+javabean实现数据分页方法完整实例
- JSP作业4 - 使用JSP+JavaBean+Servlet实现用户登录注册页面
- jsp+servlet+javabean实现数据分页方法完整实例
- 防止跨站请求伪造(CSRF)攻击 和 防重复提交 的方法的实现
- 浅谈ASP.NET MVC 防止跨站请求伪造(CSRF)攻击的实现方法
- 使用Java提供的方法防止IE缓存JSP文件
- Effective Java Item3:使用私有构造方法或者枚举类型实现单例
- [转载]JAVA类中通过Servlet操作JSP中Session变量方法
- jsp+servlet+java 实现统计在线人数
- 使用jxl,Servlet,JSP 动态生成excel文件并提示下载的简单方法
- JAVA学习提高之---- FileUpload组件实现多文件上传(JSP+SERVLET)实现