2017-07-17 2 views
-1

Pour commencer, je rencontre des difficultés pour relier la Google ReCaptcha à mon formulaire de connexion. Juste pour des informations de base, tout cela fonctionne sur un serveur web en direct avec un certificat SSL, j'ai le bon site et les clés secrètes et tout ce jazz.Comment ne pas permettre à un utilisateur de se connecter si Google ReCaptcha ne passe pas?

Voici mon formulaire de connexion:

<html> 

<head> 

<script src='https://www.google.com/recaptcha/api.js'></script> 

</head> 

<body> 

<br /> 
<p>Please log in to your account below:</p> 

<form action="index.php" method="post" target="_self"> 
    <b>User Name:</b><br> 
    <input type="text" size="20" name="userid"><br /> 
<br /> 
    <b>Password:</b><br> 
    <input type="password" size="20" name="password"><br /> 
<br /> 

<div class="g-recaptcha" data-sitekey="_MY PUBLIC SITE KEY_"></div> 
<br /> 
    <input type="submit" name="submit" value="Login"> 
    <input type="hidden" value="validate" name="content"> 
</form> 

Et mon script pour valider:

<?php 

if (isset($_POST['submit'])) { 
    $userid = $_POST["userid"]; 
    $password = $_POST["password"]; 
    $secretkey = "_MY SECRET KEY_"; 
    $responsekey = $_POST["g-recaptcha-response"]; 
    $useripaddress = $_SERVER["REMOTE_ADDR"]; 

    $url = "https://www.google.com/recaptcha/api/siteverify?secret={$secretkey}&response={$responsekey}&remoteip={$useripaddress}"; 
    $response = file_get_contents($url); 
    echo $response; 
} 

require_once("scripts/thecrab.php"); 

$userid = htmlspecialchars($_POST['userid']); 
$password = htmlspecialchars($_POST['password']); 

$query = "SELECT userid from users where userid = ? and password = PASSWORD(?)"; 
$stmt = $pdo->prepare($query); 
$stmt->execute([$userid, $password]); 

if (!$stmt->rowCount() & $response->success == 0) { 
    echo "<h2>Sorry, your user account was not validated.</h2><br>\n"; 
    echo "<a href=\"index.php?content=login\">Try again</a><br>\n"; 
    echo "<a href=\"index.php\">Return to Home</a>\n"; 
} else { 
    $_SESSION['valid_recipe_user'] = $userid; 
    echo "<h2>Log In Successful</h2><br>\n"; 
    echo "<a href=\"index.php\"><img src=\"images/image-11.png\"></a>\n"; 
} 
?> 

Alors, voici quelques questions que je rencontrais. Si vous remarquez, en haut de ma page qui valide l'information, j'ai echo $ response; C'est là strictement à des fins de test, de sorte que je puisse voir si le ReCaptcha revient vrai ou faux, mais même en remplissant le ReCaptcha, il revient toujours comme faux, quel que soit le réglage de sécurité sur mon Site Google J'ai ajouté des balises pré autour de la validation afin qu'il puisse recracher les résultats sous une forme plus facile à lire et je salue avec ce même quand je remplis le Captcha:

{ 
    "success": false, 
    "error-codes": [ 
     "missing-input-response" 
    ] 
} 

Maintenant, depuis que je suis coincé avec un éternel "faux", j'ai décidé de donner un coup à la déclaration if et de l'implémenter, si le succès est faux (ie 0) alors ne pas me connecter, sinon connectez-vous. Assez simple, et vous pouvez voir que en bas de ma page de validation dans l'instruction if:

if (!$stmt->rowCount() & $response->success == 0) 

Jusqu'à présent, si bon, je par FTP sur le serveur, rafraîchir et lui donner un coup. Mais cette fois, je reçois une erreur, et il indique que la variable $ response est indéfinie. Eh bien, je défini la variable en haut de la page de validation où je l'ai dit:

if (isset($_POST['submit'])) // Checks to see if the form was submitted 

Et il a été présenté comme je l'ai frappé le bouton de connexion qui a name = « soumettre », donc il voir ce que soumettons est mis à la valeur de connexion, donc il exécute ce qui suit le si (vous savez comment fonctionne PHP), et en bas est où il définit $ réponse. Pour autant que je sache, avec PHP, peu importe dans quel bloc la variable est définie, tant qu'elle est exécutée, elle peut être utilisée n'importe où.

Donc, dans l'ensemble, les questions que je vais avoir est:

  1. ReCaptcha évalue toujours Faux
  2. erreur indiquant jeté $ response est indéfini bien qu'il soit défini
  3. Liens dans aveC# 2 Comme variable est indéfinie, elle ne peut pas exécuter l'instruction if.

J'ai essayé presque tout dans mes compétences.

+0

Puis-je voir où vous validez votre recaptcha? comme si ($ response-> is_valid) {// code} –

+0

@Brian quelle version de recaptcha utilisez-vous? 2.0 le dernier? –

+0

@SaadSuri Oui, il se trouve en bas du formulaire de validation. if (! $ Stmt-> rowCount() & $ response-> success == 0) $ stmt compare mes $ userid et $ password à la base de données, donc si ça revient false et ma réponse-> succès revient en tant que false/0, il va exécuter ce qui est en dessous qui redirige vers la connexion. Mais le recaptcha évalue toujours à faux. EDIT: Oui, j'utilise v2.0 – Brxxn

Répondre

2

Vérifiez à nouveau les paramètres que vous transmettez à https://www.google.com/recaptcha/api/siteverify. Le paramètre de réponse doit être responSe et ne pas respone.

Cela provoque l'erreur renvoyée par le serveur - paramètre « manquant-input-réponse » signifie que vous n'êtes pas passer le « g-recaptcha-réponse »

Maintenant que la réponse fonctionne:

    File_get_contents renverra une chaîne contenant une réponse JSON.
  1. Si vous souhaitez accéder à la valeur de la réussite dans le JSON la façon dont vous accédez ici

    if (!$stmt->rowCount() & $response->success == 0) { 
    

    alors vous devez d'abord utiliser json_decode pour créer un objet hors de la chaîne.

  2. la si logique dans la même ligne utilise Bitwise opérateur AND que vous utilisez un seul esperluette & au lieu de & &

  3. la logique elle-même - actuellement si aucun compte d'utilisateur existe et le recaptcha échoué alors il y aura erreur, sinon c'est valide. Le problème est que s'il n'y a pas d'utilisateur mais que recaptcha est OK alors l'utilisateur est valide et si l'utilisateur est correct et que recaptcha échoue alors l'utilisateur est toujours valide. Donc, je suppose que vous vouliez utiliser ou au lieu de ET:

    if (!$stmt->rowCount() || $response->success == 0) { 
    
+0

WOW! C'est toujours une simple erreur qui jette tout! Merci beaucoup. Maintenant que j'obtiens une réponse, il revient correctement avec le succès comme vrai et l'horodatage avec le nom d'hôte. Doux, maintenant je me bats pour que l'instruction if/else fonctionne correctement. Est-ce que la configuration actuelle de mon installation n'est pas correcte? – Brxxn