java使⽤jspservlet来防⽌csrf攻击的实现⽅法
背景:
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 Instance("SHA1PRNG");
long Long(); String random=""+seq; session.setAttribute("random_session",random);
%>
2. 使⽤隐藏域传递⽐较值。
<input type="hidden" name="random_form" value=<%=random%>></input>
3. servlet控制器获取参数⽐较。
String random_Parameter("random_form");
String random_session=(Session().getAttribute("random_session");
out.println("random_form:"+random_form);
out.println("random_session:"+random_session);
javaservlet和jsp的比较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中使⽤Session().getAttribute()
取值最保险。
5. 隐藏区⼀定要位于提交按钮前⾯,否则将读取不到隐藏区的值。
6. 见我的前两篇⽂章。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。