2016-11-28 3 views
0

내 웹 사이트의 재 입학 양식에 reCaptcha를 추가하려고합니다. 필자는 비디오 튜토리얼을 따라 갔지만, PHP 파일을 호출하기 위해 ajax를 사용하는 폼의 경우 작동하도록 양식을 변경하고 실제로 폼을 제출하지 않으려 고 고군분투하고 있습니다. 이전 질문에서 제안한 몇 가지 사항을 시도했지만 아무도 의도 한 결과를 얻지 못하고 대신 "나는 로봇을 좋아하지 않습니다"라는 메시지를 등록 페이지에 표시합니다. 어떤 힌트/제안은 당신이 생각할 수 있다면 좋을 것입니다.Ajax & Google reCaptcha

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

자바 스크립트

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

확실히 내 테스트에서 실제 키를 사용했지만 보안상의 이유 때문에 여기에서 제거했습니다. –

+1

코드를 줄이기 위해 예제를 종결하는 것이 좋습니다.확실히이 문제는 복제하거나 이해하기 위해 완전한 코드 검토를 수행하지 않습니다. 예가 더 임상적이고 덜 tldr라면 더 많은 전문가의 조언을 얻을 것입니다. – WEBjuju

+0

@WEBjuju, yeh 코드는 당면한 질문에 대해 맨 위에 약간 넘어 섰습니다. 나는 그것을 내려 끓여서 잘 이해하면 훨씬 쉽게 이해할 수있을 것이다. –

답변

0

내가이 일을 가지고,하지만 난 어떻게했는지 매우 확실하지.

먼저 자바 스크립트에 새로운 변수 "Response"를 추가하고 문서에 나열된 함수를 사용하여 사용자가 로봇이 아님을 증명할 때 반환되는 키 값을 검색합니다.

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>'); 
      } 
     }); 
} 

을 내 PHP 파일에서이 문서에 따라 선택의 나는이 URL 포스트에서 사용자의 IP 주소를 제거 : 너무처럼 PHP 파일에 통과되도록 나도 내 AJAX 호출에이 변수를 추가 (비록 그것을하는 것의 이점에 관해 확실하지 않은). 구글은 그 요청에 대한 정보를 반환하고 성공하면 다음 계정 생성에 진행하여 내 코드에서 사실과 함께 항목 "성공"

$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){ 

내가 결국 POST를 사용하지 않은,하지만 사용 대신 얻으십시오. 나는 그것이 비밀 열쇠를 숨길 것이므로 약간의 보안 이득이 있다고 확신하므로 곧 살펴 보겠다.

@WEBjuju와 내 동료 인 "Bridge Troll"에게 감사드립니다. 나는 그들 중 누구도 없이는 그것을 할 수 없었다.

1

, 그것은 당신의 변수의 케이스 시청하는 것이 중요하다 : 그게 해결되지 않으면

$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 

을, 이 출력으로 질문을 업데이트하십시오. roduces :

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

또한 전송하는 바르 Google에()를 urlencode 확인하려고 여기

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

이 스크린 샷을 보여주는 것입니다

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

을하지만, 지금까지, 당신은해야합니다 어떻게 아약스 전화에서 아약스 전화() 귀하의 PHP 처리에 die() 가지고있다 출력을 얻을 :

enter image description here

최적의 솔루션

Review this guide on how to install Google reCAPTCHA with PHP

+0

변수 케이스를 업데이트했습니다. 질문을 게시 한 후에 이미 시도했을 수도 있습니다. 그런 다음 다른 코드를 시도했지만 Chrome 콘솔에서 'Uncaught SyntaxError : JSON 위치의 0에서 예상치 못한 토큰 R'오류가 발생하지만 로그 파일에는 오류가 없습니다. 나는 그것이 reCaptcha와 관련이 없다고 생각하지만, 당신이 오류를 만들고 싶었던 방식이 반환되었습니다. –

+1

이 디버깅 중에 만 해당 die()를 넣고 해당 디버깅 출력을 얻으려면 javascript 콘솔을 확인하여 ajax 호출 결과를 확인해야합니다. 그러면 해당 출력을 지나칠 수 있습니다 우리를 위해 여기에서, pls) – WEBjuju

+0

나는 당신의 anwer에게 당신의 편집을 시도했다. 출력 된 오류는 다음과 같습니다. VM552 : 1 Uncaught SyntaxError : JSON의 위치 0 (익명 함수)에서 예상치 못한 토큰 R @ login.js : 34l @ jquery.min.js : 4fireWith @ jquery.min.js : 4k @ jquery.min. js : 6 (익명 함수) @ jquery.min.js : 6'. 또는 내 페이지의 콘솔을 볼 수 있습니다. http://thomas-smyth.co.uk/register.php 지금까지 도움을 주셔서 감사합니다. –