【问题标题】:Preventing scripted POST in ASP.NET MVC防止在 ASP.NET MVC 中编写脚本 POST
【发布时间】:2018-02-26 08:43:17
【问题描述】:

在我的 ASP.NET MVC 项目中,用户可以在屏幕上保存一个向服务器发出 HTTP POST 请求的表单。

如何防止客户端向服务器发送自动 HTTP POST。 IIS 或 web.config 上是否有任何内置方式来阻止异常请求率?

例如,“基于会话 ID,1 分钟内的请求计数不能超过 30”之类的设置可能会有所帮助。

验证码控制对我来说不是一个好选择。因为屏幕上有很多保存选项,每个都设置验证码是没有用的。

【问题讨论】:

标签: asp.net asp.net-mvc iis


【解决方案1】:

不完全符合您的要求,但您可以使用会话变量来限制表单被发布,除非该表单被首次请求,并防止被多次提交。

在您的表单页面上,生成一个随机数:

Random rnd = new Random();
int key = rnd.Next(100000, 999999);

用这个数字作为名字创建一个会话变量,像这样:

Session["key_"+ key.ToString()] = true;

在您的表单中添加一个带有此编号的隐藏字段:

<input name="key" type="hidden" value="@key" />

在表单发布时获取隐藏字段值并检查会话变量是否存在。然后删除会话变量,使表单无法重新提交:

int key = 0;
int.TryParse(Request.Form["key"] ?? string.Empty, out key);

if (Session["key_" + key.ToString()] == null)
{
    //invalid post, take some action
    //best to return the user to the form and give them another chance
    //in case it was legitimate, eg. session timed out 
}
else
{
    Session.Contents.Remove("key_" + key.ToString());
}

【讨论】:

    【解决方案2】:

    您可以在您的 post 操作方法上使用名为 AntiForgeryToken 的 mvc 属性,它会生成一个加密值和用于验证您的帖子是否真实的盐。

    查看此链接

    https://msdn.microsoft.com/en-us/library/dd470175(v=vs.118).aspx

    【讨论】:

      猜你喜欢
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2011-11-08
      • 2016-12-21
      • 1970-01-01
      • 2017-04-02
      相关资源
      最近更新 更多