Запрет ссылок на веб-сайт и адреса электронной почты в форме при нажатии «Отправить» - PullRequest
1 голос
/ 10 мая 2009

Люди,

У меня есть HTML-форма, которая отправляет данные формы по электронной почте. К сожалению, спам-боты заполняют форму и отправляют ссылки на веб-сайты и адреса электронной почты в части сообщения формы.

Есть ли способ удалить ссылки на веб-сайт и адреса электронной почты, если нажать кнопку «Отправить» до того, как она будет отправлена ​​в качестве адреса электронной почты? Я использую PHP для фактической отправки данных формы в виде сообщения электронной почты.

Спасибо и всего наилучшего,

Tony

Ответы [ 8 ]

6 голосов
/ 10 мая 2009

Вы пытались иметь скрытую форму через css (отображать: нет), но в HTML, как обычную форму, и называть ее электронной почтой или чем-то общим, и если эта форма содержит данные, то она должна бот.

0 голосов
/ 12 мая 2009

Это очень упрощенно, но я уверен, что вы могли бы основываться на этом ...

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

0 голосов
/ 10 мая 2009

Люди,

Я пытался использовать strip_tags, который, безусловно, удаляет теги, но не удаляет текст "mailto:" или "http://", поэтому ссылки по-прежнему являются ссылками.

Существует ли простая команда или процедура PHP, которая может сканировать строку и просто заменять "mailto:" и / или "http://" на безопасную пустую строку" "в этих частях строки?

Пробовал тоже гуглить, но большинство вещей, которые я нашел, касалось обрезки пробелов и т. Д.

Извините, я новичок в PHP.

Спасибо и всего наилучшего,

Tony

0 голосов
/ 10 мая 2009

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

Я также от всей души рекомендую включить сценарий защиты от внедрения заголовка .

0 голосов
/ 10 мая 2009

Ну, если вы действительно хотите бороться со спамом, сделайте следующее:

  1. Поместите капчу в форму, чтобы не люди не могли даже отправить форму. Очень популярная реализация CAPTCHA - reCAPTCHA .

  2. Сделайте strip_tags для полей, чтобы, даже если кто-то поместит URL-адреса вручную, он будет удален.

  3. Проведите регулярное выражение проверки адресов электронной почты и удалите их. Выберите в сети хорошее выражение регулярного выражения, которое выберет большинство форматов электронной почты.

Надеюсь, это поможет. Ура!

0 голосов
/ 10 мая 2009

Вам придется перебирать каждое поле в массиве $ _POST (по крайней мере, те, в которые вы не хотите добавлять электронные письма или ссылки) и проверять его по паре регулярных выражений.

Предложение использовать CAPTCHA также является хорошим.

В любом случае, вот дурацкая реализация проверки:

class ValidationHelper
{
    // Regex taken from https://github.com/google-code-export/prado3/blob/master/framework/Web/UI/WebControls/TEmailAddressValidator.php
    const EMAIL_REGEX = "#\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*#";

    // hacked up regex that I just cooked up - could be hugely improved i'm sure.
    const LINK_REGEX = "#(h\s*t\s*t\s*p\s*s?|f\s*t\s*p)\s*:\s*/\s*/#";

    public static function containsEmail($value)
    {
        if (preg_match(self::EMAIL_REGEX, $value))
            return true;

        return false;
    }

    public static function containsLink($value)
    {
        if (preg_match(self::LINK_REGEX, $value))
            return true;

        return false;
    }
}

$errors = array();
foreach ($_POST as $key=>$value) {
    // presumably you want at least one email field, yeah?
    if ($key != 'email') {
        // perhaps you should be running strip_tags over everything if you don't want html and such...
        // see http://php.net/strip_tags for more info. without it (or something similar), there's nothing 
        // to stop people from putting <script type="text/javascript" src="http://notyourdomain.com/~1337skriptkiddy/haxxors.js"></script>
        // into your form. even if you might not necessarily ever be displaying this in a scenario
        // where it can cause trouble, it's never a bad idea to stop this stuff *before* it gets into your db
        $_POST[$key] = $value = strip_tags($value);
        if (ValidationHelper::containsEmail($value) || ValidationHelper::containsLink($value))
            $errors[] = 'Please ensure the value you entered for '.$fieldNames[$key].' does not contain any links or email addresses';
    }
}

if (!empty($errors)) {
    // failed - show errors.
}
else {
    // success!
}
0 голосов
/ 10 мая 2009

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

Вам придется отфильтровать его на сервере. Лично я просто отклонил бы любое сообщение, содержащее ссылки или адреса электронной почты. Выкладывайте ошибку пользователю, но даже не сохраняйте ее.

Чтобы получить советы по обнаружению спама в PHP, прочитайте Свободные от спама формы .

Вы также можете рассмотреть возможность использования CAPTCHA.

0 голосов
/ 10 мая 2009

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

Вы можете найти примеры регулярных выражений в Интернете, просто погуглите их

...