как запретить пользователю отправлять контактную форму снова и снова без сеанса со своего IP-адреса в asp.net mvc - PullRequest
0 голосов
/ 25 октября 2018

Я хочу ограничить пользователя от его IP-адреса от отправки контактной формы снова и снова.Как это сделать в asp.net MVC?Кто-нибудь может мне помочь?Я знаю, как получить IP-адрес пользователя, но не знаю, как его использовать, чтобы запретить пользователю повторно отправлять форму

Код моего контроллера

string IP = String.Empty;

System.Web.HttpContext current = System.Web.HttpContext.Current;
string IPAddress = current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

if(!string.IsNullOrEmpty(IPAddress))
{
    string[] valAddress = IPAddress.Split('.');
    if(valAddress.Length != 0)
    {
        IP = valAddress[0];
    }
}

IP = current.Request.ServerVariables["REMOTE_ADDR"];

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Просто добавьте переменную в локальное хранилище HTML5 и проверяйте ее каждый раз, когда пользователь нажимает кнопку.

HTML 5 Local хранит данные в течение неопределенного времени, даже если браузер закрыт и вновь открыт.Но если пользователь очищает локальное хранилище, он может отправить снова.Но, по крайней мере, это уменьшит количество обращений от одного и того же пользователя.

Подробнее о локальном хранилище HTMl5 см. https://www.w3schools.com/html/html5_webstorage.asp

0 голосов
/ 25 октября 2018

Есть несколько способов сделать это.Важный вопрос: какова ваша спецификация работы?

Если вы разрабатываете общедоступный веб-сайт, такой как stackoverflow, facebook и т. Д., Вам следует рассмотреть возможность реализации проверки как на стороне клиента, так и на стороне сервера.Если вы разрабатываете веб-приложение на основе интрасети, проверки на стороне клиента будет достаточно.

Если ваша форма является простой формой обратной связи, вы должны использовать Google ReCaptcha для предотвращения автоматических кодов, роботов, для предотвращения взрыва вашей базы данных или электронной почты.

https://www.google.com/recaptcha/intro/v3beta.html

Вот как я могу добиться того, чтобы пользователи не отправляли несколько сообщений.

[HttpPost]
        public ActionResult Index(YourViewModel model)
        {
            #region backend validation

            if (
                !GoogleReCAPTCHAHelper.Check(Request["g-recaptcha-response"],
                    ConfigurationManager.AppSettings["GoogleReCAPTCHASecret"]))
            {
                ModelState.AddModelError(string.Empty, "You have to confirm that you are not robot!");
                return View(model);
            }

            if ((from file in model.Files where file != null select file.FileName.Split('.')).Any(arr => arr[arr.Length - 1].ToLower() != "pdf"))
            {
                ModelState.AddModelError(string.Empty, "We only accept PDF files!");
                return View(model);
            }
            if (model.Files.Count() > 2)
            {
                ModelState.AddModelError(string.Empty,
                    "You have exceeded maximum file upload size. You can upload maximum 2 PDF file!");
                return View(model);
            }

            //// this stops the applicant sending the application multiple times within 5 minutes of a submition
            DateTime? lastSubmission = null;
            if (Request.Cookies["LastSubmission"] != null)
                lastSubmission = Convert.ToDateTime(Request.Cookies["LastSubmission"].Value);
            if (lastSubmission.HasValue && DateTime.Now < lastSubmission.Value.AddMinutes(5))
            {
                ModelState.AddModelError(string.Empty,
                    "ERROR: Your application has not been sent. This is due to receiving an application from you within the last five minutes. If you have made an error and wish to resend your application, please wait five minutes and then complete the application again.");
                return View(model);
            }

            if (!ModelState.IsValid)
            {
                ModelState.AddModelError(string.Empty, "Something went wrong!");
                return View(model);
            }

            #endregion
}

PS: model.Files - IEnumerable<HttpPostedFileBase>

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

А вот пример JavaScript для проверки.

function sendForm() {

    if (grecaptcha.getResponse() === "") {
        event.preventDefault();
        $("#robotErrorDiv").slideDown();
        return false;
    } else {
        $("#robotErrorDiv").slideUp();
    }

    $("#myForm").validate();
    if ($("#myForm").valid()) {
        $("#loaderGif").fadeIn();
        $("#submitButton").text("Sending...").attr("disabled", "disabled");
        $("#myForm").submit();
    }
    return true;
}
...