我正在尝试开发一个网站,该网站有一个弹出模式,允许用户订阅我们的最新促销。在该输入中,我们有一个文本框,允许用户输入他们的电子邮件。
但是,当我们查看HTML代码时,HTTP POST URL可见:
如果有人试图使用此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,因此它不起作用,并且相同的防伪令牌可以多次使用,这是不安全的。
答案 0 :(得分:5)
您可以选择以下选项之一来实现您的目标。
1-实施CAPTCHA/re-CAPTCHA
,它将确保无法使用任何工具请求。我知道你不想使用CAPTCHA,我仍然认为你应该使用它,因为它是处理这种情况的最佳方法。
2- 基于IP的限制,锁定从一个IP提交请求一段时间。
3-其他选项可以是 OTP(一次性密码),您可以将OTP发送到电子邮件,只有在成功验证后才能注册电子邮件。
答案 1 :(得分:4)
使用 AntiForgeryToken 。阅读有关Antiforgery Tokens here
的更多信息在您的表格Razor View中,添加@Html.AntiForgeryToken()
作为表单字段。
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
@*Rest of the form*@
}
在您的操作方法中,使用ValidateAntiForgeryTokenAttribute
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit( MyViewModel form)
{
if (ModelState.IsValid)
{
// Rest of ur code
}
}