За последние 24 часа нас посетили 52597 программистов и 1764 робота. Сейчас ищут 786 программистов ...

captcha

Тема в разделе "PHP для новичков", создана пользователем Kocapb, 27 ноя 2008.

  1. Kocapb

    Kocapb Активный пользователь

    С нами с:
    10 июл 2008
    Сообщения:
    169
    Симпатии:
    0
    Здравствуйте, необходимо написать форму обратной связи для отправки сообщения на почту.
    Отправку сообщения на почту освоил. Но вот не могу понять как привязать проверку каптчи.
    Нашел одну на http://hight.fatal.ru/captcha/index.php
    вставил в свой код:
    HTML:
    1.  
    2. <form action="contact.php?id=posting" method="post">
    3.  
    4.    <table style="border:solid #CCCCCC 1px; padding:3px; font-size:12px; color:#666666;">
    5.     <tr><td colspan="2" style="padding-bottom:5px; font-weight:bold;">Оставить комментарий</td></tr>
    6.     <tr>
    7.      <td align="right">Имя*:</td><td><input type="text" name="name" /></td>
    8.     </tr>
    9.     <tr>
    10.      <td align="right">E-mail:</td><td><input type="text" name="e_mail" /></td>
    11.  
    12.     </tr>
    13.     <tr>
    14.      <td align="right">Captcha*:</td><td><input type="text" name="captcha" /></td>
    15.     </tr>
    16.     <tr><td colspan="2"><textarea name="message" rows="7" cols="33"></textarea></td></tr>
    17.     <tr><td colspan="2" align="center"><input type="submit" value="Поехали" /></td></tr>
    18.    </table>
    19.    </form>
    20.  
    а как сделать проверку по полю captcha со значением картинки?
    вот код captcha.php:
    PHP:
    1.  
    2. #
    3. # 2006-2008 (c) Hight | [email=hight@inbox.ru]hight@inbox.ru[/email]
    4. #
    5.  
    6. header('Cache-Control: private, no-cache="set-cookie"');
    7. header('Expires: 0');
    8. header('Pragma: no-cache');
    9.  
    10. # Кол-во символов в строке
    11. $symbols_num = 6;
    12.  
    13.  
    14. # Цифры
    15. $numbers = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
    16.  
    17. # Буквы
    18. $letters = array('A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f', 'G', 'g', 'H', 'h', 'I', 'i', 'J', 'j', 'K', 'k', 'L', 'l', 'M', 'm', 'N', 'n', 'O', 'o', 'P', 'p', 'Q', 'q', 'R', 'r', 'S', 's', 'T', 't', 'U', 'u', 'V', 'v', 'W', 'w', 'X', 'x', 'Y', 'y', 'Z', 'z');
    19.  
    20.  
    21. # Генерация массива символов контрольной строки
    22. for($i = 0; $i < $symbols_num; $i++)
    23. {
    24.     $true_false = rand(1, 2); # =)
    25.  
    26.     if(fmod($true_false, 2))
    27.     {
    28.         $captcha_key_array[] = $numbers[rand(0, 9)];
    29.     }
    30.     else
    31.     {
    32.         $captcha_key_array[] = $letters[rand(0, 51)];
    33.     }
    34. }
    35.  
    36. $captcha_key = implode('', $captcha_key_array);
    37.  
    38.  
    39. # Берём щрифты
    40. $fonts_dir = opendir('fonts');
    41.  
    42. while(false !== ($module = readdir($fonts_dir)))
    43. {
    44.     if($module != '.' and $module != '..')
    45.     {
    46.         $fonts_array[] = $module;
    47.     }
    48. }
    49.  
    50. $fonts_num = count($fonts_array);
    51.  
    52. # Ширина-высота изображения
    53. $width = $symbols_num * 25;
    54. $height = 50;
    55.  
    56. # Создание изображения
    57. $image = imagecreatetruecolor($width, $height);
    58.  
    59.  
    60. # Рисуем фон
    61. $background  = imagecolorallocate($image, rand(230, 255), rand(230, 255), rand(230, 255));
    62.  
    63. imagefill($image, 0, 0, $background);
    64.  
    65.  
    66. # Рисуем "шахматную" доску
    67.  
    68. $cube_side = rand(8, 12); # размер грани квадратика
    69.  
    70. $q = 0;
    71.  
    72. while($q <= $height / $cube_side)
    73. {
    74.     $i = 0;
    75.  
    76.     while($i <= $width)
    77.     {
    78.         if(fmod($q, 2))
    79.         {
    80.             $cube_side = rand(8, 12); # Размер стороны квадратика
    81.             $color = imagecolorallocate($image, rand(150, 255), rand(150, 255), rand(150, 255));
    82.             imagefilledrectangle ($image, $i*2+$cube_side, $q*$cube_side, $i*2+$cube_side*2, $q*$cube_side+$cube_side, $color );
    83.         }
    84.         else
    85.         {   $cube_side = rand(8, 12); # Размер стороны квадратика
    86.             $color = imagecolorallocate($image, rand(150, 255), rand(150, 255), rand(150, 255));
    87.             imagefilledrectangle ($image, $i*2, $q*$cube_side, $i*2+$cube_side, $q*$cube_side+$cube_side, $color );
    88.             //imagesetpixel($image, $i*2, $q*$cube_side, $black );
    89.             //imagefilledarc ($image, $i*2, $q*$cube_side, rand(8, 16), rand(5, 10), 0, 360, $color, IMG_ARC_PIE );
    90.             //imageellipse($image, $i*2, $q*$cube_side, 20, 10, $color );
    91.         }
    92.  
    93.         $i = $i + $cube_side;
    94.     }
    95.  
    96.     $q++;
    97. }
    98.  
    99.  
    100. # Рисуем строку
    101. $i = 10;
    102.  
    103. foreach($captcha_key_array as $index => $value)
    104. {
    105.     $x_position = rand(6, $height - 16);
    106.     $str_color = imagecolorallocate($image, rand(50, 150), rand(50, 150), rand(50, 150));
    107.     $captcha_key_array = imagettftext($image, 25, rand(-30, 30), $i, rand(25, 45), $str_color, './fonts/'.$fonts_array[rand(0, $fonts_num-1)], $value);
    108.     $i = $i + rand(15, 25) ;
    109. }
    110.  
    111.  
    112. # Рисуем рамку
    113. $black = imagecolorallocate($image, 0, 0, 0);
    114.  
    115. imageline($image, 0, 0, 0, $height, $black); # left
    116. imageline($image, $width - 1, 0, $width - 1, $height, $black); # right
    117. imageline($image, $width, 0, 0, 0, $black); # up
    118. imageline($image, $width, $height - 1, 0, $height - 1, $black); # down
    119.  
    120.  
    121. # Выводим изображение в браузер
    122. header('content-type: image/png');
    123. imagepng($image);
    124.  
    125. # Высвобождаем ресурсы
    126. imagedestroy($image);
    127.  
    128. ?>
     
  2. kostyl

    kostyl Guest

    скрипт капчи должен залить в сессию переменную с кодом а форма долна отправить в скрипт обработки значение пользователя, ну и естественно в обработке сравнить значение из сессии и от пользователя
     
  3. Kocapb

    Kocapb Активный пользователь

    С нами с:
    10 июл 2008
    Сообщения:
    169
    Симпатии:
    0
    хмм, спасибо немного вроде понял =)
    а что за ошибка ?
    PHP:
    1.  
    2. Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\xampp\htdocs\point\site\contact.php:6)
     
  4. kirwebgroup

    kirwebgroup Активный пользователь

    С нами с:
    21 ноя 2008
    Сообщения:
    48
    Симпатии:
    0
    А как у тебя организована проверка полей name и e_mail ?
     
  5. kirwebgroup

    kirwebgroup Активный пользователь

    С нами с:
    21 ноя 2008
    Сообщения:
    48
    Симпатии:
    0
  6. kirwebgroup

    kirwebgroup Активный пользователь

    С нами с:
    21 ноя 2008
    Сообщения:
    48
    Симпатии:
    0
    Если тебе все рано какая капча, то чтобы не дергать свой поп, выдри ее просто с уже существующих КМС, например с ДЛЕ, тем более что и проверка там уже реализована, если сильно хочетсо помудится... тогада http://www.captcha.ru, http://kurilka.co.ua/archives/captcha/... имхо во-втором даже объясняют как? что? куда?
     
  7. Kocapb

    Kocapb Активный пользователь

    С нами с:
    10 июл 2008
    Сообщения:
    169
    Симпатии:
    0
    проверка стандартная отправляю через POST:
    PHP:
    1.  
    2. if(isset($_POST['name']))
    3. {
    4.  
    5. }
    6.  
    с e_mail пока не разбирался, для меня сейчас главное сделать так чтобы выводилась картинка с генерированным числом и проходила проверка введенного числа с числом картинки, вроде этого
    PHP:
    1.  
    2. //$_POST['captcha_key'] - данные с поля формы
    3. //$_SESSION['captcha_key'] - данные занесенные при генерирование картинки
    4. if(isset($_POST['captcha_key']))
    5. {
    6.   if($_SESSION['captcha_key'] == $_POST['captcha_key'])
    7.   //правильно
    8.   else
    9.   //неправильно
    10. }
    за ссылку спасибо
     
  8. kirwebgroup

    kirwebgroup Активный пользователь

    С нами с:
    21 ноя 2008
    Сообщения:
    48
    Симпатии:
    0
    Насчет e_mail предвосхищая вопрос, посотри вот здесь http://www.phpclasses.org/browse/package/13.html, кстати этот класс можно видоизменить или дописать для проверки на валидность любого поля... и еще совет используй вместе с фреймворком Jqery, так будет и красивей и для юзера удобнее. Тем более что и плагинов для проверки валидности на Jqery в сети пално.
     
  9. Kocapb

    Kocapb Активный пользователь

    С нами с:
    10 июл 2008
    Сообщения:
    169
    Симпатии:
    0
    ок учту спасибо!=)
     
  10. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
  11. kirwebgroup

    kirwebgroup Активный пользователь

    С нами с:
    21 ноя 2008
    Сообщения:
    48
    Симпатии:
    0
    Мне вот чет всегда были ближе капчи со словами а не литерами... вот заскок такой, кажется что надежнее...сам понимаю что хакнуть то в принципе можно любую... а сердце так и тянется к словесным капча )))

    http://recaptcha.net/ - нрависа)