Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.12.2016, 22:19
Профессор
Отправить личное сообщение для DDim1000 Посмотреть профиль Найти все сообщения от DDim1000
 
Регистрация: 20.10.2016
Сообщений: 223

Проверка кода каптчи, как правильно сделать?
Подскажите пожалуйста, как будет правильно сделать проверку введенного кода каптчи?

Я вот так пробовал сделать, но, remote возвращает false.


<?php
    session_start();
?>
<html>
<head>
<script type="text/javascript" src="jquery-1.8.2.min.js"></script>
<script type="text/javascript" src="jquery.validate-1.15.0.min.js"></script>
<script type="text/javascript" src="jquery.form.js"></script>
<script type="text/livescript" src="additional-methods.js"></script>
<script>
$(document).ready(function(){
    
reloadcaptcha.onclick = function() {
  var captcha = $("#captcha");
  captcha.attr('src', captcha.attr('src').replace(/&d=.*$/, '') + '&d=' + new Date().getTime());
}
 
});
 
</script>


<script type="text/javascript">
       $('document').ready(function () {


            $('#form_reg').validate({

                //Правила для проверки

                rules: {

				"keystring":{ 
                   required: true,
					   keystring: { keystring: true },
                       minlength: 5,
                       maxlength: 15,
	                   remote: {url: "../kcaptcha/reg/form_example.php", type:"post" } 
			    },				

				},
                //Текста предупреждений

                messages: {
                "keystring":{ 
				    required:"Введите код с картинки!",
					remote: "Неверный код!"
                },
             },


			//Обработчик и отправка данных

                submitHandler: function (form) {
					
	
                }
                                                               
            });

        });

 </script>
</head>
<body>
 
<form method="post" id="form_reg" action="#">
<p>Enter text shown below:</p>
<p><img id="captcha" src="./reg/?<?php echo session_name()?>=<?php echo session_id()?>"></p>
<p id="reloadcaptcha">Показать другой код</p>
<p><input type="text" name="keystring" id="keystring"></p>
<p><input type="submit" value="Check"></p>
</form>
 
</body>
</html>


Обработчик form_example.php:

<?php
session_start();
?>

<?php
if(count($_POST)>0){
	if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] === $_POST['keystring']){
		echo "true";
	}else{
		echo "false";
	}
}
unset($_SESSION['captcha_keystring']);
?>
Ответить с цитированием
  #2 (permalink)  
Старый 20.12.2016, 09:00
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Еще раз: если механизм сессий работает (сервер стартует сессию, а у клиента включены куки), то браузер сам передает id сессии серверу, таким образом "привязывая" клиента к его сессии. То есть вот это

<?php echo session_name()?>=<?php echo session_id()?>

полная хня, навороченная кем-то не понять для чего. Если сессия умерла, то еще не факт, что по этим генам ее можно воскресить, то есть что она хранила будет утеряно. Значит стартовать новую и для всего. Чей код каптчи используется, свой или же чужой?

Вот это new Date().getTime() для того, что подставляя новое случайное значение в url, заставлять браузер обращаться к серверу, а не к кешу. Если src каптчи, это только код формирующий ее, то важен просто факт обращения к этому скрипту, а session_start() этого скрипта будет продолжать сессию, id которой передает браузер. И вполне достаточно сначала

<img id="captcha" src="./reg/?<?=time()?>">

и обновления:

$('#reloadcaptcha').click(function() {
        var img = $('#captcha')[0];
        img.src = img.src.replace(/\d+/, new Date().getTime())
})


session_start() скрипта обрабатывающего прием формы также продолжает сессию, id которой передает браузер, в которой и хранится код коптчи, который в нее пишет скрипт ее формирующий.

unset($_SESSION['captcha_keystring']); - удаление кода каптчи из сессии должно происходить только после того, как пользователь ввел его правильно.

У вас же где-то все запутано, либо также бездумно где-то unset(), потому и не работает.
Ответить с цитированием
  #3 (permalink)  
Старый 20.12.2016, 11:19
Профессор
Отправить личное сообщение для DDim1000 Посмотреть профиль Найти все сообщения от DDim1000
 
Регистрация: 20.10.2016
Сообщений: 223

Сообщение от laimas Посмотреть сообщение
Еще раз: если механизм сессий работает (сервер стартует сессию, а у клиента включены куки), то браузер сам передает id сессии серверу, таким образом "привязывая" клиента к его сессии. То есть вот это

<?php echo session_name()?>=<?php echo session_id()?>

полная хня, навороченная кем-то не понять для чего. Если сессия умерла, то еще не факт, что по этим генам ее можно воскресить, то есть что она хранила будет утеряно. Значит стартовать новую и для всего. Чей код каптчи используется, свой или же чужой?

Вот это new Date().getTime() для того, что подставляя новое случайное значение в url, заставлять браузер обращаться к серверу, а не к кешу. Если src каптчи, это только код формирующий ее, то важен просто факт обращения к этому скрипту, а session_start() этого скрипта будет продолжать сессию, id которой передает браузер. И вполне достаточно сначала

<img id="captcha" src="./reg/?<?=time()?>">

и обновления:

$('#reloadcaptcha').click(function() {
        var img = $('#captcha')[0];
        img.src = img.src.replace(/\d+/, new Date().getTime())
})


session_start() скрипта обрабатывающего прием формы также продолжает сессию, id которой передает браузер, в которой и хранится код коптчи, который в нее пишет скрипт ее формирующий.

unset($_SESSION['captcha_keystring']); - удаление кода каптчи из сессии должно происходить только после того, как пользователь ввел его правильно.

У вас же где-то все запутано, либо также бездумно где-то unset(), потому и не работает.

Я сделал по другому.. Но, как сделать так, чтоб данные не отправлялись, если код введен не верно?

Сейчас выводится true, если код верный, и false - если вводишь не верный код.

<form method="post" id="form_reg" action="#">
<p>Enter text shown below:</p>
<p><img id="captcha" src="./reg/?<?php echo session_name()?>=<?php echo session_id()?>"></p>
<p id="reloadcaptcha">Показать другой код</p>
<p><input type="text" name="keystring" id="keystring"><?php
if(count($_POST)>0){
	if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] === $_POST['keystring']){
		echo "true";
	}else{
		echo "false";
	}
}
unset($_SESSION['captcha_keystring']);
?>
</p>
<p><input type="submit" value="Check"></p>
</form>

Последний раз редактировалось DDim1000, 20.12.2016 в 11:23.
Ответить с цитированием
  #4 (permalink)  
Старый 20.12.2016, 11:28
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Не надо копировать весь ответ вам полностью, копируйте только то, на что хотите оставить свой комментарий, или ничего, если не будет такого. Зачем из постов делать портянки. )

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

Например какое отношение имеет код if(count($_POST)>0) ... к коду выводящему форму, у вас ведь асинхронный обмен клиента с сервером, так?

Форму сервер принимает сразу всю, составной частью которой является и каптча, а не частями. А это означает, что в случае неверно указанного кода проверки сервер просто игнорирует принятые данные, если же верно, принимает.
Ответить с цитированием
  #5 (permalink)  
Старый 20.12.2016, 18:08
Профессор
Отправить личное сообщение для DDim1000 Посмотреть профиль Найти все сообщения от DDim1000
 
Регистрация: 20.10.2016
Сообщений: 223

Сообщение от laimas Посмотреть сообщение
...
... А это означает, что в случае неверно указанного кода проверки сервер просто игнорирует принятые данные, если же верно, принимает.

Странно... Судя по условию, выводится слово true, или false, и дальше идет отправка данных... Из-за чего сервер будет игнорировать отправку данных, если по условию нужно только вывести true или false?

<img id="captcha" src="./reg/kcaptcha/?<?php echo session_name()?>=<?php echo session_id()?>">
<p id="reloadcaptcha">Показать другой код</p>

<label id="label-captcha">Код с картинки</label>
<span class="star-captcha">*</span>
<input type="text" name="reg_captcha" id="reg_captcha" /><?php
if(count($_POST)>0){
	if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] === $_POST['reg_captcha']){
		echo "true";
	}else{
		echo "false";
	}
}
unset($_SESSION['captcha_keystring']);
?>
Ответить с цитированием
  #6 (permalink)  
Старый 20.12.2016, 18:30
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Форма отправляется серверу асинхронным методом?
Ответить с цитированием
  #7 (permalink)  
Старый 20.12.2016, 19:10
Профессор
Отправить личное сообщение для DDim1000 Посмотреть профиль Найти все сообщения от DDim1000
 
Регистрация: 20.10.2016
Сообщений: 223

Сообщение от laimas Посмотреть сообщение
Форма отправляется серверу асинхронным методом?
Я не знаю как это называется.... Могу только показать:
<script type="text/javascript">
       $('document').ready(function () {

            $('#form_reg').validate({

                //Правила для проверки

                rules: {
    ....
		"reg_captcha":{ 
 		    required:true,
			    },				

				},

                //Текста предупреждений

                messages: {
...
                "reg_captcha":{ 
				    required:"Введите код с картинки!",
                },
             },

			//Обработчик и отправка данных

                submitHandler: function (form) {
					
		 $("#fade").toggle(400);

                    $(form).ajaxSubmit({

                        success: function (data) {

                            if (date == 'true') {
								
                               $("#block-form-registration").fadeOut(300, function () {

                                    $("#reg_message").addClass("reg_message_good").fadeIn(400).html("Вы успешьно зарегистровались!");

                                    $("#form_submit").hide();

                                });

                            }else
							   {
							      $("#reg_message").addClass("reg_message_error").fadeIn(400).html(date);
							   }
                        }

                    })

                }
                                                               
            });

        });



<form method="post" id="form_reg" action="/reg/handler_reg.php">
...
<img id="captcha" src="./reg/kcaptcha/?<?php echo session_name()?>=<?php echo session_id()?>">
<p id="reloadcaptcha">Показать другой код</p>

<label id="label-captcha">Код с картинки</label>
<span class="star-captcha">*</span>
<input type="text" name="reg_captcha" id="reg_captcha" /><?php
if(count($_POST)>0){
	if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] === $_POST['reg_captcha']){
		echo "true";
	}else{
		echo "false";
	}
}
unset($_SESSION['captcha_keystring']);
?>


<p align="right"><input type="submit" name="reg_submit" id="form_submit" value="Регистрация"/> </p>

</form>
Ответить с цитированием
  #8 (permalink)  
Старый 20.12.2016, 19:46
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Это $(form).ajaxSubmit(...) асинхронный запрос сервера, отправляющий форму без перезагрузки страницы.

Код самой формы может быть на странице размещен сразу, при ее вызове, или же тоже подгружаться динамически, асинхронно.

В любом случае загрузки формы, код проверяющий каптчу при выводе формы if(count($_POST)>0), это глупость.

1) форма на странице и отправляется асинхронно серверу
2) сервер может проверяет количество разрешенных запросов (отправки формы, то есть ввод кода каптчи), но конечно не такой глупостью как count($_POST)>0
3) проверяется код каптчи хранящийся в сессии с кодом отправленным формой, здесь два развития событий:
а) код верный - данные формой принимаются, это может быть их сохранение, проверка и разрешение входа и т.д., и т.п. Из сессии удаляется код каптчи, пользователю отдается "Оk" и он перенаправляется или иное по сценарию. Но это в том случае, если и проверка данных из формы проходит проверку, иначе не зависимо от верности ввода каптчи, возврат ошибок клиенту и обновление каптчи;
б) код каптчи неверный - сообщаем об этом клиенту, данные формы не проверяются, уменьшается число попыток ввода каптчи, если таколй контрль есть.

Чего вы вытворяете у себя даже представить невозможно.
Ответить с цитированием
  #9 (permalink)  
Старый 20.12.2016, 20:29
Профессор
Отправить личное сообщение для DDim1000 Посмотреть профиль Найти все сообщения от DDim1000
 
Регистрация: 20.10.2016
Сообщений: 223

Сообщение от laimas Посмотреть сообщение
...
Чего вы вытворяете у себя даже представить невозможно.
Я все делаю так, как учит Артур Жур. Почему у него каптча проверяется через remote(c 33-й мин): https://www.youtube.com/watch?v=w1LJFdy3P2g а у меня не хочет так работать... В чем здесь прикол, почему так?
Ответить с цитированием
  #10 (permalink)  
Старый 21.12.2016, 08:21
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Я не знаю кто такой Жур и чему он учит, но советовал бы вам учить язык программирования не по мультикам, а по учебникам. Хотите научиться вязать спицами? Согласен, в этом случае мультики помогут.

Изучать надо с простого до сложного, ибо вы не понимая многого, пытаетесь охватить необъятное.

Здесь два простых файла, сохраните первый под именем index.php, а второй captcha.php на локальном сервере в созданном локальном домене тестовом. Запустите.

Код из JS имеет только нативный обработчик, изменяющий код каптчи щелчком по самой каптче. Отправляйте форму ничего в нее не вводя - результата не будет, будет вновь предлагаться форма. Введите только код каптчти, опять будет форма. Введите и имя, но с неверным кодом каптчи - опять форма. Все это ошибки, которые не отвечают требованию проверки:

if($post['secret'] && $post['secret']==$_SESSION['secret'] && $post['name'])

и только если и имя введено и код каптчи верный, то будет результат.

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

Поймете это простое, тогда следующий этап - прикрутить к этому асинхронный обмен клиента с сервером, и т.д., и т.п.

<?php
session_start();
if($post = array_diff(array_map('trim', $_POST), [''])) {
    if($post['secret'] && $post['secret']==$_SESSION['secret'] && $post['name']) {
        $_SESSION['clubman'] = htmlspecialchars($post['name']);
        unset($_SESSION['secret']);
    }
}
?>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style>
form {
    width: 30%;
    margin: 40px auto;
}
label {
    display: block;
    margin: 10px;
}
label * {
    vertical-align: middle;
}
img {
    cursor: pointer;
}
button {
    padding: 3px 15px;
    margin-top: 10px;
    float: right;
}
</style> 
</head>
<body>
<?php
if(!$_SESSION['clubman']) {
?>
<form method="post">
<fieldset>
<legend>Вы не робот?</legend>
<label>Имя: <input name="name" /></label>
<label>Код: <input name="secret" /> <img src="captcha.php?<?=time()?>" onclick="this.src=this.src.replace(/\d+/, new Date().getTime())" /></label>
</fieldset>
<button>Подтверждаю</button>
</form>
<?php
} else {
?>
<p>Приветствуем участника клуба <?=$_SESSION['clubman']?>!</p>
<?php
}
?>
</body>
</html>


<?php 
session_start(); 
$code = rand(1000,9999); 
$_SESSION['secret'] = $code; 
     
$img = imagecreate (50, 23);
imagecolorallocate($img, 0, 0, 0);
$color = imagecolorallocate($img, 255, 255, 255); 
imagestring($img, 5, 6, 3, $code, $color); 

header('Cache-control: no-cache'); 
header('Content-type: image/gif'); 
imagegif($img);
imagedestroy($img); 
?>

Последний раз редактировалось laimas, 21.12.2016 в 10:10.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать поворот DIV клонов alexgrenn Элементы интерфейса 4 18.04.2016 21:58
Как сделать что бы картинки с другого url отображались как свои zlodey Серверные языки и технологии 1 04.05.2015 21:30
Как сделать такую страницу mortido Элементы интерфейса 11 02.10.2014 07:20
Как правильно обновить div из БД в MVC??? espltd AJAX и COMET 2 11.04.2014 01:28
Подскажите, как сделать правильно отрисовку без перезагрузки всей страницы yiooxir Angular.js 1 24.12.2013 18:30