Доброго времени суток всем участникам форума, только начал изучать PHP и пробую для тренировки писать простейший скрипт регистрации пользователей на сайте и для защиты от роботов пытаюсь подключить самописную простейшую капчу. Но есть такая проблема-если вводишь необходимые данные в поле ответа и нажимаешь"отправить", то страница обновляется и данные ответа приходят устаревшие, соответственно, добавить нового пользователя не получается. Я где-то понимаю что надо чего-то думать с session и cookie, но ни чего придумать не могу.Просьба подсказать, что делаю не так. вот скрипт капчи Код (Text): <?php session_start(); $_SESSION['code']; $a=mt_rand(1,20);//вводим переменные для капчи $b=mt_rand(11,20); $c=$a+$b; $_SESSION['code']=$c; ?> а вот сам скрипт регистрации: Код (Text): <?php session_start(); require_once"capcha.php"; ?> <form method=post> Введите имя: <input type=text name="login" maxlength="20" size="15" /><br /><br /> Введите пароль: <input type=password name="password" maxlength="50" size="15" /> <br /><br /> <input type=text name="answ" method=post /><br /> <input type=submit name="go" value="отправить" /> </form> </form> <?php $host="localhost"; $user="root"; $pass=""; $db="user"; mysql_connect($host,$user,$pass)or die("Невозможно установить соединение".mysql_error()); mysql_query("CREATE DATABASE IF NOT EXISTS $db"); mysql_select_db($db)or die("Невозможно подключиться к базе данных".mysql_error()); mysql_query('CREATE TABLE IF NOT EXISTS `users`( `id` INT AUTO_INCREMENT PRIMARY KEY, `login` VARCHAR(60) UNIQUE NOT NULL, `password` VARCHAR(60) NOT NULL )')or die("Невозможно создать таблицу".mysql_error()); $login=mysql_real_escape_string($_REQUEST['login']); $password=md5(mysql_real_escape_string($_REQUEST['password'])); $rez=mysql_query("SELECT COUNT(login) FROM`users` WHERE `login`='".$login."'"); echo"Для подтверждения того, что Вы не робот, дайте ответ, сколько будет $a плюс $b <br>"; if(isset($_REQUEST['go'])) { if(!isset($_REQUEST['login'])) {echo"Вы не ввели логин !<br>";} elseif(empty($_REQUEST['password'])) {echo"Вы не ввели пароль!<br>";} elseif(strlen(trim($_REQUEST['login']))<6) {echo"Поле login слишком короткое!<br>";} elseif(strlen(trim($_REQUEST['password']))<6) {echo"Поле пароль слишком короткое!<br>";} elseif(!preg_match('/^[a-zA-Z0-9]+$/is',$_REQUEST['password'])) {echo"Поле пароль содержит недопустимый символ!<br>";} elseif(!preg_match('/^[a-zA-Z0-9]+$/is',$_REQUEST['login'])) {echo"Вы ввели недопустимый символ в поле login!!! <br>";} elseif(mysql_result($rez,0)>0) echo"Такой логин уже существует!"; elseif($_REQUEST['answ']!=$_SESSION['code']) echo"Вы ответили не верно!"; else mysql_query("INSERT IGNORE INTO `users` SET `login`='".$login."', `password`='".$password."'")or die("Невозможно вставить запись".mysql_error()); $_SESSION=array(); unset($_COOKIE[session_name()]); session_destroy(); } ?>
Скрипт капчи просто Евгениален. Не вижу, чтобы Вы выводили там что-то. Капча должна быть на картинке. Такую капчу запросто поломают.
Капчу я вывожу таким образом Код (Text): echo"Для подтверждения того, что Вы не робот, дайте ответ, сколько будет $a плюс $b <br>"; Я понимаю, что капча очень слабенькая, но вопрос стоит в том, как правильно связать ее с формой регистрации, так как при вводе ответа и нажатии на кнопку "отправить" выдается ответ "Вы ответили не верно".
shpok, здравствуйте. Вероятнее всего Вы используете два этих скрипта на одной физической странице. Разумеется при таком подходе вероятность ответить "верно" стремится к вероятности того, что два раза подряд переменные 'a' и 'b' дадут одну и ту же сумму. Попробуйте переделать первый скрипт так: Код (PHP): session_start(); if(!isset($_SESSION['code']) and empty($_SESSION['code'])){ $a=mt_rand(1,20);//вводим переменные для капчи $b=mt_rand(11,20); $c=$a+$b; $_SESSION['code']=$c; }
Спасибо большое за ответ, вечером попробую и отпишусь. Добавлено спустя 55 минут 37 секунд: А Вы бы могли пояснить, как их надо использовать? Я свою самописную капчу подключаю через require_once, если надо как-то по-другому, объясните,пожалуйста, как. Что нужно сделать через сессию?
Сразу извиняюсь за свою ошибку: не на одной физической, а на одной логической странице. Значит на одной логической странице. Вы и так все через сессию делаете. Камрад igordata лишь подтвердил, что Вы идете по правильному пути. Все дело в том, что, т.к. все идет на одной странице, при каждом запуске Вашего скрипта переменная $_SESSION['code'] перезаписывается (генерируются новые $a и $b), а пользователю выводятся уже старые (т.е. относительно новые, но как только он отправляет запрос - уже старые). Поэтому маловероятно, что кто-либо так пройдёт эту CAPTCHA. Попробуйте переделать Ваш скрипт как я советовал и посмотрите что получилось.
Это еще слабо сказано. Если это вообще можно назвать капчей Она 200% уязвима. Она просто хуже, чем слабее
Спасибо за критику, я писал ее в качестве тренировки, для так, сказать, закрепления теоретических познаний.Хоть с чего-то надо пробовать.
вот капча с описанием (2 php файла) sec1.php - его просто создаешь и закидываешь в сайт он там лежит Код (Text): <?PHP // Настройки $SECURITY_IMAGE_TYPE = 'GIF'; // Возможные форматы: GIF, JPEG, PNG $SECURITY_WIDTH = 130; // Ширина изображения $SECURITY_HEIGHT = 30; // Высота изображения $SECURITY_NUM_GENSIGN = 5; // Количество символов, которые нужно набрать $EXT = strtoupper($_GET['ext']); if($EXT == 'GIF' || $EXT == 'JPEG' || $EXT == 'PNG') $SECURITY_IMAGE_TYPE = $EXT; if(is_numeric($_GET['width']) && $_GET['width']>100 && $_GET['width']<500) $SECURITY_WIDTH = $_GET['width']; if(is_numeric($_GET['height']) && $_GET['height']>100 && $_GET['height']<500) $SECURITY_HEIGHT = $_GET['height']; if(is_numeric($_GET['qty']) && $_GET['qty']>2 && $_GET['qty']<10) $SECURITY_NUM_GENSIGN = $_GET['qty']; // Ядро session_register('securityCode'); $SECURITY_FONT_SIZE = intval($SECURITY_HEIGHT/(($SECURITY_HEIGHT/$SECURITY_WIDTH)*7)); $SECURITY_NUM_SIGN = intval(($SECURITY_WIDTH*$SECURITY_HEIGHT)/150); $CODE = array(); $LETTERS = array('0','1','2','3','4','5','6','7','8','9'); $FIGURES = array('50','70','90','110','130','150','170','190','210'); // Создаем полотно $src = imagecreatetruecolor($SECURITY_WIDTH,$SECURITY_HEIGHT); // Заливаем фон $fon = imagecolorallocate($src,255,255,255); imagefill($src,0,0,$fon); // Если папка шрифтов пуста for($i = 0; $i<$SECURITY_NUM_GENSIGN; $i++) { // Ориентир $h = 1; // Рисуем $color = imagecolorallocatealpha($src,$FIGURES[rand(0,sizeof($FIGURES)-1)],$FIGURES[rand(0,sizeof($FIGURES)-1)],$FIGURES[rand(0,sizeof($FIGURES)-1)],rand(10,30)); $letter = $LETTERS[rand(0,sizeof($LETTERS)-1)]; $x = (empty($x)) ? $SECURITY_WIDTH*0.1 : $x + ($SECURITY_WIDTH*0.8)/$SECURITY_NUM_GENSIGN+rand(0,$SECURITY_WIDTH*0.01); $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); // Запоминаем $CODE[] = $letter; if($h == rand(0,10)) $letter = strtoupper($letter); // Пишем imagestring($src,9,$x,$y,$letter,$color); } // Получаем код $_SESSION['securityCode'] = implode('',$CODE); // Печать if($SECURITY_IMAGE_TYPE == 'PNG') { header ("Content-type: image/png"); imagepng($src); } elseif($SECURITY_IMAGE_TYPE == 'JPEG') { header ("Content-type: image/jpeg"); imagejpeg($src); } else { header ("Content-type: image/gif"); imagegif($src); } imagedestroy($src); ?> второй файл назавем на шару register.php и вставляешь туда где нужно - вот это во втором файле сверху условия - Код (Text): elseif (isset($_POST['securityCode']) && isset($_SESSION['securityCode'])) { if (strtolower($_POST['securityCode']) == $_SESSION['securityCode']) { unset($_SESSION['securityCode']); } else{ $stop =1; $err .= "<cetner>Неверный защитный код ! </center>"; unset($_SESSION['securityCode']); } } elseif (!isset($_POST['securityCode']) || !isset($_SESSION['securityCode'])) { $stop =1; $err .= "<center>Вы не ввели защитный код ! </center>"; } снизу вывод рисунка капчи вставляешь где кнопка зарегистрироваться выше её или как удобно Код (Text): <?if (!$_GET['edit']) {?> <img src="sec1.php" border="1"><BR> Введите текст, изображенный на рисунке:<BR> <input type="text" name="securityCode" size="20" style="border: 1px double #000000;font-size: 10px;color: #000000 ;" value="" maxlength="5" > <?}?> это не полный код если вставить нужно поправить и подставить под вайл в котором хочешь чтобы была капча
Здравствуйте, а кто подскажет - как связать регистрацию и страницу сайта ? Учу сессии, но что то не до понимаю, хоть бы кто подсказал.
- на странице Регистрации - юзер вносит свои данные и вы его запоминаете в БД - далее на странице Авторизации - юзер вводит логин и пароль. вы проверяете есть ли такой в БД и совпадает ли пароль. если да записываете в сессию флаг - что юзер авторизован. если нет то незаписываете - далее на любой другой странице сайта - проверяете если в сессии есть флаг что юзер авторизован - то показываете страницу, если флага нет или он неустановлен - то отправляете на страницу Авторизации