2017-07-17 10 views
-1

まず、Google ReCaptchaを自分のログインフォームに結びつけるのが難しいです。ちょっとした背景情報のために、これはSSL証明書付きのライブウェブサーバー上で実行されています。私は正しいサイトと秘密鍵とそのすべてのジャズを持っています。だからここGoogle ReCaptchaがパスしないと、ユーザーのログインを許可しない方法はありますか?

<?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"; 
} 
?> 

を私は持っていますいくつかの問題があります:

<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> 

そして、私のスクリプトを検証する:

は、ここに私のログインフォームです。私のページの上部にある情報を確認すると、私は echo $ responseを得ています。 これは厳密にはテスト目的のためです。ReCaptchaがtrueまたはfalseとして戻ってくるかどうかを確認できるようにしていますが、ReCaptchaを記入しても、セキュリティ設定が何であっても常にfalseに戻りますGoogleサイト私はそれが読みやすい形式で結果をバック吐くことができるように検証周りの事前のタグを追加し、私は私がするCaptchaを記入しても、これで迎えています:

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

、私はこだわっているので、永遠の "偽"で、私は成功を偽(すなわち、0)し、その後ログインしないでログインする場合、if文にショットを入れて実装することに決めました。かなりシンプル、そしてあなたは、if文で私の検証ページの一番下にあることを確認することができます。これまでのところ

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

私は、サーバーにそれをFTPでリフレッシュし、それをやってみる、とても良いです。しかし、今回はエラーが発生し、変数$ responseが未定義であることが示されています。

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

そして、それは提出がで設定されているのを見て、私は、名前=「提出」を持ってログインボタンを押して、それが提出されました:まあ、私は私が言った検証ページの上部にある変数を定義しましたPHPの仕組みを知っていてifの後ろにあるものを実行し、一番下は$ responseを定義するところです。私が知る限り、PHPでは変数がどのブロックに定義されているかは関係ありません。実行される限り、どこでも使用できます。

したがって、すべてのすべてで、私がいる問題は次のとおりです。

  1. reCAPTCHAのは、常に$応答を明記スロー偽
  2. エラーは、それが持つ#2で
  3. ネクタイを定義されているにもかかわらず、定義されていないと評価されましたvariableは未定義であるため、if文を実行することはできません。

私は自分のスキルセットのほとんどすべてを試しました。

+0

あなたがreCAPTCHAのを検証しているところ、私は見ることができますか? like if($ response-> is_valid){// code} –

+0

@Brianどのrecaptchaのバージョンを使用していますか? 2.0最新のもの? –

+0

@SaadSuriはい、それは検証フォームの一番下にあります。 ($ stmt-> rowCount()&$ response-> success == 0) $ stmtは$ $ useridと$ passwordをデータベースと比較しています。 false/0に戻ってきたら、以下の内容を実行してログインにリダイレクトします。しかし、recaptchaは常にfalseに評価されています。 編集:はい、私はv2.0を使用しています – Brxxn

答えて

2

また、渡すパラメータをhttps://www.google.com/recaptcha/api/siteverifyにもう一度チェックしてください。 レスポンスパラメータはresponSeであり、応答しません。

これは、サーバから返されたエラーが発生 - 「不足している入力応答は、」あなたは今、応答が動作していることを「G-reCAPTCHAの応答」パラメータ

を渡していない意味:

  1. file_get_contentsは、JSON応答を含む文字列を返します。あなたはJSONで成功値にアクセスする場合の方法、あなたは、あなたが最初の文字列のうち、オブジェクトを作成するjson_decodeを使用する必要があり、ここで

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

    アクセスしています。

  2. あなたは、単一のアンパサンド&代わりの& &

  3. ロジック自体を使用しているように、その同じ行のロジックは、ビット単位のAND演算子を使用している場合 - どのユーザーアカウントが存在しない現在場合はreCAPTCHAのは失敗したがエラーが発生します。それ以外の場合は有効です。問題は、ユーザーがいないがrecaptchaがOKであればユーザーは有効で、ユーザーがokでrecaptchaが失敗した場合でもユーザーは有効であるということです。だから私は、あなたが使用することを意味推測ORの代わりとしています:

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

WOW!すべてを捨てるのは簡単な間違いです!どうもありがとうございます。 私は応答を得ているので、成功とタイムスタンプをホスト名と共に正しく返します。甘い、今、私はif/elseステートメントを適切に動かすことに悩まされています。私は現在、セットアップが正しくない方法ですか? – Brxxn

関連する問題