如何防止人们将HTTP POST循环到函数中?

时间:2018-04-29 09:05:00

标签: c# .net asp.net-mvc

我正在尝试开发一个网站,该网站有一个弹出模式,允许用户订阅我们的最新促销。在该输入中,我们有一个文本框,允许用户输入他们的电子邮件。

但是,当我们查看HTML代码时,HTTP POST URL可见:

enter image description here

如果有人试图使用此URL和垃圾邮件HTTP POST请求(见下文),则可以在subscriber数据库表中创建无限条目。

for (int a = 0; a < 999999; a++)
{
    var values = new Dictionary<string, string>
    {
        { "email", a+"@gmail.com" }
    };

    var content = new FormUrlEncodedContent(values);
    var response = await client.PostAsync("http://www.example.com/recepticle.aspx", content);
    var responseString = await response.Content.ReadAsStringAsync();
}

如何防止这种情况发生?我们不能加盖,因为这是我们促销的订户。

编辑:请注意,ANTI伪造令牌无效,因为黑客可以使用GET下载整个HTML字符串,并从防伪令牌文本框中获取值并将值POST再次使用POST URL,因此它不起作用,并且相同的防伪令牌可以多次使用,这是不安全的。

2 个答案:

答案 0 :(得分:5)

您可以选择以下选项之一来实现您的目标。

1-实施CAPTCHA/re-CAPTCHA,它将确保无法使用任何工具请求。我知道你不想使用CAPTCHA,我仍然认为你应该使用它,因为它是处理这种情况的最佳方法。

2- 基于IP的限制,锁定从一个IP提交请求一段时间。

3-其他选项可以是 OTP(一次性密码),您可以将OTP发送到电子邮件,只有在成功验证后才能注册电子邮件。

答案 1 :(得分:4)

使用 AntiForgeryToken 。阅读有关Antiforgery Tokens here

的更多信息
  1. 在您的表格Razor View中,添加@Html.AntiForgeryToken()作为表单字段。

    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
    
        <div class="form-horizontal">
            @*Rest of the form*@
    }
    
  2. 在您的操作方法中,使用ValidateAntiForgeryTokenAttribute

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit( MyViewModel form)
    {
        if (ModelState.IsValid)
        {
           // Rest of ur code
        }
     }