Возникли большие проблемы при вставке reCaptcha на основе PHP в Shoutbox на основе jQuery - PullRequest
5 голосов
/ 03 марта 2012

Это мой первый вопрос о переполнении стека (однако я не первый раз использую хорошие ответы на вопросы других людей).Я эмпирический веб-программист, так что будьте уверены, я всегда стараюсь до рассвета рассуждать об отсутствии правильных инструкций.Вот когда Stack Overflow очень пригодится.Но на этот раз я уже три или четыре дня бьюсь головой об стену PHP.Поэтому я прошу помощи по этому вопросу.

Теперь программирование, по сути, чисто математическое.Вот почему в конечном итоге можно понять его язык и что происходит.Я стал очень опытным программистом AS, а затем решил переключиться с Flash, попробовать свои силы в HTML, используя JS и jQuery (так сказать, конкуренцию), и влюбился.Тем не менее, я скорее любитель в этой области.Но мои отношения с PHP, в частности, совершенно другого рода: я этого не понимаю и не испытываю к этому терпения;это санскрит для меня.Может быть, я не использовал его достаточно, чтобы освоить его, но мне кажется, что это не имеет логического смысла, как JS и HTML, AS и ETC.do.

Во всяком случае, мое затруднительное положение:

Я создал пользовательский Чат на основе большого кода, приведенного здесь: http://yensdesign.com/2009/01/create-a-shoutbox-using-php-and-ajax-jquery/. Однако код не содержит капчу, что делает его полностью уязвимым для СПАМА.Поэтому я сначала разработал простую капчу, состоящую из различных изображений, которые содержат цифры, и все они складываются до определенного числа.Теперь я пытаюсь придумать и пытаюсь добавить Google reCaptcha .

ReCaptcha на основе PHP.Sbox использует PHP, но как только JS-файл выполняет проверку формы;он использует PHP для окончательного сохранения данных, введенных в базу данных mySql, и извлечения ранее сохраненных данных для отображения.Я попытался поместить PHP-код reCaptcha в эту часть процесса, но на самом деле он не работает, так как все, что он делает, это останавливает ввод данных и предотвращает их получение.Что мне нужно, так это то, что вначале останавливает процесс, например, говоря: «Эй! Вы ввели не ту капчу, вы, спам-бот, вы!»

Я также пытался поставить PHPв файле JS.,,В конце концов, после того, как мы потянули много волос, натолкнулись на предложение, которое гласит: «JS основан на клиенте; PHP основан на сервере».Отличная информация, которую я мог получить несколько дней назад.Любитель меня, теперь я понимаю, почему PHP такой суетливый.

В любом случае, я попытался поместить PHP вверх и вниз и внутрь и получил ноль, ноль, ноль.


Надеюсь, я дал достаточно фона по этому вопросу.Будет полезен отзыв о моем первом вопросе о переполнении стека.И особенно полезно: любую помощь в раскрытии этой тайны вы можете бросить мне.

PHP-код reCaptcha выглядит следующим образом:

<?php

$privatekey = "your_private_key";
$resp = recaptcha_check_answer ($privatekey,
       $_SERVER["REMOTE_ADDR"],
       $_POST["recaptcha_challenge_field"],
       $_POST["recaptcha_response_field"]);
if (!$resp->is_valid) {
       // What happens when the CAPTCHA was entered incorrectly
       die ("The reCAPTCHA wasn't entered correctly. Go back and try it again." .
       "(reCAPTCHA said: " . $resp->error . ")");
} else {
       // Your code here to handle a successful verification
}

?>

И это все о reCaptcha, за исключением стилей.,Кажется, достаточно просто!

Я думаю, что коды Shoutbox слишком много и слишком длинны, чтобы включать их здесь и насыщать пост.Но они по ссылке, указанной выше.В основном это HTML Shoutbox, его JS-файл и PHP-информация для сохранения и извлечения.

Кроме того, для дальнейшей ссылки на него я прилагаю ссылку на RAR-файл, содержащий мои работы на Shoutbox, как , до этого момента.Как вы увидите, внизу страницы находится предварительный загрузчик.Должен отключиться, когда появится список предыдущих сообщений.Это не работает из-за заштрихованного PHP, который я неуклюже поместил в файл JS - который, без сомнения, возвращает, и ошибка останавливает последовательность JS.Если вы прокомментируете PHP или удалите его, то последовательность должна быть завершена, и по крайней мере сообщение "not find db ... bla bla" должно появиться, когда презагрузчик исчезнет, ​​означая, что Shoutbox работает(но без капчи).

И RAR-файл, voilà: (больше не доступно)

Заранее большое спасибоза терпение и за любую помощь вы можете прислать мне дорогу!


РЕДАКТИРОВАТЬ 1:

Хорошо, здесь идет обновление, следуя инструкциям Дж. Бруни для упражнения, подробно описанным ниже.

Итак, следуя JРекомендации Бруни, если я их правильно понял, я вынул только iframe.Я оставил остальную часть reCaptcha нетронутой, так как это лишнее для этого упражнения (кроме того, мне нужно изображение Captcha, чтобы проверить, работает ли эта вещь на самом деле).Изначально form не настроен для публикации в конкретный выходной файл, как вы можете видеть (причина в том, что для этого у него есть файл JS), но, как говорится в рекомендованном упражнении Дж. Бруни, я установил егодо action="shoutbox.php".Это означает, что теперь он полностью игнорирует файл JS.

Тестирование: Я получаю сообщения НЕПРАВИЛЬНЫЕ СЛОВА и ПРАВАЯ СЛОВА Дж. Бруни, соответственно, закодированный в исходный PHP-код reCaptcha, так что сейчас все работает идеально, по крайней мере, с reCaptcha.

Однако, как я уже сказал, файл JS полностью обойден.В одном из моих первых ночных тестов я попробовал нечто подобное тому, что предлагает Дж. Бруни.Я попытался вернуть оператор true / false через этот код reCaptcha вверху файла PHP, чтобы его можно было обработать, вместе с true / false , возвращаемым функцией, проверяющей всеполя заполняются (на стороне клиента, внутри файла JS), чтобы продолжить, если all true или вернуть сообщение об ошибке, если any false .Проблема, с которой я столкнулся, как вы, вероятно, догадались, но я понял только позже, заключалась в том, что одна проверка выполняется на стороне клиента, а другая - на стороне сервера;как вы можете соединить их обоих?(Если вы даже можете .) Мой вопрос здесь будет следующим: Есть ли способ запустить и параллель с PHP и JS, а затем объединить их соответствующие результаты? Уже звучитневозможно;будучи на стороне клиента, это звучит мгновенно, а на стороне сервера звучит дистанционно.

Возможно, более энергичный программист, кроме того, скажет: зачем заботиться об обеих проверках по отдельности?Похоже, очень грязный и ненужный;они оба могут быть в PHP.Увы!Дело в том, что, хотя я знаю, как публиковать входные текстовые переменные формы прямо в файл PHP, я не знаю, как перевести на PHP остальное!Даже не знаю, можно ли перевести .На самом деле, если бы у меня был выбор, я бы лучше нашел способ сделать все это JS.Но есть то, на что мудро указывает Дж. Бруни:

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

Итак, после того, как первое объяснение, которое я объяснил выше, привело к фиаско, я попытался подготовить остальныекод shoutbox.php для функции reCaptcha, возвращающий true .Если он вернет false , код PHP на этом остановится.Однако это означало, что никакие предыдущие сообщения не будут отображаться в «Чате» до отправки новой формы;и даже в этом случае это будет обусловлено тем, что форма будет отправлена ​​эффективно (что означает, что reCaptcha был введен правильно).Если форма вернула false , ничего не произойдет, за исключением перезагрузки страницы, что, как мы можем согласиться, нецелесообразно по многим причинам.С другой стороны, разделение обеих частей кода PHP, делая один запуск независимым от условия reCaptcha, а другой - для него, на самом деле не имеет большого значения.

Именно тогда я попытался вставитьreCaptcha PHP проверить в файл JS, который показался мне единственным выходом.И мы все знаем, чем это закончилось!Это привело меня сюда и по твоей милости.И, как мудро указал Дж. Бруни, кое-что, о чем я не задумывался, так как моя личная идентификационная информация на стороне клиента предлагала его миру без защиты.

Итак, после предложенного упражнения Дж. Бруни у меня теперь есть то, что reCaptcha отлично работает как таковой. Если форма размещена непосредственно в файле PHP, и если части в файле JS, которые занимаются сбором значений формы и проверкой их правильности, транскрибируются в файл PHP, то я предполагаю, что Sbox может работать на начальный уровень. Но прямо сейчас, без reCaptcha, Sbox работает на 100%, все наворочено и еще много чего. Должен быть способ вставить эту проклятую reCaptcha, и при этом у Sbox все еще есть работа. Теперь я должен выяснить, как сделать своего рода «обходной путь», который позволит JS-файлу также работать со своей магией, в то время как PHP выполняет свою работу. Хотя, если честно, я не уверен, что является более практичным: сначала проверить, заполнены ли формы, и возвращает ошибку, если их нет, прежде чем даже проверять, правильно ли введена reCaptcha, или наоборот. Их всегда можно было сложить вместе, как я пытался сделать в первом примере ночной пробной версии, о котором я говорил выше; но, конечно, гораздо интереснее проверить их по отдельности, чтобы вы могли сказать своему пользователю, где именно он все испортил. Что я знаю, так это то, что звучит более практично останавливать отправку формы в самом первом случае, при обнаружении ошибки или неправильного ввода в форме или в reCaptcha, вместо того, чтобы позволить данным попасть в базу данных дверь до проверки ее действительности. Может быть, это спорный вопрос, учитывая, что все это делается за доли секунды, но это звучит просто грязно. Что ты думаешь?

Во всяком случае, я постараюсь взломать это в ближайшие пару дней и дам вам знать, как я. Тем не менее, если у кого-то замигает лампочка, будь моим гостем, чтобы взломать вещи и показать мне еще одну возможность света в конце этого туннеля.

ПРИМЕЧАНИЕ: Кстати, я понял (по крайней мере, при публикации прямо в PHP), что reCaptcha нуждается в дополнительном скрипте, который требует его обновления каждый раз, когда страница возвращается иначе, чем обновлением, скажем, нажав BACK после того, как результат напечатан. В противном случае изображение капчи остается прежним, но, по-видимому, reCaptcha полагает, что демонстрирует другую проблему; если вы попытаетесь ответить на ту же самую reCaptcha с тем же изображением, которое, возможно, уже знаете, чтобы быть правильным, оно вернет результат false . Для меня это означает, что задача всегда перезагружается автоматически, но по какой-то причине изображение в этом конкретном случае остается неизменным. Просто на голову.


РЕДАКТИРОВАТЬ 2

Хорошо, как заметил Дж. Бруни, мы оба пропустили "!" в операторе if в PHP-файле. Теперь это исправлено.

ОДНАКО ... да, однако возникает другая проблема.

Хм. Оператор if был исправлен, и теперь он возвращает предупреждение «Неправильная капча». Но по какой-то причине reCapthca всегда возвращает «неправильно», несмотря ни на что. Вчера форма всегда печаталась, даже если не было введено ни капчи, ни неправильной капчи, потому что оператор if, как заметил Бруни, был настроен на возврат положительного значения при вводе капчи неправильно, и в этом случае форма будет идти вперед и распечатать, если капча была неправильной (но не если это было правильно). Это всегда было неправильно, поэтому печаталось все время. Исправление оператора if для возврата положительного значения при правильной проверке капчи сделало очевидным, что капча всегда возвращает неправильный ответ, потому что теперь вы всегда получаете предупреждение «неправильная капча». Так что этот конкретный вопрос должен быть где-то еще.

Теперь, как я уже неоднократно заявлял, я так же хорош, как потерянный в PHP. Так что я не могу сказать, правильна ли инструкция if/else в PHP. Но если мне помогает другой мой опыт, похоже, что в операторе if в JS-файле может отсутствовать что-то, что заставляет его предупреждать и останавливать остальную часть функции complete: function(data), потому что кажется мне, что остальная функция complete: function(data) всегда воспроизводится. В любом случае, мне кажется странным не заключать alert() в скобки в результате оператора if. Возможно, даже если выражение if неверно, все равно alert() и остальная часть функции воспроизводятся, потому что для этого нужны скобки ... Но поскольку эта часть - AJAX, я мог бы говорить бессмысленно и лаять не на то дерево , Пожалуйста, поправьте меня, если я ошибаюсь.

Я постараюсь решить ее и отправлю обратно, где скрывалась проблема. И когда я получу 100% работающий Sbox, я опубликую окончательный продукт здесь, чтобы он был доступен для всех, кто может столкнуться с той же или похожей проблемой.


РЕДАКТИРОВАТЬ 3

Моя интуиция была верна на том факте, что оператор if в функции complete: function(data) должен быть в скобках; в противном случае всегда будет отображаться предупреждение «Неправильная капча», независимо от того, возвращает ли проверка PHP reCaptcha «неправильно» или нет.

complete: function(data){<br> if (data.responseText == 'wrong') {<br> alert('Wrong captcha');<br> }<br> messageList.html(data.responseText);<br> updateShoutbox();<br> ...

P.S. Не удается заставить коды правильно отображаться на этой странице ... Я пытаюсь следовать правилам форматирования справа, но безрезультатно.

P.P.S. ReCaptcha по-прежнему всегда возвращает «неправильно». Будет обновлять прогресс, когда есть некоторые.

1 Ответ

1 голос
/ 03 марта 2012

Однажды я попытался загрузить reCaptcha с помощью AJAX. Это не сработало. Я не слишком старался, потому что я мог просто , а не использовать AJAX, и это то, что я сделал. Тот же код, который не работал через AJAX, работал в простой простой форме.

Кроме того, reCaptcha не основан на PHP , как вы говорите. Вы можете использовать любой серверный язык (включая PHP).


Я просмотрел ваш index.php файл. Прежде чем настраивать внешний вид, давайте попробуем сделать основы работы. Я видел сочетание тегов iframe и script. Все, что вам нужно, это так просто (при условии, что ваш открытый ключ - строка, начинающаяся с "6Ld_b8":

<input type="text" id="recaptcha_response_field" name="recaptcha_response_field" />
<script type="text/javascript" src="http://www.google.com/recaptcha/api/challenge?k=6Ld_b84SAAAAAAv1Ds1vYHxQjyoowiCPkARtvB2W"></script>

Снять фрейм. В настоящий момент вы можете удалить все, что связано с recaptcha.

Итак, у вас есть form, который будет размещен на shoutbox.php . Затем, на мгновение, добавьте код, который вы вставили в свой вопрос в начале этого файла. Вам нужно включить recaptchalib.php , и вам нужно заменить "your_private_key" на ваш закрытый ключ reCaptcha. Итак, код будет выглядеть так:

// put this on top of shoutbox.php
include "recaptchalib.php";
$privatekey = "your_private_key"; // change this here to your reCaptcha private key!
$resp = recaptcha_check_answer ($privatekey, 
       $_SERVER["REMOTE_ADDR"],
       $_POST["recaptcha_challenge_field"],
       $_POST["recaptcha_response_field"]);
if (!$resp->is_valid) {
       echo '<b>WRONG WORDS!</b>';
} else {
       echo '<b>CORRECT WORDS! GREAT!</b>';
}
exit();

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


РЕДАКТИРОВАТЬ 1

Вам просто нужно добавить проверку reCaptcha в правильном месте, внутри shoutbox.php . Кажется, это может быть в части "case insert" или внутри функции "insertMessage":

    case "insert":
        include "recaptchalib.php";
        $privatekey = "your_private_key"; // change this here to your reCaptcha private key!
        $resp = recaptcha_check_answer ($privatekey, 
            $_SERVER["REMOTE_ADDR"],
            $_POST["recaptcha_challenge_field"],
            $_POST["recaptcha_response_field"]);
        if ($resp->is_valid)
            echo insertMessage($_POST['nick'], $_POST['message']);
        break; 

Вы видели complete: function(data){ строки в коде JavaScript? Это один из вариантов вызова функции $.ajax. Он определяет функцию, которая будет запускаться после запуска PHP-кода и отправляет свой ответ обратно в браузер. Ответ от сервера будет где-то в параметре data для использования вами. Если вы хотите отобразить сообщение для пользователя, предупреждающее его в случае «неправильных слов» для капчи, вам необходимо:

  1. Вернуть что-то со стороны сервера (код PHP):

        if ($resp->is_valid)
            echo insertMessage($_POST['nick'], $_POST['message']);
        else
            echo 'wrong';
    
  2. Используйте это возвращение на стороне клиента (код JS):

    $.ajax({  
        type: "POST", url: "shoutbox.php", data: "action=insert&nick=" + nick + "&message=" + message,  
        complete: function(data){
            if (data.responseText == 'wrong')
                alert('Incorrect captcha words! Try again.');
            messageList.html(data.responseText);  
            updateShoutbox();  
            //reactivate the send button  
            $("#send").attr({ disabled:false, value:"Shout it!" });  
        }  
     });  
    

И да, вам нужно будет перезагрузить reCaptcha (для кнопки BACK и в случае отправки - успешно или нет). Для кнопки «Назад» вы можете установить HTTP-заголовок «Expires» с помощью PHP или HTML-тега «meta», заставляя страницу перезагрузиться. В другом случае (после отправки формы ajax) вы можете запросить новый запрос, заменив HTML с помощью JavaScript / jQuery. Оберните вызов в div:

<div id="challenge">
    <input type="text" id="recaptcha_response_field" name="recaptcha_response_field" />
    <script type="text/javascript" src="http://www.google.com/recaptcha/api/challenge?k=6Ld_b84SAAAAAAv1Ds1vYHxQjyoowiCPkARtvB2W"></script>
</div>

И "перезагрузить" его при необходимости:

function reloadCaptcha(){
    $('#challenge').html('<input type="text" id="recaptcha_response_field" name="recaptcha_response_field" /><script type="text/javascript" src="http://www.google.com/recaptcha/api/challenge?k=6Ld_b84SAAAAAAv1Ds1vYHxQjyoowiCPkARtvB2W"></script>');
}
...