За последние 24 часа нас посетили 63040 программистов и 1748 роботов. Сейчас ищут 779 программистов ...

связать капчу с формой регистрации

Тема в разделе "PHP для новичков", создана пользователем shpok, 4 июл 2012.

  1. shpok

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

    С нами с:
    20 июн 2012
    Сообщения:
    23
    Симпатии:
    0
    Доброго времени суток всем участникам форума, только начал изучать PHP и пробую для тренировки писать простейший скрипт регистрации пользователей на сайте и для защиты от роботов пытаюсь подключить самописную простейшую капчу. Но есть такая проблема-если вводишь необходимые данные в поле ответа и нажимаешь"отправить", то страница обновляется и данные ответа приходят устаревшие, соответственно, добавить нового пользователя не получается. Я где-то понимаю что надо чего-то думать с session и cookie, но ни чего придумать не могу.Просьба подсказать, что делаю не так.
    вот скрипт капчи
    Код (Text):
    1. <?php
    2. session_start();
    3. $_SESSION['code'];
    4. $a=mt_rand(1,20);//вводим переменные для капчи
    5. $b=mt_rand(11,20);
    6. $c=$a+$b;
    7. $_SESSION['code']=$c;
    8. ?>
    а вот сам скрипт регистрации:
    Код (Text):
    1. <?php
    2. session_start();
    3.  
    4. require_once"capcha.php";
    5.  
    6. ?>
    7. <form method=post>
    8. &nbsp;&nbsp;&nbsp;&nbsp;Введите имя:
    9. <input type=text name="login" maxlength="20" size="15" /><br /><br />
    10. Введите пароль:
    11. <input type=password name="password" maxlength="50" size="15" />
    12. <br /><br />
    13.  
    14. <input type=text name="answ" method=post /><br />
    15. <input type=submit name="go" value="отправить" />
    16. </form>
    17. </form>
    18. <?php
    19. $host="localhost";
    20. $user="root";
    21. $pass="";
    22. $db="user";
    23. mysql_connect($host,$user,$pass)or die("Невозможно установить соединение".mysql_error());
    24. mysql_query("CREATE DATABASE IF NOT EXISTS $db");
    25. mysql_select_db($db)or die("Невозможно подключиться к базе данных".mysql_error());
    26. mysql_query('CREATE  TABLE IF NOT EXISTS `users`(
    27. `id` INT AUTO_INCREMENT PRIMARY KEY,
    28. `login` VARCHAR(60) UNIQUE NOT NULL,
    29. `password` VARCHAR(60) NOT NULL
    30. )')or die("Невозможно создать таблицу".mysql_error());
    31. $login=mysql_real_escape_string($_REQUEST['login']);
    32. $password=md5(mysql_real_escape_string($_REQUEST['password']));
    33. $rez=mysql_query("SELECT COUNT(login) FROM`users` WHERE `login`='".$login."'");
    34. echo"Для подтверждения того, что Вы не робот, дайте ответ, сколько будет $a плюс $b <br>";
    35. if(isset($_REQUEST['go']))
    36. {
    37. if(!isset($_REQUEST['login']))
    38. {echo"Вы не ввели логин  !<br>";}
    39. elseif(empty($_REQUEST['password']))
    40. {echo"Вы не ввели пароль!<br>";}
    41.  
    42. elseif(strlen(trim($_REQUEST['login']))<6)
    43. {echo"Поле login слишком короткое!<br>";}
    44. elseif(strlen(trim($_REQUEST['password']))<6)
    45. {echo"Поле пароль слишком короткое!<br>";}
    46. elseif(!preg_match('/^[a-zA-Z0-9]+$/is',$_REQUEST['password']))
    47. {echo"Поле пароль содержит недопустимый символ!<br>";}
    48. elseif(!preg_match('/^[a-zA-Z0-9]+$/is',$_REQUEST['login']))
    49. {echo"Вы ввели недопустимый символ в поле login!!! <br>";}
    50. elseif(mysql_result($rez,0)>0)
    51. echo"Такой логин уже существует!";
    52. elseif($_REQUEST['answ']!=$_SESSION['code'])
    53.  
    54. echo"Вы ответили не верно!";
    55. else mysql_query("INSERT IGNORE INTO `users` SET `login`='".$login."', `password`='".$password."'")or die("Невозможно вставить запись".mysql_error());
    56. $_SESSION=array();
    57. unset($_COOKIE[session_name()]);
    58. session_destroy();
    59.  
    60. }
    61. ?>
     
  2. Gambit

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

    С нами с:
    4 июн 2012
    Сообщения:
    108
    Симпатии:
    0
    Скрипт капчи просто Евгениален.
    Не вижу, чтобы Вы выводили там что-то.

    Капча должна быть на картинке. Такую капчу запросто поломают.
     
  3. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Удали каптчу =)
     
  4. shpok

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

    С нами с:
    20 июн 2012
    Сообщения:
    23
    Симпатии:
    0
    Капчу я вывожу таким образом
    Код (Text):
    1. echo"Для подтверждения того, что Вы не робот, дайте ответ, сколько будет $a плюс $b <br>";
    Я понимаю, что капча очень слабенькая, но вопрос стоит в том, как правильно связать ее с формой регистрации, так как при вводе ответа и нажатии на кнопку "отправить" выдается ответ "Вы ответили не верно".
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Через сессию, всё верно.
     
  6. uorypm

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

    С нами с:
    3 мар 2012
    Сообщения:
    98
    Симпатии:
    0
    shpok, здравствуйте.
    Вероятнее всего Вы используете два этих скрипта на одной физической странице. Разумеется при таком подходе вероятность ответить "верно" стремится к вероятности того, что два раза подряд переменные 'a' и 'b' дадут одну и ту же сумму. Попробуйте переделать первый скрипт так:
    Код (PHP):
    1. if(!isset($_SESSION['code']) and empty($_SESSION['code'])){
    2.  $a=mt_rand(1,20);//вводим переменные для капчи
    3.  $b=mt_rand(11,20);
    4.  $c=$a+$b;
    5.  $_SESSION['code']=$c;
    6. }
    7.  
     
  7. shpok

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

    С нами с:
    20 июн 2012
    Сообщения:
    23
    Симпатии:
    0
    Спасибо большое за ответ, вечером попробую и отпишусь.

    Добавлено спустя 55 минут 37 секунд:
    А Вы бы могли пояснить, как их надо использовать? Я свою самописную капчу подключаю через require_once, если надо как-то по-другому, объясните,пожалуйста, как. Что нужно сделать через сессию?
     
  8. uorypm

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

    С нами с:
    3 мар 2012
    Сообщения:
    98
    Симпатии:
    0
    Сразу извиняюсь за свою ошибку: не на одной физической, а на одной логической странице.
    Значит на одной логической странице.
    Вы и так все через сессию делаете. Камрад igordata лишь подтвердил, что Вы идете по правильному пути.
    Все дело в том, что, т.к. все идет на одной странице, при каждом запуске Вашего скрипта переменная $_SESSION['code'] перезаписывается (генерируются новые $a и $b), а пользователю выводятся уже старые (т.е. относительно новые, но как только он отправляет запрос - уже старые). Поэтому маловероятно, что кто-либо так пройдёт эту CAPTCHA. Попробуйте переделать Ваш скрипт как я советовал и посмотрите что получилось.
     
  9. shpok

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

    С нами с:
    20 июн 2012
    Сообщения:
    23
    Симпатии:
    0
    Спасибо за разъяснение!Я так и предполагал . Вечером отпишусь о результате.
     
  10. shpok

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

    С нами с:
    20 июн 2012
    Сообщения:
    23
    Симпатии:
    0
    Доброго времени суток, большое спасибо uorypm, с помощью Вашей подсказки работает!
     
  11. Gambit

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

    С нами с:
    4 июн 2012
    Сообщения:
    108
    Симпатии:
    0
    Это еще слабо сказано. Если это вообще можно назвать капчей :D Она 200% уязвима. Она просто хуже, чем слабее :D
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Она смешная. Но принцип верный. А 99% роботов и с такой не справятся.
     
  13. shpok

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

    С нами с:
    20 июн 2012
    Сообщения:
    23
    Симпатии:
    0
    Спасибо за критику, я писал ее в качестве тренировки, для так, сказать, закрепления теоретических познаний.Хоть с чего-то надо пробовать.
     
  14. Колбася

    Колбася Активный пользователь

    С нами с:
    12 дек 2011
    Сообщения:
    722
    Симпатии:
    0
    вот капча с описанием (2 php файла)

    sec1.php - его просто создаешь и закидываешь в сайт он там лежит

    Код (Text):
    1. <?PHP
    2. // Настройки
    3.  
    4.    $SECURITY_IMAGE_TYPE = 'GIF';     // Возможные форматы: GIF, JPEG, PNG
    5.    $SECURITY_WIDTH = 130;            // Ширина изображения
    6.    $SECURITY_HEIGHT = 30;            // Высота изображения
    7.    $SECURITY_NUM_GENSIGN = 5;        // Количество символов, которые нужно набрать
    8.  
    9.    $EXT = strtoupper($_GET['ext']);
    10.    if($EXT == 'GIF' || $EXT == 'JPEG' || $EXT == 'PNG') $SECURITY_IMAGE_TYPE = $EXT;
    11.    if(is_numeric($_GET['width']) && $_GET['width']>100 && $_GET['width']<500) $SECURITY_WIDTH = $_GET['width'];
    12.    if(is_numeric($_GET['height']) && $_GET['height']>100 && $_GET['height']<500) $SECURITY_HEIGHT = $_GET['height'];
    13.    if(is_numeric($_GET['qty']) && $_GET['qty']>2 && $_GET['qty']<10) $SECURITY_NUM_GENSIGN = $_GET['qty'];
    14.  
    15. // Ядро
    16.  
    17.    session_register('securityCode');
    18.  
    19.    $SECURITY_FONT_SIZE = intval($SECURITY_HEIGHT/(($SECURITY_HEIGHT/$SECURITY_WIDTH)*7));
    20.    $SECURITY_NUM_SIGN = intval(($SECURITY_WIDTH*$SECURITY_HEIGHT)/150);
    21.    $CODE = array();
    22.    $LETTERS = array('0','1','2','3','4','5','6','7','8','9');
    23.    $FIGURES = array('50','70','90','110','130','150','170','190','210');
    24.  
    25. // Создаем полотно
    26.  
    27.    $src = imagecreatetruecolor($SECURITY_WIDTH,$SECURITY_HEIGHT);
    28.  
    29. // Заливаем фон
    30.  
    31.    $fon = imagecolorallocate($src,255,255,255);
    32.    imagefill($src,0,0,$fon);
    33.  
    34.  
    35.  
    36.  
    37. // Если папка шрифтов пуста
    38.  
    39.        for($i = 0; $i<$SECURITY_NUM_GENSIGN; $i++)
    40.        {
    41.  
    42.         // Ориентир
    43.  
    44.            $h = 1;
    45.  
    46.         // Рисуем
    47.  
    48.            $color = imagecolorallocatealpha($src,$FIGURES[rand(0,sizeof($FIGURES)-1)],$FIGURES[rand(0,sizeof($FIGURES)-1)],$FIGURES[rand(0,sizeof($FIGURES)-1)],rand(10,30));
    49.            $letter = $LETTERS[rand(0,sizeof($LETTERS)-1)];
    50.            $x = (empty($x)) ? $SECURITY_WIDTH*0.1 : $x + ($SECURITY_WIDTH*0.8)/$SECURITY_NUM_GENSIGN+rand(0,$SECURITY_WIDTH*0.01);
    51.            $y = ($h == rand(1,2)) ? (($SECURITY_HEIGHT*1)/4) + rand(0,$SECURITY_HEIGHT*0.1) : (($SECURITY_HEIGHT*1)/4) - rand(0,$SECURITY_HEIGHT*0.1);
    52.  
    53.         // Запоминаем
    54.  
    55.            $CODE[] = $letter;
    56.            if($h == rand(0,10)) $letter = strtoupper($letter);
    57.  
    58.         // Пишем
    59.  
    60.            imagestring($src,9,$x,$y,$letter,$color);
    61.        }
    62.  
    63. // Получаем код
    64.  
    65.    $_SESSION['securityCode'] = implode('',$CODE);
    66.  
    67. // Печать
    68.  
    69.    if($SECURITY_IMAGE_TYPE == 'PNG')
    70.    {
    71.        header ("Content-type: image/png");
    72.        imagepng($src);
    73.    }
    74.    elseif($SECURITY_IMAGE_TYPE == 'JPEG')
    75.    {
    76.        header ("Content-type: image/jpeg");
    77.        imagejpeg($src);
    78.    }
    79.    else
    80.    {
    81.        header ("Content-type: image/gif");
    82.        imagegif($src);
    83.    }
    84.  
    85.    imagedestroy($src);
    86. ?>

    второй файл назавем на шару register.php
    и вставляешь туда где нужно - вот это во втором файле


    сверху условия -

    Код (Text):
    1. elseif (isset($_POST['securityCode']) && isset($_SESSION['securityCode'])) {
    2.                     if (strtolower($_POST['securityCode']) == $_SESSION['securityCode']) {
    3.                         unset($_SESSION['securityCode']);
    4.                     }
    5.                     else{
    6.                         $stop =1;
    7.                         $err .= "<cetner>Неверный защитный код ! </center>";
    8.                         unset($_SESSION['securityCode']);
    9.                     }
    10.                 }
    11.                 elseif (!isset($_POST['securityCode']) || !isset($_SESSION['securityCode'])) {
    12.                     $stop =1;
    13.                     $err .= "<center>Вы не ввели защитный код ! </center>";
    14.                 }
    снизу вывод рисунка капчи вставляешь где кнопка зарегистрироваться выше её или как удобно


    Код (Text):
    1.  
    2. <?if (!$_GET['edit']) {?>
    3.                   <img src="sec1.php" border="1"><BR>
    4.                   Введите текст, изображенный на рисунке:<BR>
    5.                 <input type="text" name="securityCode" size="20" style="border: 1px double #000000;font-size: 10px;color: #000000 ;" value="" maxlength="5" > <?}?>
    это не полный код если вставить нужно поправить и подставить под вайл в котором хочешь чтобы была капча
     
  15. ROM710

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

    С нами с:
    24 фев 2014
    Сообщения:
    17
    Симпатии:
    0
    Здравствуйте, а кто подскажет - как связать регистрацию и страницу сайта ? Учу сессии, но что то не до понимаю, хоть бы кто подсказал.
     
  16. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    - на странице Регистрации - юзер вносит свои данные и вы его запоминаете в БД
    - далее на странице Авторизации - юзер вводит логин и пароль. вы проверяете есть ли такой в БД и совпадает ли пароль. если да записываете в сессию флаг - что юзер авторизован. если нет то незаписываете
    - далее на любой другой странице сайта - проверяете если в сессии есть флаг что юзер авторизован - то показываете страницу, если флага нет или он неустановлен - то отправляете на страницу Авторизации