Honeypot PHP для формы комментариев - PullRequest
2 голосов
/ 26 февраля 2012

Я создаю форму всплывающего комментария jquery ajax, но у меня проблема с тем, как я настраиваю свою "приманку" в php.

Приманка ($ robotest) не работает; вместо этого скрипт возвращает «E-mail не корректно». Кто-нибудь может указать на мою ошибку? Спасибо

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>

РЕДАКТИРОВАТЬ:

Спасибо @JamWaffles за поддержку. Ниже приведен правильный способ реализации honeypot. (И, как заметил Камало, вы захотите, чтобы для идентификатора «robotest» было установлено: ни один в вашем 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";
}   
?>

Ответы [ 2 ]

5 голосов
/ 26 февраля 2012

filter_var() возвращает не ложное значение, если электронное письмо действительно, а не false. Удалите ! перед filter_var( в вашем if():

if((filter_var($email, FILTER_VALIDATE_EMAIL)) && ($robotest = "")) 

Вы выполняете код внутри if(), когда filter_var() не удается , поэтому вы получаете

Неверный адрес электронной почты

для действительных писем.


Еще кое-что, что я пропустил, это то, что вы присваиваете $robotest вместо сравнения с пустой строкой. Вам нужно использовать оператор сравнения с двумя равными вместо одного оператора присваивания. Ваш if() должен выглядеть так:

if((filter_var($email, FILTER_VALIDATE_EMAIL)) && ($robotest == "")) 
4 голосов
/ 26 февраля 2012

Для альтернативного ответа я установил в своем html-коде «медовый горшок» с отображением: none

<input type="text" name="honeypot" id="honeypot" style="display:none;"/>
...