因为:HTTP无状态(复习)
所以,无论从哪个页面访问目标网站(比如:http://17bang.ren/),浏览器都会自动将其存放的该网站cookie发送过去;
而这cookie当中,存储了用户身份验证信息……
演示:百度搜素“一起帮”,点击我们网站连接,自动登录
@想一想@:于是你能干什么坏事?^_^
Cross-Site Request Forgery:CSRF,或者XSRF:
演示:17bang.ren上点赞sample.17bang.ren
让服务器确保该HTTP请求确实由“我”生成的HTML页面/链接……所产生
早期有开发人员使用Request.Referer检查本次Http请求的上一次请求地址,来确定本次请求是否来源于当前网站:
Request.Refere不是当前网站的一律拒绝。
但是,很遗憾,Request.Referer一样可以伪造。
防御的核心在于除了用户的验证cookie以外,还要生成一个token,以确保链接/表单确实为服务器端生成。
MVC从3.0版本开始,为我们提供了内置的:
@Html.AntiForgeryToken()
将其添加在form表单中,就会额外生成一个hiden input,记录了一个token:
<input name="__RequestVerificationToken" type="hidden" value="assObJoyzRa1d-...-gU4rw1">
同时会向前台发送一个cookie:
最后,还需要在在Action上标注:
[ValidateAntiForgeryToken]
这样,MVC就会在开始Action之前,验证 hiden input 和 cookie,检验form表单是否为MVC自己生成的。
具体算法未知,但根据文档,大致来说:
演示:上述知识,以及修改/没有hide input,异常提示
通常来说,我们都是form表单提交时使用CSFR验证(因为这些信息比较敏感)。如果要在GET请求的url参数中添加token,需要使用JavaScript的技术……
---------------------------------
---------------------------------
演示:略
想一想一起帮哪些页面需要添加防御CSFR,并为其添加防御机制
多快好省!前端后端,线上线下,名师精讲
更多了解 加: