Хорошая форма безопасности - без капчи - PullRequest
34 голосов
/ 09 апреля 2010

Есть ли хороший метод защиты форм, который включает not CAPTCHA? CAPTCHA очень раздражает, но мне нужна безопасность, потому что я получаю спам от форм. Моя форма PHP.

Ответы [ 9 ]

40 голосов
/ 09 апреля 2010

Вот что я нашел очень эффективным (и очень простым):

  1. Поместите скрытое поле в форму. Дайте ему имя, например «телефон» или что-то похожее / общее, и укажите значение по умолчанию для нежелательной почты.

  2. Поместите другое обычное поле ввода текста в форму, но скройте его с помощью CSS. Сделай это пустым. Опять же, дайте ему "настоящее" звучащее имя (имя, номер телефона, что угодно).

  3. Когда форма опубликована, убедитесь, что скрытое поле по-прежнему имеет значение по умолчанию, а поле, которое вы скрыли с помощью CSS, по-прежнему пусто.

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

ETA: Чтобы ответить на некоторые комментарии - действительно ли это «безопасная» система? нет, конечно нет Любой, кто хотел бы специально настроить таргетинг на ваш сайт, будет тривиально нарушен. Тем не менее, он по-прежнему удивительно эффективен против автоматических спам-ботов, которые увидит большинство сайтов с «низкой стоимостью».

Если вы хотите остановить решительного нападающего, вам нужно что-то более агрессивное. Другой постер упомянул Akismet, что является хорошим вариантом. Ре-капча была бы другой. Остановить решительные, целевые спамеры сложно. Даже Yahoo и Google испытывают трудности с этим.

16 голосов
/ 09 апреля 2010

Попробуйте Акисмет . Отлично подходит для пометки спама. API прост в использовании и полностью прозрачен для ваших пользователей.

12 голосов
/ 09 апреля 2010

Этот вид валидатора милый и быстрый!

CAT BOX http://i39.tinypic.com/157ln4.gif

Очевидно, вы захотите отобразить одно из множества возможных изображений животных, и список также должен быть рандомизирован.

Я понимаю, что это будет работать только X% времени, но добавление дополнительных параметров в список поможет уменьшить количество спама.

2 голосов
/ 09 апреля 2010

У меня уже работало нечто подобное.

  1. Когда вы открываете форму, сгенерируйте одну строку md5 () и поместите ее в сеанс (например, $ _SESSION ['captha'])
  2. Ваша форма должна иметь одно скрытое поле, и при открытии этой формы запишите эти данные из $ _SESSION ['captha'] в это скрытое поле
  3. Когда вы получаете этот почтовый запрос, сравнивайте значение в сеансе и значение, которое идет с этим скрытым полем. Если это то же самое, все в порядке, и наоборот. Конечно, после обработки этого запроса просто удалите переменную $ _SESSION ['captha'].

Эта работа для меня.

1 голос
/ 24 сентября 2014

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

Я тестировал его на своих сайтах в течение года, затем заметил, что Google также использует его.

Я выпустил его для Joomla (см. http://shop.ekerner.com/index.php/shop/joomla-nocaptcha-detail) и так как он был скопирован многими платформами (см. https://www.google.com.au/search?q=nocaptcha).

Я полагаю, что размещенная на git версия по вышеуказанной ссылке может быть развернута на любом сайте, и, если вы не можете найти версию для своего сайта, возможно, обратитесь к моей команде разработчиков за индивидуальным решением (см .: http://www.ekerner.com/) .

1 голос
/ 09 апреля 2010

Если все, что вы делаете, это избегаете спам-ботов (автоматизированные программы, которые ищут теги <form>, заполняют все поля <input>, а затем отправляют форму), тогда простое решение - сделать, как сказал Паоло: использовать JavaScript для добавить скрытое поле. Недостаток для людей, которые отключают JavaScript.

Не стесняйтесь использовать это:

<form method="post" action="contact.php" id="commentForm">
  <label for="name">Name</label>
  <input type="text" name="name" id="name" maxlength="64" /><br />

  <label for="email">Email</label>
  <input type="text" name="email" id="email" maxlength="320" /><br />

  <label for="message">Message</label>
  <textarea name="message" rows="10" cols="40" id="Message"></textarea><br />

  <label for="human">40 + 2 =</label>
  <input type="text" name="human" id="human" size="10" maxlength="3" /><br />

  <p align="center">
  <input type="submit" name="submit" value="Send" class="submit-button" />
  </p>
</form>

Затем поместите следующее как "contact.php" в тот же каталог:

<?php
require_once 'lib/swift_required.php';

// Reason for not contacting.
//
$reason = 'default';

error_reporting( 0 );
ini_set( 'display_errors', 0 );

function not_contacted() {
  global $reason;

  header( 'Location: error.html' );
}

function wms_error_handler($errno, $errstr, $errfile, $errline) {
  not_contacted();
  return true;
}

function wms_shutdown() {
  if( is_null( $e = error_get_last() ) === false ) {
    not_contacted();
  }
}

set_error_handler( "wms_error_handler" );
register_shutdown_function( 'wms_shutdown' );

$name = trim( $_POST["name"] );
$email = trim( $_POST["email"] );
$message = trim( $_POST["message"] );
$human = trim( $_POST["human"] );
$subject = 'FormSpam';
$contacted = false;

if( is_null( $name ) || empty( $name ) ) {
  $reason = 'name';
  $human = false;
}
else if( is_null( $email ) || empty( $email ) ) {
  $reason = 'email';
  $human = false;
}
else if( is_null( $message ) || empty( $message ) ) {
  $reason = 'message';
  $human = false;
}
else if( is_null( $human ) || empty( $human ) || $human !== '42' ) {
  $reason = 'computer';
  $human = false;
}

if( $human === '42' ) {
  $subject = 'YourCustomSubject - '.$name;

  $transport = Swift_SmtpTransport::newInstance( 'localhost', 25 );
  $mailer = Swift_Mailer::newInstance( $transport );

  $message = stripslashes( $message );

  $message = Swift_Message::newInstance()
    ->setSubject( $subject )
    ->setFrom( array( $email => $name ) )
    ->setTo( array( 'YourEmailAddress' => 'Your Name' ) )
    ->setPriority( 1 )
    ->setBody( $message )
  ;

  if( $mailer->send( $message ) ) {
    header( 'Location: contacted.html' );
    $contacted = true;
  }
}

if( $contacted === false ) {
  not_contacted();
}
?>

Должен предотвратить 99% спама.

Я не добавил константы, но я уверен, что вы можете выяснить, где изменить скрипт. Я удалил часть, где он перенаправляет на разные страницы, в зависимости от того, что было (или не было) введено пользователем (например, отсутствует полное имя, адрес электронной почты, сообщение и т. Д.). Если вам нужна полная версия скрипта, дайте мне знать, и я исправлю код, чтобы сделать его более удобным для разработчиков.

Обратите внимание на зависимость Swift Mailer .

0 голосов
/ 01 августа 2013

Если сокращение спама является насущной необходимостью, размещение формы в iframe было для меня эффективным.

<iframe src="contactform.php" scrolling="no" height="*"  width="*"></iframe>

Установите высоту и ширину рамки немного больше, чем ширина и высота вашей формы. Используйте CSS, чтобы установить рамку рамки 0, чтобы пользователи не заметили, что смотрят на форму внутри фрейма.

0 голосов
/ 09 апреля 2010

Зависит от типа спама в форме, обычные боты, созданные для рассылки спама в любой найденной форме, легко могут быть сорваны с помощью гораздо меньших препятствий (например, «как называется этот сайт?»), Но если кто-то сделал бот, нацеленный на ваш сайт, вам понадобятся капчи или что-то такое же раздражающее.

0 голосов
/ 09 апреля 2010

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

Вот пара плагинов:

http://www.codegravity.com/projects/mathguard

http://sw -guide.de / WordPress / плагины / математика-комментарий-спам защита /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...