Есть ли хороший способ защиты формы, который not
включает CAPTCHA? CAPTCHA так раздражает, но мне нужна безопасность, потому что я получаю спам. Моя форма - PHP.
Хорошая форма безопасности - нет CAPTCHA
Ответ 1
Попробуйте akismet. Это замечательно при пометке спама. API прост в использовании и полностью прозрачен для ваших пользователей.
Ответ 2
Вот что я нашел очень эффективным (и мертвым просто):
-
Поместите скрытое поле в свою форму. Дайте ему имя "телефон" или что-то подобное/общее и введите значение нежелательной почты по умолчанию.
-
Поместите другое текстовое поле ввода в форму, но спрячьте его с помощью CSS. Сделайте это пустым. Опять же, дайте ему "настоящее" звучащее имя (first_name, phone_number, что угодно).
-
Когда форма отправлена, убедитесь, что скрытое поле по-прежнему имеет значение по умолчанию, а поле, которое вы скрывали с помощью CSS, по-прежнему пусто.
Вы в основном пользуетесь тем фактом, что большинство спам-ботов просто заполняют каждое поле в форме, чтобы избежать сбоев в каких-либо обязательных проверках проверки поля. Некоторые могут быть достаточно умны, чтобы игнорировать скрытые поля, но я никогда не видел того, что было достаточно умным, чтобы игнорировать поля, скрытые с помощью CSS.
ETA: Чтобы рассмотреть некоторые комментарии - действительно ли это "безопасная" система? нет, конечно нет. Это было бы тривиально нарушено любым, кто хотел бы специально настроить ваш сайт. Тем не менее, он по-прежнему чрезвычайно эффективен против автоматизированных форм спам-ботов, которые будут видны наиболее "низкоценные" сайты.
Если вы хотите остановить определенного атакующего, вам понадобится нечто более инвазивное. Другой плакат упоминал Akismet, что является хорошим вариантом. Re-Captcha был бы другим. Остановить определенные, целевые спамеры трудно. Даже Yahoo и Google с трудом справляются с этим.
Ответ 3
Этот вид валидатора милый и быстрый!
Очевидно, вы захотите отобразить одно из множества возможных изображений животных, и список также должен быть рандомизирован.
Я понимаю, что это будет работать только X% времени, но добавление дополнительных опций в список поможет уменьшить спам.
Ответ 4
Я уже сработал нечто подобное.
- Когда вы открываете форму, генерируете одну строку md5() и помещаете ее в сеанс (например, $_SESSION ['captha'])
- В вашей форме должно быть одно скрытое поле, и когда вы откроете эту форму, напишите эти данные из $_SESSION ['captha'] в это скрытое поле
- Когда вы получите это значение для сравнения в сеансе и значение, которое приходит с этим скрытым полем. Если это то же самое, что и в порядке, и наоборот. Конечно, после обработки этого запроса просто удалите переменную $_SESSION ['captha'].
Эта работа для меня.
Ответ 5
Если вы все делаете, избегайте спам-ботов (автоматические программы, которые ищут теги <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% спама.
Я не добавил константы, но я уверен, что вы можете выяснить, где изменить script. Я удалил часть, в которой она перенаправляется на разные страницы, в зависимости от того, что было (или не было) введено пользователем (например, отсутствует полное имя, адрес электронной почты, сообщение и т.д.). Если вы хотите получить полную версию script, дайте мне знать, и я исправлю код, чтобы он был более новым и удобным для разработчиков.
Обратите внимание на зависимость Swift Mailer.
Ответ 6
Да, я изобрел и разработал метод много лет назад под названием nocaptcha.
Я тестировал, используя его на своих сайтах в течение года, а затем заметил, что 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/).
Ответ 7
Математические вопросы - интересная альтернатива. Вы можете даже написать свою собственную простую математическую проверку, используя случайные числа.
Вот несколько плагинов:
http://www.codegravity.com/projects/mathguard
http://sw-guide.de/wordpress/plugins/math-comment-spam-protection/
Ответ 8
Зависит от типа спама формы, общие боты, созданные для рассылки спама в любой найденной форме, могут быть легко сорваны с помощью гораздо менее обструктивных мер (например, "как называется этот сайт?" ), но если кто-то сделал бот, нацеленный на ваш сайт, вам понадобятся капли или что-то такое же раздражающее.
Ответ 9
Если сокращение спама является непосредственной потребностью, установка формы в iframe была эффективной для меня.
<iframe src="contactform.php" scrolling="no" height="*" width="*"></iframe>
Установите высоту и ширину рамки немного больше, чем ширина и высота формы. Используйте CSS, чтобы сделать рамку border 0, чтобы пользователи не заметили, что они смотрят на форму внутри рамки.