CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

----  摘自《百度百科》

那我们如何防御呢?

一、在页面添加:@Html.AntiForgeryToken()

生成代码如下:

<input name="__RequestVerificationToken" type="hidden" value="-ixNsp4avtyr2m0rXsEshzmZcQAoitTNqqqrKn5UeGEJSTir7YgD7HrZ3hr6WnFQKcCnKhR4cFr6DvTqSSioX9YVc4ynLmFi19jCvvVaUQhE3E2j1sT0JwLeIYmeoujB0">

二、在我们的过滤器里添加过滤

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class AntiForgeryAttribute : FilterAttribute, IAuthorizationFilter
{
private readonly bool _ignore; /// <summary>
/// Anti-forgery security attribute
/// </summary>
/// <param name="ignore">Pass false in order to ignore this security validation</param>
public AdminAntiForgeryAttribute(bool ignore = false)
{
this._ignore = ignore;
}
public virtual void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
throw new ArgumentNullException("filterContext"); if (_ignore)
return; //don't apply filter to child methods
if (filterContext.IsChildAction)
return; //only POST requests
if (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase))
return; if (!DataSettingsHelper.DatabaseIsInstalled())
return;
var securitySettings = EngineContext.Current.Resolve<SecuritySettings>();
if (!securitySettings.EnableXsrfProtectionForAdminArea)
return; var validator = new ValidateAntiForgeryTokenAttribute();
validator.OnAuthorization(filterContext);
}
}

三、然后在控制器上添加过滤:

[AntiForgery]
public class BaseTController : BaseController

四、在我们的页面的js里发送post前添加:

  addAntiForgeryToken(postData);
$.ajax({
type: "POST",
url: "@(Url.Action("actionx", "controllerx"))",
data: postData,
complete: function(data) {
},
error: function(xhr, ajaxOptions, thrownError) {
alert(thrownError);
},
traditional: true
});

五、调用的这个addAntiForgeryToken方法是什么呢?

// CSRF (XSRF) security
function addAntiForgeryToken(data) {
//if the object is undefined, create a new one.
if (!data) {
data = {};
}
//add token
var tokenInput = $('input[name=__RequestVerificationToken]');
if (tokenInput.length) {
data.__RequestVerificationToken = tokenInput.val();
}
return data;
};

这样我们就能防御跨站请求伪造了。

下面我们实现一个简单的xss攻击

首先我们的js是这样的:

$(function(){
var msg='@ViewBag.Message';
$('#xss').html(msg)
})

html:

<div id="xss"></div>
@using (Html.BeginForm("Index", "contacts", FormMethod.Post))
{
<input type="text" name="msg" value="" />
<input type="submit" value="提交" />
}

控制器呢是这样的:

[HttpPost]
public ActionResult Index(string msg="")
{
ViewBag.Message = msg;
return View();
}

好了,就是这么一个简单的页面;

然后我们在输入框里填写:\x3cscript\x3ealert(\x27pwnd\x27)\x3c/script\x3e

然后提交,竟然能弹出提示框?是不是很奇怪!

razor明明默认是HTML编码,怎么这里会失败呢?

因为尽管msg进行了htm编码,但是仍然具有潜在的XSS脆弱性。在js里应该使用@Ajax.JavascriptStringEncode方法对msg的内容进行编码,这样就能阻止xss攻击了。

ASP.NET MVC CSRF (XSRF) security的更多相关文章

  1. .NET MVC CSRF/XSRF 漏洞

    最近我跟一个漏洞还有一群阿三干起来了…… 背景: 我的客户是一个世界知名的药企,最近这个客户上台了一位阿三管理者,这个货上线第一个事儿就是要把现有的软件供应商重新洗牌一遍.由于我们的客户关系维护的非常 ...

  2. CSRF in asp.net mvc and ap.net core

    如果在方法上添加了[ValidateAntiForgeryToken],没处理好 请求没有带参数 2019-09-17 14:02:45,142 ERROR [36]: System.Web.Mvc. ...

  3. ASP.NET MVC防范CSRF最佳实践

    XSS与CSRF 哈哈,有点标题党,但我保证这篇文章跟别的不太一样. 我认为,网站安全的基础有三块: 防范中间人攻击 防范XSS 防范CSRF 注意,我讲的是基础,如果更高级点的话可以考虑防范机器人刷 ...

  4. Asp.net MVC 如何防止CSRF攻击

    什么是CSRF攻击? CSRF(Cross-site request forgery跨站请求伪造,也被称成为"one click attack"或者session riding,通 ...

  5. asp.netcore mvc 防CSRF攻击,原理介绍+代码演示+详细讲解

    一.CSRF介绍 1.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session ridin ...

  6. ASP.NET MVC中防止跨站请求攻击(CSRF)

    转载   http://kevintsengtw.blogspot.co.nz/2013/01/aspnet-mvc-validateantiforgerytoken.html 在 ASP.NET M ...

  7. Asp.net MVC 3 防止 Cross-Site Request Forgery (CSRF)原理及扩展 安全 注入

    原理:http://blog.csdn.net/cpytiger/article/details/8781457 原文地址:http://www.cnblogs.com/wintersun/archi ...

  8. ASP.NET MVC 防止CSRF攻击

    简介 MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request forgery)攻击的一个措施,它跟XSS(XSS又叫CSS:Cr ...

  9. 如何在asp.net mvc框架及django框架下面避免CSRF

    CSRF 跨站伪造请求 不知CSRF为何物的,可以问下G哥. 在Asp.net MVC平台下,提供了Html.AntiForgeryToken() 方法,我们只需把其放在form的标签内,在浏览器端就 ...

随机推荐

  1. python数据类型之元组类型

    #为何要有元组,存放多个值,元组不可变,更多的是用来做查询 t=(1,[1,2,3],'a',(1,2)) #t=tuple((1,[1,2,3],'a',(1,2))) # print(type(t ...

  2. sql 查询所有作业的详情

    DECLARE @WeekDays TABLE ( freq_interval INT, weekdays ) ) INSERT INTO @WeekDays ,N'星期日 ' UNION ALL , ...

  3. 解决Linux 环境 GLIBCXX_3.4.15' not found问题

    升级Centos系统之后,运行filezilla时,出现如下错误的提示信息: ./filezilla: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15 ...

  4. sitecore 获取item的URL

    给出一个简单的sitecore项: Item item; 该项目本身不包含它的网址.要获取项目的URL,您需要调用static类Sitecore.Links.LinkManager string ur ...

  5. JavaFX-Platform&Screen

    1Platform常用方法有exit().runlater().isSupported() exit(): Stage stage = new Stage(); Stage stage1 = new ...

  6. React(上)

    一.React基础 1.React模板 凡是使用JSX的地方,要加上type="text/babel".引用三个库react.js是React的核心库,react-dom.js提供 ...

  7. angular4实战开发问题——ngclass不起作用

    由于路由机制会导致页面不刷新. 在项目中,很多都是使用click做的路由跳转.ngclass有时候会不起作用, 这个时候我是很盲目的,一开始在考虑是不是书写的问题.ngclass需要有特定的格式?第一 ...

  8. mysql知识点汇总

    1. 数据库的安装 2. 数据库设计需要注意什么 3. SQL语句优化 4. 怎样处理慢查询? 5. 怎样更好的利用数据库索引? 6. 事务隔离级别有哪些?怎么实现的? 7. 数据库锁有哪些? 8. ...

  9. 堆排序 P1090 合并果子

    P1090 合并果子 本题要用到堆 一个小根堆 每次取出两堆,合并成一堆,为了让多多花费体力最少,我们要尽量少的重复大堆的合并,因此每次合并完以后,要把新的一坨放到堆里排一排,维护一个堆 有必要强调一 ...

  10. JS 页面表格的操作

    var showObj = null;var arr = [ ['编号','姓名','性别','年龄','备注','操作'], ['1','lisi','nan','12','66666'], ['2 ...