2009-02-27 11 views
11

Ho provato a implementare reCAPTCHA in una delle mie forme, ... ma sto usando ajax come sottomissione. (Più in particolare il prototipo Ajax.Updater)utilizzando reCAPTCHA con ajax .... javascript problema di caricamento

Una volta che presento ed errore controllare il mio modulo provo a caricare il widget reCAPCHTA thingy (nel mio elemento div aggiornato), che fondamentalmente solo richiama un file javascript in questo modo:

<script type="text/javascript" src="http://api.recaptcha.net/challenge?k=6Le6SwUAAAAAAIWm8wCRFd8SrI-H0R1Yx4Tkw2Ks"></script> 

Tuttavia il file JS non viene letto? ... e ho provato tutte le combinazioni di evalScript: true e evalJS: 'force' ecc. Nell'ajax.updater ..... tuttavia non penso Ho una buona comprensione del motivo per cui il file js non viene elaborato :(

Se qualcuno può far luce su questo argomento sarò molto riconoscente.

Grazie, Andrew

+2

Avete mai trovato una soluzione per questo? Sto vivendo esattamente lo stesso problema ... Grazie. –

risposta

0

Se questo è il codice letterale snippet che si sta utilizzando, non si è chiuso il tag ... quindi non sarebbe valutata.

+0

non lo è. copiato sbagliato. – Andrew

1

a rispondere alla mia domanda ...

c'è un'API reCAPTCHA AJAX .... che è il modo abbastanza facile da ottenere intorno a questo problema:

link text

Inoltre, .. la documentazione sul sito http://www.prototypejs.org/api/ajax/updater ..... parla dell'opzione evalscript e in che modo viene inserito qualsiasi javascript tramite la funzione nativa eval() .... che mi incula nel tentativo di implementare il controllo degli errori con WMD ... ma questa è un'altra storia.

Andrew

+3

Collegamento non valido. Esattamente perché la risposta di infinito84 è stata downvoted ... – MadTurki

17

Questo non affrontare il problema esatto, ma 'Dark Side of the Carton' ha alcuni eccellenti codice per la convalida reCAPTCHA tramite jQuery AJAX che potrebbe aiutare.

In sintesi:

Aggiungere il seguente JavaScript:

$(function() { 
    function validateCaptcha() { 
     var challengeField = $('input#recaptcha_challenge_field').val(), 
      responseField = $('input#recaptcha_response_field').val(); 

     // alert(challengeField); 
     // alert(responseField); 
     // return false; 

     var html = $.ajax({ 
      type: 'POST', 
      url: 'ajax.recaptcha.php', 
      data: "recaptcha_challenge_field=" + challengeField + "&amp;recaptcha_response_field=" + responseField, 
      async: false 
     }).responseText; 

     if (html.replace(/^\s+|\s+$/, '') == "success") { 
      $('#captchaStatus').html(' '); 
      // Uncomment the following line in your application 
      return true; 
     } else { 
      $('#captchaStatus').html(
       'Your captcha is incorrect. Please try again' 
      ); 
      Recaptcha.reload(); 
      return false; 
     } 
    } 

    // Modified as per comments in site to handle event unobtrusively 
    $('#signup').submit(function() { 
     return validateCaptcha(); 
    }); 
}); 

quindi aggiungere il file ajax.recaptcha.php che: "uscite solo la parola‘successo’se il captcha corrisponde ed un messaggio e la risposta di reCaptchta in caso di esito negativo, è importante perché stiamo cercando la parola successo nella nostra funzione validateCaptcha(). "

require_once('/inc/recaptchalib.php'); 
$publickey = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX'; // you got this from the signup page 
$privatekey = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX'; 

$resp = recaptcha_check_answer(
    $privatekey, 
    $_SERVER['REMOTE_ADDR'], 
    $_POST['recaptcha_challenge_field'], 
    $_POST['recaptcha_response_field'] 
); 

if ($resp->is_valid) { 
    ?>success< ? 
} else { 
    die(
     "The reCAPTCHA wasn't entered correctly. Go back and try it again." . 
     "(reCAPTCHA said: " . $resp->error . ")" 
    ); 
} 

L'esempio è in PHP, ma mi adatto facilmente per lavorare con Zope/Python

+0

Hmm, dovresti memorizzare il risultato della convalida nella sessione, in quanto uno potrebbe saltare la chiamata validateCaptcha e inviare il modulo senza risolvere il captcha. Ricorda inoltre di reimpostarlo nella sessione dopo aver eseguito l'azione protetta captcha, in modo che una soluzione non possa essere utilizzata più volte. – iGEL

+0

Per qualche ragione, stavo ottenendo un indice indefinito per '$ _POST [" recaptcha_challenge_field "]' fino a quando ho riscritto l'impostazione dei dati nella chiamata ajax con JSON. – regularmike

+0

dati ajax dovrebbero essere: 'data: "recaptcha_challenge_field =" + challengeField + "& recaptcha_response_field =" + responseField,' non '' & –

4

Fare attenzione utilizzando qualsiasi tipo di script lato client, come JavaScript, per la convalida. Non hai alcun controllo sul browser dell'utente finale. Lo scopo di un CAPTCHA è impedire l'invio automatico di un modulo. Chiunque sia abbastanza sofisticato da configurare non avrà problemi a sovrascrivere la convalida JavaScript e il controllo CAPTCHA. Ad esempio, potrebbero impostare validateCaptcha() per restituire sempre true, ignorando i controlli accurati o semplicemente disabilitare JavaScript.

Detto questo, non c'è niente di sbagliato nell'eseguire l'intero invio di moduli con ajax e utilizzando i risultati del controllo CAPTCHA per determinare se il modulo viene elaborato o meno.

Il punto importante è che la decisione di gestire o meno il modulo deve essere presa sul lato server, non sul lato client.

Why client-side validation is not enough

+0

destro, si potrebbe anche voler fare il check sul lato server. Ma la validazione lato client è utile in modo che i visitatori legittimi possano ottenere feedback senza perdere l'intero invio del modulo quando digitano per errore le parole in modo errato. Alcune delle sfide captcha possono essere difficili. – regularmike

+0

e la mia idea su questo: http://stackoverflow.com/a/21061169/567854 – IJas

-1

Ho avuto problemi simili con ottenere reCaptcha a giocare bene quando vengono caricati nella pagina utilizzando il metodo di jQuery .load(). Ecco una pagina che ha una nuova soluzione: http://www.maweki.de/wp/2011/08/recaptcha-inside-a-with-jquery-ajax-or-load-dynamically-loaded-object/

Fondamentalmente l'API reCaptcha utilizza il metodo document.write per visualizzare il reCaptcha. Quando ottieni jQuery invloved, questo non funzionerà. Utilizzare questo codice PHP in luogo di carico recaptcha.js

<?php 
$api = file_get_contents('http://www.google.com/recaptcha/api/js/recaptcha_ajax.js'); 
$api = str_replace('document.write','$("body").append',$api); 
echo $api; 
?> 

Si fa solo un ritrovamento per document.write e lo sostituisce con $(selector).append.

Realizzato il mio lavoro di implementazione.

0

chiamare Recaptcha.reload(); su evento di richiamata nel codice Ajax., si ricaricherà nuova Recapcha ogni volta che l'Ajax ha presentato

Problemi correlati