2016-11-28 1 views
0

Ich versuche, reCaptcha zu meinem Formular für die Auswanderung auf meiner Website hinzuzufügen. Ich habe ein Video-Tutorial darüber gemacht, wie es geht, aber ich bemühe mich, es so anzupassen, dass es mit meinem Formular funktioniert, das Ajax verwendet, um eine PHP-Datei aufzurufen, und das Formular nicht wirklich abschickt. Ich habe ein paar Dinge ausprobiert, die in früheren Fragen vorgeschlagen wurden, aber keine scheint das gewünschte Ergebnis zu erhalten und stattdessen "Ich mag keine Roboter" auf der Registrierungsseite anzuzeigen. Einige Tipps/Vorschläge wären nett, wenn Sie sich etwas vorstellen können.Ajax & Google reCaptcha

<div class="g-recaptcha" data-sitekey="6LcXMg0UAAAAABmlDlOGa6onxqqzERZ483XOJbFm"></div> 

Javascript

function Register(){ 
     var Forename = $("#txtForename").val(); 
     var Surname = $("#txtSurname").val(); 
     var Password = $("#txtPassword").val(); 
     var PasswordR = $("#txtPasswordR").val(); 
     var response = $("#g-recaptcha").val(); 
      $.post('functions/php/fncregister.php', {Forename: Forename, Surname: Surname, Password: Password, PasswordR: PasswordR, response: response}, function(data) { 
       var returnValue = JSON.parse(data); 
       if (returnValue['data'] == 0){ 
        $('#mdlInfo').html('<p>Your account has been created under the username: <strong><span id="spnUsername">'+returnValue['username']+'</span></strong>. You <strong>must</strong> remember this as you will require it to log into your account.</p><p>Your account has also been added to a moderation que. <strong>You must wait until a member of staff activates your account!</strong></p>'); 
        $("#mdlRegister").modal("show"); 
       } 
       else if (returnValue['data'] == 1){ 
        $('#divError').html('<p class="text-center text-danger bg-danger" id="pUPInc">Passwords did not match!</p>'); 
       } 
       else if (returnValue['data'] == 3){ 
        $('#divError').html('<p class="text-center text-danger bg-danger" id="pUPInc">An error occured when adding your details to the Database!</p>'); 
       } 
       else if (returnValue['data'] == 4){ 
        $('#divError').html('<p class="text-center text-danger bg-danger" id="pUPInc">I don\'t like Robots!</p>'); 
       } 
      }); 
    } 

PHP

<?php 
//Retrieves variables from Javascript. 
$Forename = $_POST["Forename"]; 
$Surname = $_POST["Surname"]; 
$Password = $_POST["Password"]; 
$PasswordR = $_POST["PasswordR"]; 

//reCaptcha 
$Url = "https://www.google.com/recaptcha/api/siteverify"; 
$SecretKey = "---KEY---"; 
$Response = file_get_contents($Url."?secret=".$SecretKey."&response=".$_POST['response']."remoteip=".$_SERVER['REMOTE_ADDR']); 
$Robot = json_decode($response); 

$data = 0; 

if(isset($Robot->success) AND $Robot->success==true){ 
    //OTHER CODE 
} 

else{ 
    //This code always runs (though this is only meant to happen if reCaptcha detects a robot. 
    $data = 4; 
     echo json_encode(["data"=>"$data"]); 
?> 
+0

Offensichtlich habe ich meinen eigentlichen Schlüssel in meinem Test verwendet, aber ich habe ihn hier aus Sicherheitsgründen entfernt. –

+1

Ich empfehle, das Beispiel auf weniger Code zu reduzieren.Sicherlich erfordert das Problem keine vollständige Codeüberprüfung, um zu duplizieren oder zu verstehen. Sie erhalten mehr Expertenrat, wenn das Beispiel klinischer ist und weniger tldr. – WEBjuju

+0

@WEBjuju, yeh der Code war ein bisschen übertrieben für die Frage zur Hand. Ich habe es gekocht, also wird es hoffentlich viel einfacher zu verstehen sein. –

Antwort

0

Nicht ganz sicher, wie ich es zu arbeiten, aber ich tat.

Zuerst habe ich eine neue Variable "Response" in mein Javascript eingefügt und die in der Dokumentation aufgelistete Funktion verwendet, um den Wert des zurückgegebenen Schlüssels abzurufen, wenn der Benutzer beweist, dass er kein Roboter ist. Ich fügte hinzu, diese Variable in meinen AJAX-Aufruf zu, so dass es auf die PHP-Datei übergeben wird, etwa so:

function Register(){ 
    var Forename = $("#txtForename").val(); 
    var Surname = $("#txtSurname").val(); 
    var Password = $("#txtPassword").val(); 
    var PasswordR = $("#txtPasswordR").val(); 
    var Response = grecaptcha.getResponse(); 
     $.post('functions/php/fncregister.php', {Forename: Forename, Surname: Surname, Password: Password, PasswordR: PasswordR, Response: Response}, function(data) { 
      var returnValue = JSON.parse(data); 
      if (returnValue['data'] == 0){ 
       $('#mdlInfo').html('<p>Your account has been created under the username: <strong><span id="spnUsername">'+returnValue['username']+'</span></strong>. You <strong>must</strong> remember this as you will require it to log into your account.</p><p>Your account has also been added to a moderation que. <strong>You must wait until a member of staff activates your account!</strong></p>'); 
       $("#mdlRegister").modal("show"); 
      } 
      else if (returnValue['data'] == 1){ 
       $('#divError').html('<p class="text-center text-danger bg-danger" id="pUPInc">Passwords did not match!</p>'); 
      } 
      else if (returnValue['data'] == 3){ 
       $('#divError').html('<p class="text-center text-danger bg-danger" id="pUPInc">An error occured when adding your details to the Database!</p>'); 
      } 
      else if (returnValue['data'] == 4){ 
       $('#divError').html('<p class="text-center text-danger bg-danger" id="pUPInc">I don\'t like Robots!</p>'); 
      } 
     }); 
} 

In meiner PHP-Datei, die ich die Benutzer IP-Adresse aus der URL Post entfernt, wie es optional ist nach Dokumentation (Ich bin mir aber nicht sicher, ob ich das tun könnte). Google liefert dann die Informationen über die Anforderung und wenn sie erfolgreich ist, dann der Punkt „Erfolg“ mit in meinem Code wahr sein und somit geht auf das Konto zu erzeugen:

$Url = "https://www.google.com/recaptcha/api/siteverify"; 
$SecretKey = "---KEY---"; 
$Response = file_get_contents($Url."?secret=".$SecretKey."&response=".$_POST['Response']); 
$Robot = json_decode($Response); 

$data = 0; 

if(isset($Robot->success) AND $Robot->success==true){ 

ich nicht POST am Ende verwendet habe, aber verwendet GET stattdessen. Ich bin mir sicher, dass es einen Sicherheitsvorteil gibt, da es den geheimen Schlüssel versteckt, also werde ich mich kurz damit befassen.

Dank @WEBjuju und meinem Kumpel "Bridge Troll" für ihre Hilfe. Ohne sie hätte ich es nicht geschafft.

1

Hier ist es wichtig Gehäuse Ihrer Variablen zu beobachten ist:

$Response = file_get_contents($Url."?secret=".$SecretKey."&response=".$_POST['response']."remoteip=".$_SERVER['REMOTE_ADDR']); 
// because variables are case sensitive... 
$Robot = json_decode($Response); // it is $Response, not $response 

Wenn das nicht beheben ist, Bitte aktualisieren Sie Ihre Frage mit der Ausgabe dieses p roduces:

$Response = file_get_contents($Url."?secret=".$SecretKey."&response=".$_POST['response']."remoteip=".$_SERVER['REMOTE_ADDR']); 
die('Response file: <pre>'.$Response); 
$Robot = json_decode($Response); 

versuchen auch sicher sein, urlencode() die Vars Sie senden an Google:

$Response = file_get_contents($Url."?secret=".urlencode($SecretKey)."&response=".urlencode($_POST['response'])."remoteip=".urlencode($_SERVER['REMOTE_ADDR'])); 

aber bei weitem, müssen Sie

$Robot = json_decode($Response); // and NOT $response 

hier ist ein Screenshot zeigt wie man die Ausgabe vom Ajaxanruf holt, wo du stirbst() in deiner php Verarbeitung besagter Ajaxanruf:

enter image description here

BESTE LÖSUNG

Review this guide on how to install Google reCAPTCHA with PHP

+0

Ich habe den Variablenfall aktualisiert, obwohl ich denke, dass ich das bereits versucht habe, nachdem ich die Frage gepostet habe. Ich habe dann Ihren anderen Code ausprobiert. In der Chrome-Konsole wird jedoch ein Fehler angezeigt: 'Uncaught SyntaxError: Unerwarteter Token R in JSON an Position 0 ', aber kein Fehler in einer Protokolldatei. Ich glaube, das hängt nicht mit dem reCaptcha zusammen, aber die Art, wie Sie einen Fehler erzeugen wollen, ist zurückgekehrt. –

+1

müssen Sie während dieses Debuggen nur in die Würfel() einfügen - und um die Ausgabe dieses Debuggens zu erhalten, müssen Sie die Javascript-Konsole überprüfen, um das Ergebnis des Ajax-Aufrufs zu sehen (so dass Sie diese Ausgabe hinter sich lassen können) für uns hier, pls) – WEBjuju

+0

Ich habe versucht, Ihre Bearbeitung an Ihre Antwort. Der ausgegebene Fehler ist VM552: 1 Uncaught SyntaxError: Unerwartetes Token R in JSON an Position 0 (anonyme Funktion) @ login.js: 34l @ jquery.min.js: 4fireWith @ jquery.min.js: 4k @ jquery.min. js: 6 (anonyme Funktion) @ jquery.min.js: 6'. Alternativ könntest du die Konsole auf meiner Seite hier anschauen: http://thomas-smyth.co.uk/register.php Danke für deine Hilfe bisher. –