Фильтрация спама: с чего начать - PullRequest
2 голосов
/ 06 февраля 2012

Я создал новый сайт asp.net (веб-формы, c #) и стараюсь защитить его от спама, проникающего через текстовые поля и добавляемого в базу данных.У кого-нибудь есть хорошие ссылки о том, как это реализовать?

Спасибо

Ответы [ 3 ]

3 голосов
/ 06 февраля 2012

Если у вас нет спама, я бы об этом не беспокоился.

Как говорится, если он у вас есть, вы хотите знать, какой спам вы получаете. Проверка входных данных по модели должна предотвратить большинство из них, если у вас есть ограничения на допустимые входные данные. Если что-то подтверждается или вам по какой-то причине нужно принять все, вы можете начать с медового банка, который является простым, не навязчивым методом.

Чтобы реализовать медовый горшок, вы в основном добавляете поле, скрываете его с помощью CSS и проверяете, что это поле равно нулю на стороне сервера. Большинство спам-ботов заполняют все поля, и они идентифицируют, когда что-то автоматизированное отправило форму.

Если вы сочтете это неэффективным для предотвращения спама на вашем сайте, вам нужно посмотреть, какой спам распространяется, и найти что-то, что этому препятствует. В крайнем случае, вы можете перейти к навязчивым действиям, таким как recaptcha. Реальная проблема с CAPTCHA (поскольку Эрик Липперт кратко заявляет это ) заключается в том, что они принимают на себя вину, что пользователь пытается сделать что-то плохое, и это отрицательно влияет на ваших пользователей.

3 голосов
/ 06 февраля 2012

Я использую 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();
    }
0 голосов
/ 06 февраля 2012

Я предлагаю вам взять плагин Growmap Anti-Spam для WordPress и преобразовать его реализацию Javascript и PHP в то, что вы можете использовать в своем проекте. Это не так раздражает, как CAPTCHA для конечных пользователей, и довольно эффективно предотвращает автоматический спам в моих блогах WordPress. Преобразование ASP.NET/C# не должно иметь большого значения. Я начал с одного, но проект, для которого я делал это, был отменен, поэтому я не завершил его.

Конечно, это не поможет с ручным рассылкой спама, когда кто-то платит 5 долларов за то, что кто-то сидит в интернет-кафе третьего мира, чтобы ввести чушь на десятки сайтов. Это также проблема для многих других систем защиты от спама, включая CAPTCHA. Это действие в основном делается для получения ссылок в целях SEO, поэтому отбор ссылок для модерации или предотвращение их ввода может ограничить это действие.

...