Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Антиспам - как внедрить?


Автор: Moby 13.4.2009, 20:36
Люди добрые, мне очень нужна ваша помощь, ваш совет. Я на пхп не работаю, в основном на С++.
Но вот на работе мне дали задание и уже поздно отказываться, а срок поджимает. 

Возникает ошибка, когда я вставляю код примера Recaptcha на страничку КОНТАКТА(где есть форма для заполнения сообщения и отправки на сервер).

Сама ошибка
Notice: Undefined index: recaptcha_response_field in /home/web/www.iitp.ru/html/contacts.php on line 131
Ошибка указывает на эту строчку 
if ($_POST["recaptcha_response_field"]) {

Код

<table width="600" border="0" cellpadding="0" cellspacing="0" id="formMes">
<form method="post" action="" onsubmit="return checkForm(this)">
    <tr><td colspan="2"><h1 style="color:#325a8e"><?=t('Форма обратной связи')?></h1></td></tr>
    <tr><td><font color="#FF0000">*</font>&nbsp;<?=t('Фамилия')?></td><td><input type="text" name="fam"></td></tr>
    <tr><td height="25" colspan="2"><font color="#FF0000">*</font>&nbsp;<?=t('Сообщение')?></td></tr>
    <tr><td colspan="2"><textarea name="mess" cols="72" rows="10" style="width:590px"></textarea></td></tr>
    <tr><td colspan="2" align="center" height="35"><input type="submit" name="Submit" value="<?=t('Отправить')?>"><input type="hidden" name="lang" value="<?=LANG?>" /> <input name="Reset" type="reset" id="Reset" value="<?=t('Очистить')?>">
    
    </td></tr>

     //Код Рекачи, который я вставил и она стала отображаться на страничке но выдает ошибку
       <?php
    require_once('recaptchalib.php');

    $publickey = "6Lcd3AUAAAAAADUe_joLmB_2xQo3ep869F4zB6a_"; 
    $privatekey = "6Lcd3AUAAAAAANPd8WgyL0CpywAXTIHA8LIS5DDQ";

    # the response from reCAPTCHA
    $resp = null;
    # the error code from reCAPTCHA, if any
    $error = null;
    
    # was there a reCAPTCHA response?
    if ($_POST["recaptcha_response_field"]) {
        $resp = recaptcha_check_answer ($privatekey,
                                        $_SERVER["REMOTE_ADDR"],
                                        $_POST["recaptcha_challenge_field"],
                                        $_POST["recaptcha_response_field"]);

        if ($resp->is_valid) {
                echo "You got it!";
        } else {
                # set the error code so that we can display it
                $error = $resp->error;
        }
     }
    echo recaptcha_get_html($publickey,$error);

    ?>
</form></table>


И на всякий прикладываю код всей страницы КОНТАКТА.


Автор: SneG0K 13.4.2009, 20:53
Вдумываться в код сейчас вообще не хочется, но вот как пользователь скажу, не бери рекапчу! она меня как пользователя бесит.

Автор: Moby 14.4.2009, 11:47
А если не рекапчу, то что тогда посоветуете?

Автор: MoLeX 14.4.2009, 11:54
Цитата(Moby @  14.4.2009,  11:47 Найти цитируемый пост)
то что тогда посоветуете?

http://captcha.ru/

Автор: Sanchezzz 14.4.2009, 11:59
Можно вопрос ответ.
Можно как на рапиде делали раньше сколько кошек нарисовано  или введите только черные цифры или белые итд.

ПС. На форуме можешь найти и мою капчю довольно маленькая если с этим великом не разберешься.

Автор: Moby 14.4.2009, 14:01
Спасибо. Рассмотрю оба варианта.

Sanchezzz, а можно ссылочку на Вашу капчу?

Но в "профилактических" целях я все же хочу поставить эту Рекапчу. И тут возникает уже более конкретный вопрос и в связи с этим я переделаю мой первый пост и продублирую новый вопрос в этом посте. smile

Используя код, который приводится в примере к Рекапче и впихнув его в в код ФОРМЫ на странице выводится вот такая ошибка

Notice: Undefined index: recaptcha_response_field in /home/web/www.iitp.ru/html/contacts.php on line 131

Ошибка указывает на эту строчку 
if ($_POST["recaptcha_response_field"]) {

С чем это может быть связано? 

Для проверки я просто создаю с этим же кодом из примера страничку и все рабоатет, а вот когда сую в код формы то ошибка.

Автор: Sanchezzz 14.4.2009, 14:15
Боюсь его сча не найти в топиках...

Делаешь форму 
поле куда вводить  ну и картинка
Код

<img src="antibot.php?time=<?=time();?>"/>


Принемать данные все умеют код картинки хранится тут $_SESSION['image_kod']
и в скрипте antibot.php измени пути картинок на свои.

Насчет ошибки переменная не объявлена... <? error_reporting(E_ALL && E_NOTICE); ?> в начало скрипта.

Автор: Shark 17.4.2009, 11:10
а мне кажется что ошибка зарыта в это recaptchalib.php файле, покаи его код.

Автор: lelik133 17.4.2009, 11:55
а форме то есть поле recaptcha_response_field?
сделайте var_dump($_POST) и посмотрите

Автор: Shark 17.4.2009, 12:11
lelik133, я смотрел и не нашелsmile... но код я копировал себе на localhost и ошибку мне он такую не выдает...
мне кажется что все таки ошибка в подключаемом файле.. 

Автор: lelik133 17.4.2009, 12:29
уровень erorr_reporting наверное разный у вас, поэтому и не видел

Автор: Moby 17.4.2009, 13:51
Для проверки сделал var_dump($_POST);

Выдает

array(0) { } 

Цитата

уровень erorr_reporting наверное разный у вас, поэтому и не видел


Это что значит? smile

Вообще с recapchalib точно все в порядке так как я просто создаю тестовую страничку с формой и все работает

Вот эта тестовая страничка 

Код

<form action="" method="post">
<?php

require_once('recaptchalib.php');

// Get a key from http://recaptcha.net/api/getkey
$publickey = "6Lcd3AUAAAAAADUe_joLmB_2xQo3ep869F4zB6a_ ";
$privatekey = "6Lcd3AUAAAAAANPd8WgyL0CpywAXTIHA8LIS5DDQ";

# the response from reCAPTCHA
$resp = null;
# the error code from reCAPTCHA, if any
$error = null;

# was there a reCAPTCHA response?
if ($_POST["recaptcha_response_field"]) {
        $resp = recaptcha_check_answer ($privatekey,
                                        $_SERVER["REMOTE_ADDR"],
                                        $_POST["recaptcha_challenge_field"],
                                        $_POST["recaptcha_response_field"]);

        if ($resp->is_valid) {
                echo "You got it!";
        } else {
                # set the error code so that we can display it
                $error = $resp->error;
        }
}
echo recaptcha_get_html($publickey, $error);
var_dump($_POST);
?>
    <br/>
    <input type="submit" value="submit" />
    </form>


А впихнуть это все в код формы страницы КОНТАКТА не поулчается, выдает выше описанную страницу. 
Может дело в методе post? Ведь этот метод вроде как посылает на сервер все эти данные (составленное сообщение, имя, фамилия...)  а тут впихивая эту рекапчу я еще что то от поста хочу. Извините за столь глупые вопросы. smile

Вот код страницы contacts.php, он не большой.


Код

<? 

$id = 18;


include_once('admin/config.inc.php');
 
if(!isset($auto)) $auto = 0;


$main=$db->select("SELECT `ID`, `Title".LANGF."`, `Text".LANGF."`, `TopMenu`, `LeftMenu`, `NumMenu`, `Editors`, `UserEditors` FROM `Content` WHERE `ID`=$id");


get_menu_nav_content($id, 'edit');
/*
if($hash['may_edit'][0]) {
    $g_add_navigation ='<td>&nbsp;|&nbsp;</td><td>' . l('Редактировать страницу', '/cms/content.php?action=edit&id=18&lang='.LANG).'</td>';
}

*/


if(!$main[1]) {
   include($_SERVER['DOCUMENT_ROOT'].'/templates/error_not_found.php');
} else {
    if(isset($title) && $title && $_SERVER['REQUEST_METHOD'] == 'POST') {
        $text="Обращение: $title\r\n";
        $text.="Имя: $name\r\n";
        $text.="Фамилия: $fam\r\n";
        if($mail) $text.="Почта: $mail\r\n";
        if($phone) $text.="Телефон: $phone\r\n";
        if($fax) $text.="Факс: $fax\r\n";
        $text.="Сообщение: $mess\r\n";
        
        $mail_res = mail(ADMIN_EMAIL, 'Новое сообщение с сайта '.$_SERVER['HTTP_HOST'], $text."\r\n\r\nСоздано: ".date("H:i:s d.m.Y"));
        $msg = ($mail_res ?
            t('Ваше сообщение успешно отправлено') : 
            t('Ошибка отправки письма'));
        
        if($mail_res) infomsg($msg); else errormsg($msg);
    }

    if(!function_exists('get_page_title_html')) {
        function get_page_title_html() { return t('Контакты'); };
    }

    if(!function_exists('get_menu_main_custom_html')) {
        function get_menu_main_custom_html() {
?><tr><td align="center">
<br />
<?=l('Форма обратной связи', '/'.LANG.'/contacts.htm')?><br />
<br />
<a href="/<?=LANG?>/maps.htm"><img src="/images/map-small.gif" style="border:1px solid #878f9c" /></a><br />
<strong><?=t('Схема проезда')?></strong>
<?=(LANG=='en' ? '' : '<br />')?>
<strong><?=t('общественным транспортом')?></strong><br />
(<?=t('нажмите для увеличения')?>)<br />
<br />
<a href="/<?=LANG?>/maps-auto.htm"><img src="/images/map-auto-small.gif" style="border:1px solid #878f9c" /></a><br />
<strong><?=t('Схема проезда')?></strong>
<?=(LANG=='en' ? '' : '<br />')?>
<strong><?=t('на автомобиле')?></strong><br />
(<?=t('нажмите для увеличения')?>)
</td></tr>
<?
        } 
    }

    if(!function_exists('get_content_html')) {
        function get_content_html() {
            global $main, $map, $auto;
?>
<?=$main['Text'.LANGF];?>
<?  if($map==1) { ?>
<?    if($auto) { ?>
<img src="/images/map-auto.gif"  width="610" height="450"/>
<?        } else { ?>
<img src="/images/map-big.gif"  width="610" height="449"/>
<?        } ?>
<? } else { ?>
<script language="javascript"><!--
function checkForm(form) {
    var error='';
    if(!form.name.value) error+="<?=t('Не указано')?> - '<?=t('Имя')?>'\r\n";
    if(!form.fam.value) error+="<?=t('Не указано')?> - '<?=t('Фамилия')?>'\r\n";
    if((!form.mail.value)&&(!form.phone.value)&&(!form.fax.value)) error+="<?=t('Не указаны Ваши координаты')?>\r\n";
    if(form.mess.innerText=='') error+="<?=t('Не указано')?> - '<?=t('Сообщение')?>'\r\n";
    if(error) { alert(error); return false; } else return true;

}
--></script>



<table width="600" border="0" cellpadding="0" cellspacing="0" id="formMes">
<form method="post" action="" onsubmit="return checkForm(this)">


    <tr><td colspan="2"><h1 style="color:#325a8e"><?=t('Форма обратной связи')?></h1></td></tr>
    <tr><td width="50%"><table>
        <tr><td colspan="2"><font color="#FF0000">*</font> <?=t('Пожалуйста заполните все поля, отмеченые звездочкой')?></td></tr>
        <tr><td><font color="#FF0000">*</font> <?=t('Обращение')?></td><td><input name="title" type="radio" value="<?=t('Господин')?>" checked="checked" /> <?=t('Господин')?> <input name="title" type="radio" value="<?=t('Госпожа')?>" /> <?=t('Госпожа')?></td></tr>
        <tr><td><font color="#FF0000">*</font>&nbsp;<?=t('Имя')?></td><td><input type="text" name="name"></td></tr>
        <tr><td><font color="#FF0000">*</font>&nbsp;<?=t('Фамилия')?></td><td><input type="text" name="fam"></td></tr>
    </table></td>
    <td width="50%"><table>
        <tr><td colspan="2"><font color="#FF0000">*</font>&nbsp;<?=t('Предпочитаемый вид обратной связи')?></td></tr>
        <tr><td>&nbsp;&nbsp;&nbsp;E-mail</td><td><input type="text" name="mail" class="inp1"></td></tr>
        <tr><td>&nbsp;&nbsp;&nbsp;<?=t('Телефон')?></td><td><input type="text" name="phone" class="inp1"></td></tr>
        <tr><td>&nbsp;&nbsp;&nbsp;<?=t('Факс')?></td><td><input type="text" name="fax" class="inp1"></td></tr>
    </table></td></tr>
    <tr><td height="25" colspan="2"><font color="#FF0000">*</font>&nbsp;<?=t('Сообщение')?></td></tr>
    <tr><td colspan="2"><textarea name="mess" cols="72" rows="10" style="width:590px"></textarea></td></tr>
    <tr><td colspan="2" align="center" height="35"><input type="submit" name="Submit" value="<?=t('Отправить')?>"><input type="hidden" name="lang" value="<?=LANG?>" /> <input name="Reset" type="reset" id="Reset" value="<?=t('Очистить')?>">
    
    
    
    
    </td></tr>

</form></table>



<? } ?>
<?      }
    }

    $g_cur_menuid = $main['TopMenu']; //$main['NumMenu'] ?????
    include($_SERVER['DOCUMENT_ROOT'].'/templates/content.php');
}
?>


Автор: lelik133 17.4.2009, 14:27
array(0) { }  значит то что у вас данные из формы не пришли

Автор: bars80080 17.4.2009, 16:35
Цитата(lelik133 @  17.4.2009,  14:27 Найти цитируемый пост)
значит то что у вас данные из формы не пришли 

а происходит это вполне возможно потому, что форма разрывает таблицу. 
можно только <form><table> ... </table></form> или ...<td><form> ... </form></td> ....

Автор: Shark 17.4.2009, 16:35
lelik133, да, верно... я забыл включить error_reporting(E_ALL && E_NOTICE); 
Moby, а может ты не будешь заморачиваться? возьми сам напиши капчу и все... либо с картинкой, либо сколько будет 2*9 = и нажно ввести ответ..

Автор: nerezus 18.4.2009, 03:44
Цитата

Moby, а может ты не будешь заморачиваться? возьми сам напиши капчу и все... либо с картинкой, либо сколько будет 2*9 = и нажно ввести ответ..
 

Shark, +1. А заодно и свой интерпретатор, зачем уж с PHP заморачиваться, когда можно свой написать, благо C++ знаешь.
А чтобы API не учить, можно свою ОС написать.


Shark,  smile 

Автор: Moby 20.4.2009, 11:11
Сперва хочу сказать всем огромное спасибо за то, что вы отвечаете на столько глупые вопросы, во многих других местах послали бы учить мат часть.

2*9 = в меру своего незнания мне кажется, что так роботы легко пройдут эту защиту. Да и мне сказали сделать так то так то, так что выбора нет. smile

Что касаемо
Цитата

можно только <form><table> ... </table></form> или ...<td><form> ... </form></td> ....


сделал, теперь по нажатию кнопки submit у формы, капча работает, НО если введено не правильно или вообще ничего не введено то сообщение все равно отправляется. 

А ошибка
Notice: Undefined index: recaptcha_response_field in /home/web/www.iitp.ru/html/contacts.php on line 130
осталась, но она пропадает, как только один раз нажмешь на кнопку формы. То есть в if ($_POST["recaptcha_response_field"]) 
не определенно recaptcha_response_field.

Ну как всегда вопрос. Точнее два.

1) Как избавиться от этой ошибки, просто в тупую определяя переменную $recaptcha_response_field не помогает?

2) Как отловить по нажатию кнопки submit ошибку капчи?
У формы есть метод для проверки введены ли имя, фамилия.
<form method="post" action="" onsubmit="return checkForm(this)">
Как я могу используя этот метод проверить вот такое условие  if ($resp->is_valid) ?

Вот код рекапчи и метода, что проверяет на введение имени и фамилии.
Код

function checkForm(form) {
    var error='';
   if(!form.name.value) error+="<?=t('Íå óêàçàíî')?> - '<?=t('Èìÿ')?>'\r\n";
    if(!form.fam.value) error+="<?=t('Íå óêàçàíî')?> - '<?=t('Ôàìèëèÿ')?>'\r\n";
    if((!form.mail.value)&&(!form.phone.value)&&(!form.fax.value)) error+="<?=t('Íå óêàçàíû Âàøè êîîðäèíàòû')?>\r\n";
    if(form.mess.innerText=='') error+="<?=t('Íå óêàçàíî')?> - '<?=t('Ñîîáùåíèå')?>'\r\n";
    if(error) { alert(error); return false; } else return true;


}

Код

    <?php
    require_once('recaptchalib.php');

    $publickey = "6Lcd3AUAAAAAADUe_joLmB_2xQo3ep869F4zB6a_"; 
    $privatekey = "6Lcd3AUAAAAAANPd8WgyL0CpywAXTIHA8LIS5DDQ";

    # the response from reCAPTCHA
    $resp = null;
    # the error code from reCAPTCHA, if any
    $error = null;
    
    
    if ($_POST["recaptcha_response_field"]) {
        $resp = recaptcha_check_answer ($privatekey,
                                        $_SERVER["REMOTE_ADDR"],
                                        $_POST["recaptcha_challenge_field"],
                                        $_POST["recaptcha_response_field"]);

        if ($resp->is_valid) {
                echo "You got it!";
        } else {
                # set the error code so that we can display it
                $error = $resp->error;
        }
}
echo recaptcha_get_html($publickey, $error);
//    var_dump($_POST);

    ?>


Автор: Photon 21.4.2009, 04:50
Вот как-то так, но это только в общих чертах. Думаю, дальше сам разберешься..

Код

<?
    require_once('recaptchalib.php');

    $publickey = "6Lcd3AUAAAAAADUe_joLmB_2xQo3ep869F4zB6a_"; 
    $privatekey = "6Lcd3AUAAAAAANPd8WgyL0CpywAXTIHA8LIS5DDQ";

    # the response from reCAPTCHA
    $resp = null;
    # the error code from reCAPTCHA, if any
    $error = null;
    
    
    if (array_key_exists('recaptcha_response_field',$_POST)) {
        $resp = recaptcha_check_answer ($privatekey,
                                        $_SERVER["REMOTE_ADDR"],
                                        $_POST["recaptcha_challenge_field"],
                                        $_POST["recaptcha_response_field"]);

        if ($resp->is_valid) {
           //послать сообщение или сделать что-то полезное
        }
        else {
            //показать заново форму отправки без submit и </form>
            echo recaptcha_get_html($publickey, $error);
            echo "<input type='submit' value='Отправить' />";
            echo "</table></form>";
        }
   }
   else {
            //показать форму отправки без submit и </form>
            echo recaptcha_get_html($publickey, $error);
            echo "<input type='submit' value='Отправить' />";
            echo "</table></form>";
   }
?>

Автор: Shark 21.4.2009, 07:16
Moby, а у тебя есть сравнение того, правильно ли пользователь ввел данные из капчи или нет?

Автор: Moby 23.4.2009, 09:33
Цитата(Shark @ 21.4.2009,  07:16)
Moby, а у тебя есть сравнение того, правильно ли пользователь ввел данные из капчи или нет?


Эмм... ну я проверял и если не правильно, то на капчи самой пишется, что не правильно. Ты это имел ввиду? smile

Photon, спасибо, буду пробовать.

P.S. Пока не проверял, но код посмотрел, "звучит" работоспособно и решает все проблемы. Ох как хочется что бы заработало. smile 

Автор: Moby 23.4.2009, 11:07
Photon, а зачем прятать кнопку? То есть как же тогда капча будет получать вписанное слово?

Код

 else {
            //показать форму отправки без submit и </form>
            echo recaptcha_get_html($publickey, $error);
            echo "<input type='submit' value='Отправить' />";
            echo "</table></form>";
   }

Автор: Shark 23.4.2009, 12:08
ввел пользователь: UbFA9
капча показывала: UbFA9

при нажатии кнопки.... ты делал вывод этих параметров чтоб посмотреть?
а то может получиться что до отправки все равильно а потом получает UbFA9 (Пользователя), а капча помнялась на TtVlK и естественно будет ошибка...
или я уже сильно отстал от темы

Автор: Moby 23.4.2009, 12:53
Нет, не делал вывод этих параметров. Но вроде бы все правильно. Хотя...

Я до сих пор не могу сделать перехват неправильно введенного лова. Совет Photon'а хороший, но возникает ряд маленьких проблем. а для меня маленькая проблема это большая. 

Кстати было бы интересно вывести то слово, которое пользователь ввел, но вот как это сделать? smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)