2012-04-25 13 views
2

私は以前これをやったことがないし、まだGoogleやStackOverflowで多くのヘルプを見つけていない。jqueryとphpでパスワードを検証する方法は?

は、ここで私が持っているものだ:パスワード入力:

<input type="text" placeholder="password" name="pass" id="password" /> 

といくつかのjQueryのパスワードを確認する:

<script> 
$('form').submit(function(){ 
input = $('#password').val(); 
var finish = $.post("pass.php", { request: "opensesame" }, function(data) { 
    return (input==data) ? true : false; 
}); 
if(finish){ 
alert('sent'); 
}else{ 
alert('not sent'); 
} 
return false; 
}); 
</script> 

とパスワード分配PHPページ(pass.php):

<?php 
if(isset($_POST['request'])&&$_POST['request']=="opensesame"){ 
echo 'graphics'; 
} 
?> 

今、私は 'グラフィックス'に警告することができますが、データを入力値と照合して確認することはできませんそれは正しいパスワードかどうかです。

私は間違っていますが、このようにパスワードを認証する潜在的な危険性は何ですか?

答えて

3

最初にやるべきことは、コードを整理することです。あまりにもあいまいです。私は恐れています。

次のように私はそれを記述します:ここで注意すべき

<script> 

$('form').submit(function(event){ 
    event.preventDefault(); // stop the form from submitting 
    var passwd = $('#password').val(); 
    var finish = $.post("pass.php", { request: passwd }, function(data) { 
     if(data){ 
      alert('Success!'); 
     }else{ 
      alert('Failure :('); 
     } 
    }); 
}); 

</script> 

もの:

  • をAJAX POSTが非同期である、あなたはコールバックにそれを変更した後、変数権利をチェックすることはできませんあなたは、内ののコールバックを処理する必要があります。
  • でなければなりません。サーバー上のパスワードを確認してください。javascriptではありません。
  • 前の箇条書きを追加すると、パスワードをJavaScriptに書き込まないでください!

、サーバー上:ここで注意すべき

<?php 

    if(isset($_POST['request']) && $_POST['request']=="opensesame"){ 
     echo 'true'; 
    }else{ 
     echo 'false'; 
    } 

?> 

もの:

  • あなたは、変数の存在を確認するために良いコールisset()を使用しました。それをやり続けます。
  • jQuery POSTは、サーバーからjavascript値を取得します(特に指定しない限り)。
  • これは私のコードが'true'または'false'のいずれかを印刷する理由です。これはjavascriptのブール値に変換されます。私は下記のようなエラーの詳細、持つオブジェクトを返す助言する
  • <?php 
        $result = array('success'=>false, 'reason'=>'Unknown error.'); 
        if(isset($_POST['request'])){ 
         if(trim($_POST['request'])!=''){ 
          if($_POST['request']=='opensesame'){ 
           $result['success'] = true; 
           $result['reason'] = 'Welcome home!'; 
          }else $result['reason'] = 'Password is wrong'; 
         }else $result['reason'] = 'Password must not be empty'; 
        }else $result['reason'] = 'Expected parameter "request"'; 
        echo json_encode($result); 
    ?> 
    
+0

私はサーバー上のパスワードを確認しようとしています。そのため、pass.phpを呼び出しています。私はpass.php経由でパスワードを取得しており、入力値と一致させようとしています。これをどのように達成するのですか? – bozdoz

+0

@bozdoz私が言ったように、サーバー*上のパスワード*を比較してください。**クライアントに渡さないでください。そうでなければ、彼は2回目の試みでパスワードを知っています。 – Christian

+0

クライアントはパスワードを受け取らないのですか?あなたはpass.phpからコードを投稿したのでそれを見ることができますが、誰かがそれを見ることができませんでしたか? – bozdoz

2

あなたのスクリプトにすべてのデータをご入力フィールドをシリアル化する必要があります。それはPOST-を送るよう

$.post("pass.php", { request: $('form').serialize() }, function(data) { 
// ... 

限り、あなたがあなた自身のサーバー上にあるように私は、多くの潜在的な危険性が表示されませんとにかく通常のフォームが行うリクエスト。

+0

'request'変数は、私がpass.phpに送信しているものです。それはうまく働いています(多分私はそれを必要としないかもしれません)。これは、pass.phpから私の 'input'変数と一致するようにパスワードを戻す方法について私の質問には答えません。 – bozdoz

+0

なぜパスワードを送り返しますか?ログインに成功した場合に返信するだけです。 PHPスクリプト(ここでは 'graphics'のような)からの戻り値は無名関数の' data'の中にあり、要求/応答が行われた後に自動的に実行されます。 –

+0

あなたは何を意味するのか分かりません。私はフォームを提出する前にパスワードが正しいかどうかチェックしています。私は、パスワードが正しいことを知るまでフォームを送信していませんが、パスワードが安全でないため、パスワードをjavascriptで保持したくありません。パスワードをPHPファイルに保存したい。 – bozdoz

5

「AJAX」の「A」は、の非同期の略です。

$postを呼び出した後のコードは、$postの機能の前に実行されます。 finishの値は常にjqXHRオブジェクトになりますが、(input==data) ? true : falseの結果は無視されます。

より明確に

あなたは、パスワードチェックのあなたの方法を再考したり、 $.post呼び出し前に、以下を追加することにより、同期ポストバックを使用する必要が
var finish = $.post("pass.php", { request: "opensesame" }, function(data) { 
    // THIS EXECUTES SECOND, and the return value is discarded 
    return (input==data) ? true : false; 
}); 

// THIS EXECUTES FIRST, with finish set to a jqXHR object 
if(finish){ 
... 

$.ajaxSetup({async:false}); 

それとも$.ajaxとパッシングを使用して、 async: false

jQuery.ajax({ 
    type: 'POST', 
    url: "pass.php", 
    data: { request: "opensesame" }, 
    success: function(result) { ... }, 
    async: false 
}); 
+0

絶対に。私は何が起こっているのか理解していますが、それを修正する方法はわかりません。 – bozdoz

+1

スタイルに関する無関係の注釈。これは 'return(input == data)ですか? true:false; '常にreturn input == data'と書くべきです。 – meagar

+0

同期ポストバックが機能しませんでした。 – bozdoz

1

そのかなり危険なこのようなデータを送信するために、誰もが傍受し、あなたがで送るデータを読み取ることができますajaxと、firebugや他のツールを使ってajaxによって返された値。フィールドをシリアル化またはサニタイズし、送信する前にデータを暗号化する必要があります。

&終了を確認した後に警告するコードは、応答がajaxから来る前に実行されます(非同期であることに注意してください)。したがって、finish変数にオブジェクトが格納されます。

+0

私はpass.phpからパスワードを取得し、入力フィールドと一致させようとしています。私はフォームを提出しようとしていません。パスワードはpass.phpにあります。 JavaScriptではありません。 – bozdoz

+2

@bozdozええ、あなたのajax呼び出しで 'graphics'が返されます(私はそのパスワードを推測します)&誰もfirefugや他の開発者ツールでajaxの応答を見ることができます – gopi1410

+0

どのように 'graphics'を見ることができますか?彼らがページを調べると、 "request: 'opensesame'とページ(pass.php)を見ることができます。しかし、その要求は掲示されなければならない。 pass.phpをより安全にする方法はありますか? – bozdoz

関連する問題