记得ajax中要带上AntiForgeryToken防止CSRF攻击
经常看到在项目中ajax post数据到服务器不加防伪标记,造成CSRF攻击
在Asp.net Mvc里加入防伪标记很简单在表单中加入Html.AntiForgeryToken()即可。
Html.AntiForgeryToken()会生成一对加密的字符串,分别存放在Cookies 和 input 中。
我们在ajax post中也带上AntiForgeryToken
- @model WebApplication1.Controllers.Person
- @{
- ViewBag.Title = "Index";
- }
- <h2>Index</h2>
- <form id="form1">
- <div class="form-horizontal">
- <h4>Persen</h4>
- <hr />
- @Html.ValidationSummary(true, "", new { @class = "text-danger" })
- <div class="form-group">
- @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
- <div class="col-md-10">
- @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
- @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
- </div>
- </div>
- <div class="form-group">
- @Html.LabelFor(model => model.Age, htmlAttributes: new { @class = "control-label col-md-2" })
- <div class="col-md-10">
- @Html.EditorFor(model => model.Age, new { htmlAttributes = new { @class = "form-control" } })
- @Html.ValidationMessageFor(model => model.Age, "", new { @class = "text-danger" })
- </div>
- </div>
- <div class="form-group">
- <div class="col-md-offset-2 col-md-10">
- <input type="button" id="save" value="Create" class="btn btn-default" />
- </div>
- </div>
- </div>
- </form>
- <script src="~/Scripts/jquery-1.10.2.min.js"></script>
- <script src="~/Scripts/jquery.validate.min.js"></script>
- <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
- <script type="text/javascript">
- $(function () {
- //var token = $('[name=__RequestVerificationToken]');
- //获取防伪标记
- var token = $('@Html.AntiForgeryToken()').val();
- var headers = {};
- //防伪标记放入headers
- //也可以将防伪标记放入data
- headers["__RequestVerificationToken"] = token;
- $("#save").click(function () {
- $.ajax({
- type: 'POST',
- url: '/Home/Index',
- cache: false,
- headers: headers,
- data: { Name: "yangwen", Age: "1" },
- success: function (data) {
- alert(data)
- },
- error: function () {
- alert("Error")
- }
- });
- })
- })
- </script>
放在cookies里面的加密字符串
控制器中代码
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net;
- using System.Web;
- using System.Web.Helpers;
- using System.Web.Mvc;
- namespace WebApplication1.Controllers
- {
- public class HomeController : Controller
- {
- public ActionResult Index()
- {
- return View();
- }
- [HttpPost]
- [MyValidateAntiForgeryToken]
- public ActionResult Index(Person p)
- {
- return Json(true, JsonRequestBehavior.AllowGet);
- }
- }
- public class Person
- {
- public string Name { get; set; }
- public int Age { get; set; }
- }
- 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 cookieValue = antiForgeryCookie != null
- ? antiForgeryCookie.Value
- : null;
- //从cookies 和 Headers 中 验证防伪标记
- //这里可以加try-catch
- AntiForgery.Validate(cookieValue, request.Headers["__RequestVerificationToken"]);
- }
- else
- {
- new ValidateAntiForgeryTokenAttribute()
- .OnAuthorization(filterContext);
- }
- }
- }
- }
- }
这里注释掉ajax中防伪标记在请求
- $("#save").click(function () {
- $.ajax({
- type: 'POST',
- url: '/Home/Index',
- cache: false,
- // headers: headers,
- data: { Name: "yangwen", Age: "" },
- success: function (data) {
- alert(data)
- },
- error: function () {
- alert("Error")
- }
- });
- })
默认返回500的状态码。
这里修改ajax中的防伪标记
- $(function () {
- //var token = $('[name=__RequestVerificationToken]');
- //获取防伪标记
- var token = $('@Html.AntiForgeryToken()').val();
- var headers = {};
- //防伪标记放入headers
- //也可以将防伪标记放入data
- headers["__RequestVerificationToken"] = token+;
- $("#save").click(function () {
- $.ajax({
- type: 'POST',
- url: '/Home/Index',
- cache: false,
- headers: headers,
- data: { Name: "yangwen", Age: "" },
- success: function (data) {
- alert(data)
- },
- error: function () {
- alert("Error")
- }
- });
- })
- })
也是500的状态码。
记得ajax中要带上AntiForgeryToken防止CSRF攻击的更多相关文章
- 切记ajax中要带上AntiForgeryToken防止CSRF攻击
在程序项目中经常看到ajax post数据到服务器没有加上防伪标记,导致CSRF被攻击,下面小编通过本篇文章给大家介绍ajax中要带上AntiForgeryToken防止CSRF攻击,感兴趣的朋友一起 ...
- ajax中加上AntiForgeryToken防止CSRF攻击
经常看到在项目中ajax post数据到服务器不加防伪标记,造成CSRF攻击 在Asp.net Mvc里加入防伪标记很简单在表单中加入Html.AntiForgeryToken()即可. Html.A ...
- 转:MVC Html.AntiForgeryToken() 防止CSRF攻击
(一)MVC Html.AntiForgeryToken() 防止CSRF攻击 MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site requ ...
- MVC Html.AntiForgeryToken() 防止CSRF攻击 - CSDN博客
原文:MVC Html.AntiForgeryToken() 防止CSRF攻击 - CSDN博客 (一)MVC Html.AntiForgeryToken() 防止CSRF攻击 MVC中的Html.A ...
- [ASP.NET MVC]@Html.AntiForgeryToken() 防止CSRF攻击
MVC Html.AntiForgeryToken() 防止CSRF攻击 MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request ...
- [转]MVC Html.AntiForgeryToken() 防止CSRF攻击
[转]MVC Html.AntiForgeryToken() 防止CSRF攻击 本文转自:http://blog.csdn.net/luck901229/article/details/8261640 ...
- MVC Html.AntiForgeryToken() 防止CSRF攻击
转自:http://blog.csdn.net/cpytiger/article/details/8781457 一.MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(C ...
- Html.AntiForgeryToken() 防止CSRF攻击 的AJaX应用
有关Html.AntiForgeryToken()的使用其实网上的说明很多了,比如http://blog.csdn.net/cpytiger/article/details/8781457 那么我们写 ...
- 转载MVC Html.AntiForgeryToken() 防止CSRF攻击
MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request forgery)攻击的一个措施,它跟XSS(XSS又叫CSS:Cross ...
随机推荐
- play项目部署
首先对于现场的数据库,一定要谨慎谨慎再谨慎,特别是保存有重要数据的. 使用expdp命令导入数据库: 事前准备: 1.确保linux服务器上已经正确安装oracle (10g以上版本) 2.有Xshe ...
- UIBarButtonItem变弹簧
UIBarButtonItem * spaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystem ...
- PostgreSQL trigger (function) examples
postgres=# \c warehouse_db You are now connected to database "warehouse_db" as user " ...
- java 获取当前系统系时间
//SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式 SimpleDateFo ...
- ACM之Java速成(4)
ACM中Java.进制转换 Java进制转换: 由于Unicode兼容ASCII(0-255),因此,上面得到的Unicode就是ASCII. java中进行二进制,八进制,十六进制,十进制间进行相互 ...
- 利用MyEclipes的反转工程来配置Hibernate各种配置
首先需要有设计好的数据库,然后创建一个Web Project然后右键点击项目选择MyEclipse→add Hibernate Capabilities →→ →→,然后如果没有管理员的话需要在选择M ...
- ACdream 1157 Segments(CDQ分治)
题目链接:http://acdream.info/problem?pid=1157 Problem Description 由3钟类型操作:1)D L R(1 <= L <= R < ...
- ./fedora_install_oracle.sh bad interpreter
错误原因之一很有可能是你的脚本文件是DOS格式的, 即每一行的行尾以\r\n来标识, 其ASCII码分别是0x0D, 0x0A.可以有很多种办法看这个文件是DOS格式的还是UNIX格式的, 还是MAC ...
- paper 10:支持向量机系列七:Kernel II —— 核方法的一些理论补充,关于 Reproducing Kernel Hilbert Space 和 Representer Theorem 的简介。
在之前我们介绍了如何用 Kernel 方法来将线性 SVM 进行推广以使其能够处理非线性的情况,那里用到的方法就是通过一个非线性映射 ϕ(⋅) 将原始数据进行映射,使得原来的非线性问题在映射之后的空间 ...
- archlinux锁屏
启动管理器用的是 slim 发现锁屏可以用 slimlock