java使用jsp servlet来防止csrf ***的实现方法

背景:html

java使用jsp servlet来防止csrf ***的实现方法
1.csrf知识java

CSRF(Cross-site request forgery跨站请求伪造,也被称为“one click attack”或者session riding,一般缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS很是不一样,而且***方式几乎相左。XSS利用站点内的信任用户,而CSRF则经过假装来自受信任用户的请求来利用受信任的网站。与XSS***相比,CSRF***每每不大流行(所以对其进行防范的资源也至关稀少)和难以防范,因此被认为比XSS更具危险性。spring

常见的解决方法:安全

Cookies Hashing:每个表单请求中都加入随机的Cookie,因为网站中存在XSS漏洞而被偷窃的危险。服务器

HTTP refer:能够对服务器得到的请求来路进行欺骗以使得他们看起来合法,这种方法不可以有效防止***。session

验证码:用户提交的每个表单中使用一个随机验证码,让用户在文本框中填写图片上的随机字符串,而且在提交表单后对其进行检测。dom

令牌Tocken:一次性令牌在完成他们的工做后将被销毁,比较安全。jsp

  1. 在jsp 表单中产生一个加密随机数,传入到serlet中进行验证。

解决方法以下:ide

  1. 产生随机数。
<%

SecureRandom random=SecureRandom.getInstance("SHA1PRNG");

long seq=random.nextLong();
String random=""+seq;
session.setAttribute("random_session",random);

%>
  1. 使用隐藏域传递比较值。
<input type="hidden" name="random_form" value=<%=random%>></input>
  1. 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包含的东西来作。

相关文章
相关标签/搜索