垃圾邮件过滤:我从哪里开始

时间:2012-02-06 15:52:53

标签: c# asp.net spam-prevention

我创建了一个新的asp.net网站(网络表单,c#),并希望通过文本框保护垃圾邮件并将其添加到数据库中。有没有人就如何实现这个有任何良好的联系?

由于

3 个答案:

答案 0 :(得分:3)

我使用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();
    }

答案 1 :(得分:3)

如果您没有垃圾邮件,我不会担心。

话虽这么说,但如果你拥有它,你想知道你得到了什么样的垃圾邮件。假设您对有效输入有限制,则根据模型验证输入应该可以防止大部分输入。如果几乎任何有效的东西,或者你必须出于某种原因接受一切,你可以从蜜罐开始,这是一种简单的,非侵入性的方法。

要实现一个蜜罐,你基本上添加一个字段,用CSS隐藏它,并在服务器端验证该字段是否为空。大多数垃圾邮件机器人会填写所有字段,这将确定何时自动提交表单。

如果您发现这对于阻止您网站上的所有垃圾邮件无效,您需要查看正在通过哪种垃圾邮件并找到阻止该垃圾邮件的内容。作为最后的手段,您可以转向侵入性操作,例如recaptcha。 CAPTCHA的真正问题(如Eric Lippert's succinctly states it)是他们认为有罪,用户试图做坏事,这会对用户产生负面影响。

答案 2 :(得分:-3)

我建议您将Growmap Anti-Spam plugin用于WordPress,并将其Javascript和PHP实现转换为您可以在项目中使用的内容。对于最终用户而言,它并不像CAPTCHA那样烦人,而且在我的WordPress博客上停止自动垃圾邮件方面非常有效。执行ASP.NET / C#转换应该不是什么大问题。我开始上一个,但我正在做的项目被取消,所以我没有完成它。

当然,如果有人为坐在第三世界网吧的人在几十个网站上输入废话支付5美元,那么手动垃圾邮件将无济于事。对于包括CAPTCHA在内的许多其他反垃圾邮件系统而言,这也是一个问题。此活动主要是为了获取用于搜索引擎优化目的的链接,因此筛选出适度的链接或阻止它们被输入可以减少此活动。