Honeypot PHP para formulário de comentários
-
12-11-2019 - |
Pergunta
Estou criando um formulário de comentários pop-up jquery ajax, mas estou tendo um problema com a maneira como estou configurando meu "honeypot" em php.
O honeypot ($robotest) não está funcionando;em vez disso, o script retorna "O e-mail não está correto".Alguém pode apontar meu erro?Obrigado
O formulário HTML é:
<form class="cmxform" id="commentForm" method="POST" action="">
<p>
<label for="cname">Name</label>
<input id="cname" name="name" size="25" class="required" minlength="2" />
</p>
<p>
<label for="cemail">E-Mail</label>
<input id="cemail" name="email" size="25" class="required email" />
</p>
<p>
<label for="curl">URL</label>
<input id="curl" name="url" size="25" class="url" value="" />
</p>
<p>
<label for="ccomment">Your comment</label>
<textarea id="ccomment" name="comment" cols="22" class="required"></textarea>
</p>
<p class="robotic" id="pot">
<label>Please leave this blank:</label>
<input name="robotest" type="text" id="robotest" class="robotest" />
</p>
<p>
<input class="submit" type="submit" value="Submit"/>
</p>
EDITAR:
Obrigado a @JamWaffles pelo apoio.Abaixo está a maneira correta de implementar o honeypot.(E como Kamalo observou, você desejará ter o id de 'robotest' definido como display:none em seu css):
<?php
$robotest = $_POST['robotest'];
$email = $_POST['email'];
if((!filter_var($email, FILTER_VALIDATE_EMAIL)) && ($robotest == "")) {
print "E-mail is correct";
$to = 'asdfdsafasdfsda@gmail.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: webmaster@example.com';
mail($to, $subject, $message, $headers);
} else {
print "E-mail is not correct";
}
?>
Solução
filter_var()
retorna um valor não falso quando o e-mail é válido, não false
.Remova o !
antes filter_var(
na tua if()
:
if((filter_var($email, FILTER_VALIDATE_EMAIL)) && ($robotest = ""))
Você está executando código dentro do if()
quando filter_var()
falhar, e é por isso que você está recebendo
E-mail não está correto
para e-mails válidos.
Outra coisa que senti falta também foi o fato de você estar atribuindo a $robotest
em vez de compará-lo com uma string vazia.Você precisa usar o operador de comparação de igual duplo em vez do operador de atribuição de igual único.Seu if()
deve ficar assim:
if((filter_var($email, FILTER_VALIDATE_EMAIL)) && ($robotest == ""))
Outras dicas
Para uma resposta alternativa, configurei uma entrada "pote de mel" em meu html com display:none
<input type="text" name="honeypot" id="honeypot" style="display:none;"/>