ASP.NET MVC CSRF (XSRF) security
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的更多相关文章
- .NET MVC CSRF/XSRF 漏洞
最近我跟一个漏洞还有一群阿三干起来了…… 背景: 我的客户是一个世界知名的药企,最近这个客户上台了一位阿三管理者,这个货上线第一个事儿就是要把现有的软件供应商重新洗牌一遍.由于我们的客户关系维护的非常 ...
- CSRF in asp.net mvc and ap.net core
如果在方法上添加了[ValidateAntiForgeryToken],没处理好 请求没有带参数 2019-09-17 14:02:45,142 ERROR [36]: System.Web.Mvc. ...
- ASP.NET MVC防范CSRF最佳实践
XSS与CSRF 哈哈,有点标题党,但我保证这篇文章跟别的不太一样. 我认为,网站安全的基础有三块: 防范中间人攻击 防范XSS 防范CSRF 注意,我讲的是基础,如果更高级点的话可以考虑防范机器人刷 ...
- Asp.net MVC 如何防止CSRF攻击
什么是CSRF攻击? CSRF(Cross-site request forgery跨站请求伪造,也被称成为"one click attack"或者session riding,通 ...
- asp.netcore mvc 防CSRF攻击,原理介绍+代码演示+详细讲解
一.CSRF介绍 1.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session ridin ...
- ASP.NET MVC中防止跨站请求攻击(CSRF)
转载 http://kevintsengtw.blogspot.co.nz/2013/01/aspnet-mvc-validateantiforgerytoken.html 在 ASP.NET M ...
- Asp.net MVC 3 防止 Cross-Site Request Forgery (CSRF)原理及扩展 安全 注入
原理:http://blog.csdn.net/cpytiger/article/details/8781457 原文地址:http://www.cnblogs.com/wintersun/archi ...
- ASP.NET MVC 防止CSRF攻击
简介 MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request forgery)攻击的一个措施,它跟XSS(XSS又叫CSS:Cr ...
- 如何在asp.net mvc框架及django框架下面避免CSRF
CSRF 跨站伪造请求 不知CSRF为何物的,可以问下G哥. 在Asp.net MVC平台下,提供了Html.AntiForgeryToken() 方法,我们只需把其放在form的标签内,在浏览器端就 ...
随机推荐
- python数据类型之元组类型
#为何要有元组,存放多个值,元组不可变,更多的是用来做查询 t=(1,[1,2,3],'a',(1,2)) #t=tuple((1,[1,2,3],'a',(1,2))) # print(type(t ...
- sql 查询所有作业的详情
DECLARE @WeekDays TABLE ( freq_interval INT, weekdays ) ) INSERT INTO @WeekDays ,N'星期日 ' UNION ALL , ...
- 解决Linux 环境 GLIBCXX_3.4.15' not found问题
升级Centos系统之后,运行filezilla时,出现如下错误的提示信息: ./filezilla: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15 ...
- sitecore 获取item的URL
给出一个简单的sitecore项: Item item; 该项目本身不包含它的网址.要获取项目的URL,您需要调用static类Sitecore.Links.LinkManager string ur ...
- JavaFX-Platform&Screen
1Platform常用方法有exit().runlater().isSupported() exit(): Stage stage = new Stage(); Stage stage1 = new ...
- React(上)
一.React基础 1.React模板 凡是使用JSX的地方,要加上type="text/babel".引用三个库react.js是React的核心库,react-dom.js提供 ...
- angular4实战开发问题——ngclass不起作用
由于路由机制会导致页面不刷新. 在项目中,很多都是使用click做的路由跳转.ngclass有时候会不起作用, 这个时候我是很盲目的,一开始在考虑是不是书写的问题.ngclass需要有特定的格式?第一 ...
- mysql知识点汇总
1. 数据库的安装 2. 数据库设计需要注意什么 3. SQL语句优化 4. 怎样处理慢查询? 5. 怎样更好的利用数据库索引? 6. 事务隔离级别有哪些?怎么实现的? 7. 数据库锁有哪些? 8. ...
- 堆排序 P1090 合并果子
P1090 合并果子 本题要用到堆 一个小根堆 每次取出两堆,合并成一堆,为了让多多花费体力最少,我们要尽量少的重复大堆的合并,因此每次合并完以后,要把新的一坨放到堆里排一排,维护一个堆 有必要强调一 ...
- JS 页面表格的操作
var showObj = null;var arr = [ ['编号','姓名','性别','年龄','备注','操作'], ['1','lisi','nan','12','66666'], ['2 ...