utilizar tutorial recaptchalib google example como php security forms

php - tutorial - Buena seguridad de formulario: sin CAPTCHA



recaptcha v3 tutorial (9)

¿Existe un buen método de seguridad de formularios que not involucre a CAPTCHA? CAPTCHA es tan molesto, pero necesito seguridad porque recibo correo no deseado. Mi forma es PHP.


¡Este tipo de validador es lindo y rápido!

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

Obviamente, querrás mostrar una de las muchas posibles imágenes de animales, y la lista debe ser aleatorizada también.

Entiendo que solo funcionará X% de las veces, pero agregar más opciones a la lista ayudará a reducir el correo no deseado.


Depende del tipo de spam de formulario, los bots generales creados para enviar spam de cualquier forma que encuentre pueden frustrarse fácilmente con medidas mucho menos obstructivas (como "¿cómo se llama este sitio?"), Pero si alguien ha creado un bot que se dirija a su sitio específicamente necesitarás captchas o algo igualmente molesto.


Esto es lo que he encontrado que es muy efectivo (y simple):

  1. Pon un campo oculto en tu formulario. Dale un nombre como "teléfono" o algo similar / común y ponle un valor no deseado predeterminado.

  2. Coloque otro campo de entrada de texto regular en su formulario, pero ocúltelo con CSS. Haz que ese vacío. De nuevo, dele un nombre de sonido "real" (first_name, phone_number, whatever).

  3. Cuando se publique el formulario, verifique que el campo oculto todavía tenga el valor predeterminado y que el campo que ocultó con CSS aún esté vacío.

Básicamente se está aprovechando el hecho de que la mayoría de los robots de correo no deseado simplemente rellenarán todos los campos del formulario para evitar errores en las comprobaciones de validación de campo requeridas. Algunos pueden ser lo suficientemente inteligentes como para ignorar los campos ocultos, pero nunca he visto uno que sea lo suficientemente inteligente como para ignorar los campos ocultos con CSS.

ETA: Para abordar algunos comentarios: ¿Es este un sistema verdaderamente "seguro"? no, ciertamente no lo es. Sería trivialmente roto por cualquiera que quisiera apuntar específicamente a su sitio. Dicho esto, todavía es notablemente efectivo contra los robots de spam de forma automática que la mayoría de los sitios de "bajo valor" verán.

Si quieres detener a un atacante determinado, necesitarás algo un poco más invasivo. Otro cartel menciona a Akismet, que es una buena opción. Re-Captcha sería otro. Sin embargo, detener los spammers determinados y dirigidos es difícil. Incluso Yahoo y Google pasan mal con él.



Prueba akismet . Es excelente para marcar spam. La API es fácil de usar y completamente transparente para sus usuarios.


Sí, inventé y desarrollé un método hace muchos años llamado nocaptcha.

Probé su uso en mis sitios durante un año y noté que google también lo usaba.

Lo lancé para Joomla (ver http://shop.ekerner.com/index.php/shop/joomla-nocaptcha-detail ) y ya ha sido copiado por muchas plataformas (ver https://www.google.com.au/search?q=nocaptcha ).

Creo que la versión hospedada de git a través del enlace anterior se puede implementar en cualquier sitio, y si no puede encontrar una versión para su sitio, entonces quizás le pida a mi equipo de desarrollo una solución personalizada (consulte: http://www.ekerner.com/ )


Si reducir el spam es la necesidad inmediata, poner el formulario en un iframe ha sido efectivo para mí.

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

Establezca la altura y el ancho del marco un poco más grande que el ancho y alto de su formulario. Use CSS para hacer el borde del marco 0 para que los usuarios no se den cuenta de que están mirando el formulario dentro del marco.


Si todo lo que está haciendo es evitar los bots de spam (programas automatizados que buscan etiquetas <form> , complete todos <input> campos <input> , luego envíe el formulario), entonces una solución simple es hacer lo que dijo Paolo: use JavaScript para agregar un oculto campo. La desventaja es para las personas que deshabilitan JavaScript.

Siéntase libre de usar esto:

<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>

A continuación, coloque lo siguiente como "contact.php" en el mismo directorio:

<?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(); } ?>

Debería evitar el 99% de spam.

No he agregado constantes, pero estoy seguro de que puede averiguar dónde cambiar el script. Eliminé la parte donde redirige a diferentes páginas, dependiendo de qué fue (o no) ingresado por el usuario (por ejemplo, falta el nombre completo, la dirección de correo electrónico, el mensaje, etc.). Si quieres una versión completa del guión, házmelo saber y corregiré el código para que sea más amigable con el desarrollador.

Tenga en cuenta la dependencia de Swift Mailer .


Ya he trabajado algo similar.

  1. Cuando abre un formulario, genere un string md5 () y póngalo en sesión (por ejemplo $ _SESSION [''captha''])
  2. Su formulario debe tener un campo oculto y cuando abra este formulario, escriba estos datos desde $ _SESSION [''captha''] en este campo oculto
  3. Cuando reciba esta solicitud de publicación, compare el valor en sesión y el valor que se incluyen con este campo oculto. Si es lo mismo, todo está bien y viceversa. Por supuesto, después de manejar esta solicitud simplemente borre la variable $ _SESSION [''captha''].

Este trabajo para mí.