
19.12.2016, 22:19
|
Профессор
|
|
Регистрация: 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']);
?>
|
|

20.12.2016, 09:00
|
Профессор
|
|
Регистрация: 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(), потому и не работает.
|
|

20.12.2016, 11:19
|
Профессор
|
|
Регистрация: 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.
|
|

20.12.2016, 11:28
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Не надо копировать весь ответ вам полностью, копируйте только то, на что хотите оставить свой комментарий, или ничего, если не будет такого. Зачем из постов делать портянки. )
Не знаю чего вы там сделали по другому, я пишу по факту, а по факту есть и полная бредятина.
Например какое отношение имеет код if(count($_POST)>0) ... к коду выводящему форму, у вас ведь асинхронный обмен клиента с сервером, так?
Форму сервер принимает сразу всю, составной частью которой является и каптча, а не частями. А это означает, что в случае неверно указанного кода проверки сервер просто игнорирует принятые данные, если же верно, принимает.
|
|

20.12.2016, 18:08
|
Профессор
|
|
Регистрация: 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']);
?>
|
|

20.12.2016, 18:30
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Форма отправляется серверу асинхронным методом?
|
|

20.12.2016, 19:10
|
Профессор
|
|
Регистрация: 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>
|
|

20.12.2016, 19:46
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Это $(form).ajaxSubmit(...) асинхронный запрос сервера, отправляющий форму без перезагрузки страницы.
Код самой формы может быть на странице размещен сразу, при ее вызове, или же тоже подгружаться динамически, асинхронно.
В любом случае загрузки формы, код проверяющий каптчу при выводе формы if(count($_POST)>0), это глупость.
1) форма на странице и отправляется асинхронно серверу
2) сервер может проверяет количество разрешенных запросов (отправки формы, то есть ввод кода каптчи), но конечно не такой глупостью как count($_POST)>0
3) проверяется код каптчи хранящийся в сессии с кодом отправленным формой, здесь два развития событий:
а) код верный - данные формой принимаются, это может быть их сохранение, проверка и разрешение входа и т.д., и т.п. Из сессии удаляется код каптчи, пользователю отдается "Оk" и он перенаправляется или иное по сценарию. Но это в том случае, если и проверка данных из формы проходит проверку, иначе не зависимо от верности ввода каптчи, возврат ошибок клиенту и обновление каптчи;
б) код каптчи неверный - сообщаем об этом клиенту, данные формы не проверяются, уменьшается число попыток ввода каптчи, если таколй контрль есть.
Чего вы вытворяете у себя даже представить невозможно.
|
|

20.12.2016, 20:29
|
Профессор
|
|
Регистрация: 20.10.2016
Сообщений: 223
|
|
Сообщение от laimas
|
...
Чего вы вытворяете у себя даже представить невозможно.
|
Я все делаю так, как учит Артур Жур. Почему у него каптча проверяется через remote(c 33-й мин): https://www.youtube.com/watch?v=w1LJFdy3P2g а у меня не хочет так работать... В чем здесь прикол, почему так?
|
|

21.12.2016, 08:21
|
Профессор
|
|
Регистрация: 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.
|
|
|
|