Soy un diseñador web aficionado, busqué en stackoverflow.com y otros sitios web y encontré muchas soluciones para este problema que tengo, pero ninguna funcionó (probablemente porque las implementé incorrectamente). Espero que alguien con más conocimientos pueda ayudarme con una solución simple o mostrarme cómo implementar una de las soluciones que encontré.
El problema: tengo un formulario de contacto php muy simple en el sitio web de mi empresa. Ha funcionado muy bien durante años, pero en la última semana ha sido pirateado. Ahora recibo cientos de envíos de formularios de contacto al día sin comentarios, solo tienen direcciones de correo electrónico (aparentemente válidas) y una cadena de caracteres en el campo de nombre (como "58ee8b52eef46").
He probado varias técnicas para evitar este spam y, o rompen mi formulario php, o no evitan el spam. Si es posible, me gustaría una solución que NO requiera una prueba de texto distorsionado de Captcha, y NO requiera que se completen todos los campos del formulario.
Aquí está mi código PHP completo:
<?php if(isset($_POST['email'])) { $email_to = "myemail@example.com"; $email_subject = "website form submission"; function died($error) { echo "We are very sorry, but there were error(s) found with the form you submitted. "; echo "These errors appear below.<br /><br />"; echo $error."<br /><br />"; echo "Please go back and fix these errors.<br /><br />"; die(); } if (!isset($_POST['name']) || !isset($_POST['email']) || !isset($_POST['telephone']) || !isset($_POST['comments'])) { died('We are sorry, but there appears to be a problem with the form you submitted.'); } $name = $_POST['name']; $email_from = $_POST['email']; $telephone = $_POST['telephone']; $comments = $_POST['comments']; $error_message = ""; if(strlen($error_message) > 0) { died($error_message); } $email_message = "Form details below.\n\n"; function clean_string($string) { $bad = array("content-type","bcc:","to:","cc:","href"); return str_replace($bad,"",$string); } $email_message .= "Name: ".clean_string($name)."\n"; $email_message .= "Email: ".clean_string($email_from)."\n"; $email_message .= "Telephone: ".clean_string($telephone)."\n"; $email_message .= "Comments: ".clean_string($comments)."\n"; $headers = 'From: '.$email_from."\r\n" . 'Reply-To: '.$email_from."\r\n" . 'X-Mailer: PHP/' . phpversion(); @mail($email_to, $email_subject, $email_message, $headers); ?> Thank you for contacting us. We will be in touch with you soon. You will now be redirected back to example.com. <META http-equiv="refresh" content="2;URL=http://www.example.com"> <?php } die(); ?>Un truco simple es crear un campo honeypot:
html
<!-- within your existing form add this field --> <input type="text" id="website" name="website"/>CSS
/*in your css hide the field so real users cant fill it in*/ form #website{ display:none; }php
//in your php ignore any submissions that inlcude this field if(!empty($_POST['website'])) die();Un enfoque aún más simple que funciona para mí. Literalmente, todo el spam que recibo (d) tenía una URL en el mensaje. Así que filtré eso y no he recibido ningún mensaje de spam desde entonces. Solía recibir unos 10 a la semana.
Agregue esto debajo de su línea $error_message = ""; en su archivo php:
if(preg_match('/http|www/i',$comments)) { $error_message .= "We do not allow a url in the comment.<br />"; }El /i en preg_match lo hace independiente de mayúsculas y minúsculas. El 'http' también filtra para 'https'.
Los campos ocultos, las preguntas tontas (¿cuánto es 3+4?), etc., no son muy efectivos para bloquear el spam en los formularios.
Investigué esto hace varios años y se me ocurrió una solución que llamo "FormSpammerTrap". Utiliza código JavaScript para 'observar' para enfocar/hacer clic en los campos obligatorios. Los procesos automatizados, a menos que estén muy personalizados para un sitio específico (lo que lleva más tiempo del que los propietarios de robots de spam quieren tomar), no pueden 'enfocar/hacer clic' en un campo obligatorio.
Tengo una solución gratuita en mi sitio www.FormSpammerTrap.com . Y hay un formulario que los spambots pueden intentar enviar spam... y no lo han hecho durante más de 3 años. Le invitamos a probarlo... todo es de código abierto, por lo que puede ver cómo funciona. (Y, si usa el formulario, no recopilo su correo electrónico. Respondo una vez y luego elimino su correo electrónico).
Mi técnica es mucho más efectiva para bloquear spambots. No han podido enviar spam al formulario de contacto de ese sitio.