Проверка jQuery + проблема защиты - PullRequest
0 голосов
/ 08 января 2011

У меня странная проблема с использованием плагина jQuery Validation .Во-первых, вот мой код:

formvalid.js

var v = jQuery("#sendform").validate({
        rules: {
            /* some other rules */
            captcha: {
                required: true,
                remote: "securimage/process.php"
            }
        },            
        messages: {
            /* some other messages */
            captcha: {
        required:"Security code is required",
        remote:"Security code is incorrect!"
        }
        }
    });

process.php

<?php
/* I tried with and without session_start(). 
Both ways works with same probelm (read next)*/
//session_start();
include_once '../securimage/securimage.php';

$securimage = new Securimage();

if ($securimage->check($_GET['captcha']) == false) 
    echo "false";

else
    echo "true";
?>

sendform.php

<?php
include_once 'securimage/securimage.php';

//echo $_POST['captcha'];

$securimage = new Securimage();
//echo "<br/>".$securimage->getCode();

if($_POST['captcha'] && $securimage->check($_POST['captcha']))
{
    //do sending
}
?>

Итак, проблема в том, что когда я проверяю security code с помощью запроса AJAX, ajax работает нормально, но когда я отправляю форму, $securimage->check($_POST['captcha']) в sendform.php возвращает false.Затем я попытался отключить удаленную проверку capctha и альт $securimage->check($_POST['captcha']) в sendform.php вернул true!

Как вы можете видеть, я echo некоторые значения в sendform.php и результат:

Случай № 1: проверка кода AJAX включена .

Результаты:

echo $_POST['captcha'];               // User_input_value;
echo $securimage->getCode();          // nothing
$securimage->check($_POST['captcha']) // false

Дело № 2: проверка кода AJAX отключена .

Результаты:

echo $_POST['captcha'];               // User_input_value;
echo $securimage->getCode();          // code from image
$securimage->check($_POST['captcha']) // true (if equals)

Кто-нибудь знает, как заставить это работать?

Спасибо за любой совет.

Ответы [ 2 ]

2 голосов
/ 03 декабря 2012

Чтобы предотвратить сброс captch, вы должны проверить себя без вызова функции check () в process.php, как показано ниже code

<?php
include_once 'securimage.php';
if(!isset($_GET['txtcaptcha']))
    return 'false';


$securimage = new Securimage();
$securecode = $securimage->getCode();

if (strtolower($securecode) != strtolower($_GET['txtcaptcha'])) 
    echo "false";

else
    echo "true";
?>
1 голос
/ 09 января 2011

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

Что я предлагаю, так это чтобы в вашей сессии был установлен флаг, который вы бы установили TRUE в своем process.php после действительной капчи, а затем отметили его вместо $securimage->check($_POST['captcha']) в вашем sendform.php:

if ($securimage->check($_GET['captcha']) == false) {
    $_SESSION['valid'] = FALSE;
    echo "false";
} else {
    $_SESSION['valid'] = TRUE;
    echo "true";
}

А:

if($_POST['captcha'] && isset($_SESSION['valid']) && $_SESSION['valid']) // set it back to false inside this!

Теперь вот две заметки:

  • Поскольку у вас есть два отдельных вызова, кто-то еще может изменить капчу между двумя вызовами
  • Поскольку это всего лишь капча, и вы, скорее всего, используете ее для предотвращения спама, я бы не стал использовать технику, которую я разместил выше! на самом деле, я бы даже не стал делать еще одну проверку с помощью капчи в sendform.php

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

...