跨站请求伪造。跨站请求的意思是说不是当前访问的网站,是第三方网站提交的请求。伪造就是说不是用户真正想提交的请求。
CSRF发送的场景如下图所示:

用户登录访问了一个受信任的站点A。在用户还没有推出登录的时候,打开另外一个tab页,访问了网站B.在B网站中,有CSRF攻击代码,B网站程序利用CSRF攻击代码来访问A网站。
发生的原因是:网站是通过cookie来识别用户的,当用户成功进行身份验证之后浏览器就会得到一个标识其身份的cookie,只要不关闭浏览器或者退出登录,以后访问这个网站就会带上这个cookie.
1,登录受信任网站A,并在本地生产Cookie.
2,在不登出A的情况下,并访问危险网站B.
你也许会说:如果不满足以上两个条件中的一个,我就不会受到CSRF的攻击。事实的确如此。但你不能够保证下面的情况不会发生:
1,你不能够保证你登录了一个网站后,不再打开一个tab页面并且访问另外的网站
2,你不能保证你关闭浏览器后,你本地cookie立刻过期,你上次的回话结束。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于推出登录/结束会话了)
3,上图中所谓的攻击网站,可能是一个存在其他漏洞的可信任的网站。
下面是一段很典型的演示代码:
login.jsp
<body>
<form action="input.jsp" method="post">
name<input type="text" name="name" size="50"><br>
pwd<input type="password" name="password" size="50"><br>
<input type="submit" value="submit">
</form>
<br>
</body>
</html>
input.jsp
<body>
<%
//Session session = request.getSession();
String username = (String)session.getValue("username");
System.out.println("username " + username);
if(null==username){
String uname = request.getParameter("name");
session.putValue("username", uname);
}
%>
<form action="dataupdate.jsp" method="post">
<input type="text" name="comment" size="50"><br>
<input type="submit" value="submit">
</form>
<br>
</body>
dataupdate.jsp
<body>
<%
String username = (String)session.getValue("username");
System.out.println("username " + username);
if(null==username){
System.out.println("has not logged in");
response.sendRedirect("login.jsp");
}else{
String comment = request.getParameter("comment");
System.out.println("add a comment: " + comment);
out.write("comment is : " + comment);
}
%>
</body>
</html>
上面代码的意思是:用户登录后在input.jsp页面提交数据。提交的数据被dataupdate.jsp更新到后台。dateupdate.jsp会检测用户是否登录,如果没有登录会跳到login.jsp文件,要求用户登录。
上面的的代码粗看好像没有什么问题。但是此时,假设我们有另一个网站B,他有一个网页文件如下:
<body> use a img element to send a get request <br> <img src="http://www.a.com/prjWebSec/csrf/dataupdate.jsp?comment=fromcsrf"> </body> </html>
如果用户在登录后同时访问网站B,访问者在网站A的数据就会被假冒更新。可以在后台看到有如下的输出:add a comment formscrf.
在这里网站A违反了HTTP规范,使用GET请求更新资源。那是不是用POST请求就不会发生CSRF呢?结果同样会发生。可以通过构造javascript构造form提交。代码如下:
<body >
</body>
<script type="text/javascript">
var frm= document.getElementById("viframe");
function sendcsrf()
{
var form1 = document.createElement("form");
form1.id = "form1";
form1.name = "form1";
document.body.appendChild(form1);
var input = document.createElement("input");
input.type = "text";
input.name = "comment";
input.value = "from csrf post";
form1.appendChild(input);
form1.method = "POST";
form1.action = "http://www.a.com/prjWebSec/csrf/dataupdate.jsp";
form1.submit();
document.body.removeChild(form1);
}
sendcsrf();
</script>
</html>
防止的方法:
1,利用referer判断
但是用户有可能设置浏览器使其在发送请求的时候不提供Referer,这样的用户也将不能访问网站。
2,在请求中增减token并且验证
关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于cookie之中,可以在服务器端生成一个随机码,然后放在form的hidden元素中,form提交的时候在服务器端检查。
以上内容摘抄自网络:原文地址:http://blog.csdn.net/kkdelta/article/details/17503947