【发布时间】:2012-02-28 02:12:27
【问题描述】:
我创建了一个新的 asp.net 站点(Web 表单,c#),并希望确保它能够防止垃圾邮件通过文本框进入数据库。有没有人有任何关于如何实现这个的好链接?
谢谢
【问题讨论】:
标签: c# asp.net spam-prevention
我创建了一个新的 asp.net 站点(Web 表单,c#),并希望确保它能够防止垃圾邮件通过文本框进入数据库。有没有人有任何关于如何实现这个的好链接?
谢谢
【问题讨论】:
标签: c# asp.net spam-prevention
我为此使用 ReCaptcha。 您可以从nuget 下载或安装
Install-Package recaptcha
通过包管理控制台命令
public class NoCache : ActionFilterAttribute
{
public class CaptchaValidatorAttribute : ActionFilterAttribute
{
private const string CHALLENGE_FIELD_KEY = "recaptcha_challenge_field";
private const string RESPONSE_FIELD_KEY = "recaptcha_response_field";
private const string CAPTCHA_MODEL_KEY = "Captcha";
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var captchaChallengeValue = filterContext.HttpContext.Request.Form[CHALLENGE_FIELD_KEY];
var captchaResponseValue = filterContext.HttpContext.Request.Form[RESPONSE_FIELD_KEY];
var captchaValidtor = new Recaptcha.RecaptchaValidator
{
PrivateKey = "key",
RemoteIP = filterContext.HttpContext.Request.UserHostAddress,
Challenge = captchaChallengeValue,
Response = captchaResponseValue
};
var recaptchaResponse = captchaValidtor.Validate();
if (!recaptchaResponse.IsValid)
{
filterContext.Controller
.ViewData.ModelState
.AddModelError(
CAPTCHA_MODEL_KEY,
"Entered text is invalid");
}
base.OnActionExecuting(filterContext);
}
}
public static class CaptchaExtensions
{
public static string GenerateCaptcha(this HtmlHelper helper)
{
var captchaControl = new Recaptcha.RecaptchaControl
{
ID = "recaptcha",
Theme = "white",
PublicKey = "key",
PrivateKey = "key"
};
var htmlWriter = new HtmlTextWriter(new StringWriter());
captchaControl.RenderControl(htmlWriter);
return htmlWriter.InnerWriter.ToString();
}
}
比你可以使用
@using (Html.BeginForm("activate_user", , FormMethod.Post))
{
@Html.HiddenFor(x => x.Email)
<div class="captcha">
@Html.Raw(@Html.GenerateCaptcha())
<div style="text-align:center; margin-left:-25px;">
@Html.ValidationMessage("Captcha")
</div>
</div>
<input type="submit" class="signUpButton active activation" value="Activate" />
}
在控制器中:
[ActionName("activate_user")]
[CaptchaValidator]
[HttpPost]
public ActionResult ActivateUser(string email)
{
if (ModelState.IsValid && !string.IsNullOrEmpty(email))
{
FormsAuthentication.SetAuthCookie(email, false);
Repository.ActivateUser(email);
}
return View();
}
【讨论】:
如果您没有垃圾邮件,我不会担心。
话虽如此,如果你确实有它,你想知道你收到了什么样的垃圾邮件。假设您对有效输入有限制,则根据模型验证输入应该可以防止大部分情况发生。如果几乎任何事情都可以验证,或者您出于某种原因必须接受所有事情,您可以从蜜罐开始,这是一种简单、非侵入性的方法。
要实现一个蜜罐,你基本上是添加一个字段,用 CSS 隐藏它,并在服务器端验证该字段是否为空。大多数垃圾邮件机器人填写所有字段,这将识别自动提交表单的时间。
如果您发现这在阻止您网站上的所有垃圾邮件方面无效,您需要查看正在通过的垃圾邮件类型,并找到可以阻止这种情况的方法。作为最后的手段,您可以转向侵入性操作,例如 recaptcha。验证码(如Eric Lippert's succinctly states it)的真正问题是他们假设用户有罪,用户试图做坏事,这对您的用户有负面影响。
【讨论】:
我建议您使用 WordPress 的 Growmap Anti-Spam plugin 并将其 Javascript 和 PHP 实现转换为您可以在项目中使用的东西。对于最终用户来说,它不像 CAPTCHA 那样烦人,而且它在阻止我的 WordPress 博客上的自动垃圾邮件方面非常有效。进行 ASP.NET/C# 转换应该没什么大不了的。我开始了一个,但我正在做的项目被取消了,所以我没有完成它。
当然,人工发送垃圾邮件无济于事,因为有人花 5 美元让坐在第三世界网吧的人在几十个网站上胡言乱语。这也是许多其他反垃圾邮件系统(包括 CAPTCHA)的问题。此活动主要是为了获取用于 SEO 目的的链接,因此筛选链接以进行审核或阻止它们被输入可以减少此活动。
【讨论】: