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的标签内,在浏览器端就 ...
随机推荐
- 《linux就该这么学》第十三节课:第11章和第12章,vsftpd服务与samba和nfs服务
第十一章 (借鉴请改动) 11.1.文件传输协议 FTP文件穿数协议,端口20用于数据传输,21端口用于传输相关FTP命令 ftp协议的两种工作模式: 主动模式:ftp向客户端发起 被动模式(默认): ...
- mongodb和python交互
一.安装pymongo包 sudo pip install pymongo 二.新增数据: 增加一条: from pymongo import MongoClient client = MongoCl ...
- Kindle:自动追更之发送邮件
@echo off setlocal enabledelayedexpansion set from=Kindlekindle设置好信任的邮箱set pw=密码 set to=Kindle邮箱 cd ...
- JQuery小知识
一.禁用鼠标右键 $(document).ready(function() { $(document).bind("contextmenu", function(e) { retu ...
- mysql知识点汇总
1. 数据库的安装 2. 数据库设计需要注意什么 3. SQL语句优化 4. 怎样处理慢查询? 5. 怎样更好的利用数据库索引? 6. 事务隔离级别有哪些?怎么实现的? 7. 数据库锁有哪些? 8. ...
- spring-boot集成activiti的model遇到问题汇总
按照网上的七拼八凑整合网页版的部署将遇到的问题归置如下: 本人的springboot版本是:1.5.13.RELEASE 工作流相关: <!--工作流--> <dependency& ...
- 最新QT4.8+kernel_3.2.5+uboot_2010.06+tslib移植成功-问题小结
2012-02-19 21:34:13 都是从源码下载然后自己修改,使用与TQ2440,之前uboot其实已经完成了.但是yaffs2没带起来.现在回头看来是很简单的了.bootargs参数中我设置成 ...
- charls 抓包
一.HTTPS原理: HTTPS(Hyper Text Transfer Protocol Secure),是一种基于SSL/TLS的HTTP,所有的HTTP数据都是在SSL/TLS协议封装之上进行传 ...
- vmware中centos6.7系统图形化安装Oracle-无法打开RUNINSTALLER
如果解压正确 unzip linux……1/2 unzip linux……2/2 给了权限 chown -R Oracle:oinstall /home/database/ 在oracle用户下,运行 ...
- 基于ROS的人脸识别
#!/usr/bin/env python # -*- coding: utf-8 -*- import rospy import cv2 import numpy as np from sensor ...