假如现在有网站A(淘宝)和网站B(黑客网站),某一个晚上你打开淘宝网站正在购物。。突然你感觉很无聊,你百度找啊找,找了一个小黄网,其实这是钓鱼网站。此时的情况是你同时打开了淘宝网站和小黄网网站,然后问题来了这个小黄网网站有没有可能对你的淘宝网上上面的一些数据进行操作呢?下面请看具体的代码模拟。
1.第一步用户登录网站A
对应的java后台代码:
@Controller
public class LoginController {
@RequestMapping("/login")
public String login(HttpServletRequest request,String username, String password){
if("admin".equals(username)&&"admin".equals(password))
{
request.getSession().setAttribute("currentUser","libing");
request.setAttribute("message","login success");
}
return "index"; //视图重定向hello.jsp
}
@RequestMapping("/delete")
@ResponseBody
public String delete(HttpServletRequest request){
String currentUser=(String)request.getSession().getAttribute("currentUser");
if("libing".equals(currentUser))
{
System.out.println("执行了删除操作");
}
return "delete data";
}
}
2.用户访问网站B,用户在网站B上面删除A数据
前端页面代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<script src="/static/jquery.min.js"></script>
<body>
<h>B website</h>
<form action="http://127.0.0.1:8080/delete">
<input type="submit" value="delete webSite A Data">
</form>
</body>
</html>
点击删除数据:
用户登录了A网站,却可以把B网站的数据删除掉。
这就是所谓的跨站请求伪造,出现这样的原因是当用户在A网站提交数据给B网站的时候,浏览器把A的cookie提交了B网站。证明这一点我们只需要把请求的sessionid输出既可。
思考
1. 所有的浏览器都可以跨站请求伪造吗?
2.如何防止跨站请求伪造?
我测试了下chrome浏览器不能跨站请求伪造,IE可以,从另外一个角度来讲我们可以把它理解为浏览器的bug
对于如何防止跨站请求伪造,原理已经明了。通用的解决方案就是访问A网站的时候生成一个token放在session中或者token你有自己的校验规则,请求的时候带着token,后台校验token合法性。当然实际可能我们很少会这样做,java开发当中基本spring系列的框架能够帮你把这样的事情做掉。
还有另外最好的一种方式,就是不做处理,我相信淘宝网刚做的时候也没有考虑这么多吧。小站点并不需要考虑这么点,可能凉掉了,也不会被攻击一次。