MVC 防止CSRF -- AntiForgeryToken

1. 标配版 

Home.cshtml

<form method='POST' action='Home/Subscribe' >
    @Html.AntiForgeryToken()
<input type="email" />
<input type="submit" value="Subscribe" /> </form>

HomeController

1 [HttpPost]
2 [ValidateAntiForgeryToken]
4 public ActionResult Subscribe(string email)
5 {
6 }

form method ='POST', @Html.AntiForgeryToken() ,[HttpPost], [ValidateAntiForgeryToken]  缺一不可

原理: 

@Html.AntiForgeryToken() 会在页面生成如下name='__RequestVerificationToken' 的input, value 是随机字符串,每次刷新页面会不一样。 如下

 

1 <input name="__RequestVerificationToken" value="cMNPTS8iRvJuznErspwm+G/vd1Iec0/egpX4j8trlQtvWE9RMiifCd3/eNUzLCoi+m/w4qI2HbqkvHV7Js8WBeFbl3XWVbva4RjE2eSQHu+8xx5391x1W86ZbtSFdZp98h7cV3Dp/9erZjy5p2LO4LKvGEyGW3Dz73YTiNJSTwU=" type="hidden">

 

 

form POST提交会将表单内的数据加入request body , 所以 __RequestVerificationToken 也会在request 中。 同时request 里会有一个 __RequestVerificationToken_lw_ 的cookie, cookie的值是经过加密的,所以会跟页面上取到的值不一样。到了Server 端,[HttpPost]接收POST数据,[ValidateAntiForgeryToken] check request __RequestVerificationToken  和cookie 的值是否一致。如果一致执行Action, 不一致页面提示需要AntiforgeryToken.

2.非标配版

@Html.AntiForgeryToken()不一定放到form里, 但是必须手动把__RequestVerificationToken 值从页面取出放到request里, 从网上查的资料是RequestVerificationToken  可以放到body 和header 里都行, 但我自己试了一下,只有body里起了作用

 

var token = $('[name=__RequestVerificationToken]').val();
var mailAddress=$('.email input').val();
$.ajax({
  type:
'POST', url: '/Home/Subscribe', cache: false, data: { __RequestVerificationToken: token, email: mailAddress }, dataType: 'json', success: function (result) { }, error: function () {} });

 

转载于:https://www.cnblogs.com/pangxiaohai/p/6031263.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值