ASP.NET MVC 防止CSRF攻击
简介
MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request forgery)攻击的一个措施,它跟XSS(XSS又叫CSS:Cross-Site-Script),攻击不同,XSS一般是利用站内信任的用户在网站内插入恶意的脚本代码进行攻击,而CSRF则是伪造成受信任用户对网站进行攻击。
CSRF可以攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。
实例
我们新建一个简单的网站发布公告界面
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
@using (Html.BeginForm("Notice", "Home", FormMethod.Post))
{
@:网站公告:<input type="text" name="Notice" id="Notice" />
<input type="submit" value="Submit" />
}
</body>
</html>

提交后

此时提供给了跨站攻击的漏洞,CSRF一般依赖几个条件
(1)攻击者知道该目标站点。
(2)攻击者的目标站点具有持久化授权cookie或者受害者具有当前会话cookie
(3)目标站点没有对用户在网站行为的第二授权。
比如我们现在知道发布新闻的地址:http://localhost:56874/Home/Notice
比如我们新建一个页面
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<form action="http://localhost:56874/Home/Notice" method="post">
网站公告:<input type="text" name="Notice" id="Notice" />
<input type="submit" value="Submit" />
</form>
</body>
</html>
发起攻击
这样在网站的公告就被篡改了。作为安全性考虑,这种情况肯定不会让它发生的。
如何防止
ASP.NET MVC中通过在页面上使用 Html.AntiForgeryToken()配合在对应的Action上增加[ValidateAntiForgeryToken]特性来防止跨站攻击。
修改上面提交代码
@using (Html.BeginForm("Notice", "Home", FormMethod.Post))
{
@Html.AntiForgeryToken();
@:网站公告:<input type="text" name="Notice" id="Notice" />
<input type="submit" value="Submit" />
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Notice(string Notice)
{
ViewBag.Notice = Notice;
return View();
}
再次运行网站,界面没什么变化当我们查看源代码的时候发现多了一个东西
<input name="__RequestVerificationToken" type="hidden" value="oo1kDYx6CUL3YSyZHokvWgPzOcZhZID_75tiqYBgNMBBjQNo4FgmWpO5dRsVlvqIVgZH34FvTArCFbWKuDkCbwl5UFOAxzxmaTwuQ9iBBHY1" />
现在当我们再次篡改数据的时候
我们看一下Html.AntiForgeryToken()会为当前请求,生成一个名为__RequestVerificationToken的cookie,还有一个名为__RequestVerificationToken的隐藏域。
为了验证一个来自form post请求,还需要在目标action上增加[ValidateAntiForgeryToken]特性,它是一个验证过滤器,它主要检查
(1)请求的是否包含一个约定的AntiForgery名的cookie
(2)请求是否有一个Request.Form["约定的AntiForgery名"],约定的AntiForgery名的cookie和Request.Form值是否匹配
Ajax如何CSRF攻击
在Asp.net Mvc里加入防伪标记很简单在表单中加入Html.AntiForgeryToken()即可。
Html.AntiForgeryToken()会生成一对加密的字符串,分别存放在Cookies 和 input 中。
我们在ajax post中也带上AntiForgeryToken
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
<script src="~/Script/jquery-1.10.2.min.js"></script>
</head>
<body>
<form>
网站公告:<input type="text" name="Notice" id="Notice" />
<input type="button" value="提交" id="btn" />
</form>
</body>
</html>
<script>
$(function () {
$("#btn").click(function () {
var token = $('@Html.AntiForgeryToken()').val();
var headers = {};
headers["__RequestVerificationToken"] = token;
$.ajax({
type: 'POST',
url: '/Home/Notice',
cache: false,
headers: headers,
data: { Notice: $("#Notice").val()},
success: function (data) {
alert(data)
},
error: function () {
alert("Error")
}
}); })
})
</script>
自定义ValidateAntiForgeryToken
public class MyValidateAntiForgeryToken: AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
var request = filterContext.HttpContext.Request;
if (request.HttpMethod== WebRequestMethods.Http.Post)
{
if (request.IsAjaxRequest())
{
var antiForgeryCookie = request.Cookies[AntiForgeryConfig.CookieName];
var cookiValue = antiForgeryCookie != null ? antiForgeryCookie.Value : null;
var s = request.Headers["__RequestVerificationToken"];
AntiForgery.Validate(cookiValue, request.Headers["__RequestVerificationToken"]);
}
else
{
new ValidateAntiForgeryTokenAttribute() .OnAuthorization(filterContext); }
}
}
}
修改HomeController Notice方法
[HttpPost]
// [ValidateAntiForgeryToken]
[MyValidateAntiForgeryToken]
public ActionResult Notice(string Notice)
{
ViewBag.Notice = Notice; return Json(new { message = Notice });
}
这样就防止了ajax post数据到服务器不加防伪标记,造成CSRF攻击
ASP.NET MVC 防止CSRF攻击的更多相关文章
- asp.netcore mvc 防CSRF攻击,原理介绍+代码演示+详细讲解
一.CSRF介绍 1.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session ridin ...
- ASP.NET MVC防范CSRF最佳实践
XSS与CSRF 哈哈,有点标题党,但我保证这篇文章跟别的不太一样. 我认为,网站安全的基础有三块: 防范中间人攻击 防范XSS 防范CSRF 注意,我讲的是基础,如果更高级点的话可以考虑防范机器人刷 ...
- 保护ASP.NET 应用免受 CSRF 攻击
CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/ ...
- ASP.NET MVC 防止 CSRF 的方法
MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request forgery)攻击的一个措施,它跟XSS(XSS又叫CSS:Cross ...
- MVC防止CSRF攻击
可能我们大多数人做web的时候不会太注意这个问题,但是这是一个很重要的一个点.我们写代码写业务的时候也应该从各方面多思考. 首先就是先简单介绍下什么是CSRF CSRF 全程是 Cross-site ...
- MVC 应用免受 CSRF攻击
保护ASP.NET 应用免受 CSRF 攻击 CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack ...
- Spring mvc拦截器防御CSRF攻击
CSRF(具体参考百度百科) CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSR ...
- [转]浅谈CSRF攻击方式
在CSDN中看到对CSRF攻击的原理及防护文章,讲解浅显易懂,特转之: 来源:http://blog.csdn.net/fationyyk/article/details/50833620 一.CSR ...
- ASP.NET安全[开发ASP.NET MVC应用程序时值得注意的安全问题](转)
概述 安全在web领域是一个永远都不会过时的话题,今天我们就来看一看一些在开发ASP.NET MVC应用程序时一些值得我们注意的安全问题.本篇主要包括以下几个内容 : 认证 授权 XSS跨站脚本攻击 ...
随机推荐
- 几种查询方法(lambda Linq Enumerable静态类方式)
1.需要一个数据源类: using System; using System.Collections.Generic; namespace Linq { public class Student { ...
- leetcode475
public class Solution { public int FindRadius(int[] houses, int[] heaters) { houses = houses.Distinc ...
- 回文O(N)算法
[回文O(N)算法] 利用回文的对称性质,可以设计出O(N)的算法. 参考:http://blog.csdn.net/ggggiqnypgjg/article/details/6645824
- shell脚本学习指南-学习(1)
1.先看下面这个命令: $who | wc -l 计算当前登陆的用户个数: $who 当前登陆的有哪些用户: pipeling( | )可以在两个程序之间建立管道,左侧的结果成为右侧的 ...
- 22.Generate Parentheses (String; Back-Track)
Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...
- react native 导航路由组件react-navigation的使用
navigation的几个难点和问题: 1.底部tab是否可以加上中间的大按钮? 如果加上,如何触发事件? js文件放哪? 2.navigation的登录注册页面.成功后应该不能返回刚刚的登录页面?清 ...
- PLSQL Developer工具的使用
1.运行 2.字体大小 导入csv文件. 任何工具都有失败的可能, 这个时候,也失败了. 当然还有另一种可能,文件被人为改过了,括号改过了,就即使使用下面的kettle工具也没用了.这时可以导出文件对 ...
- Spring IoC底层原理
-------------------siwuxie095 Spring IoC 底层原理 1.IoC 即 Invers ...
- 读写大“二进制”文件,不必申请很大内存(fopen,fread,fwrite,fclose)
<?php /** * 读写大二进制文件,不必申请很大内存 * 只有读取到内容才创建文件 * 保证目录可写 * * @param string $srcPath 源文件路径 * @param s ...
- java内存模型—先行发生原则
Java语言中有一个“先行发生”(happens-before)的原则.这个原则非常重要,它是判断数据是否存在竞争,线程是否安全的主要依据,依赖这个原则,我们可以通过几条规则一揽子解决并发环境下两个操 ...