2

私はこれまでこれを行ったことがなく、GoogleやStackOverflowでまだ多くの助けを見つけていません。

これが私が持っているものです:パスワード入力:

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

これで、「グラフィックス」にアラートを出すことはできますが、データを入力値と一致させて、正しいパスワードかどうかを確認することはできません。

私は何を間違っているのですか、そしてこの方法でパスワードを認証することの潜在的な危険性は何ですか?

4

4 に答える 4

5

「AJAX」の「A」は非同期を表します。

呼び出し後のコード$postは、関数の内容の前に実行され$postます。の値finishは常にjqXHRオブジェクトであり、 の結果は(input==data) ? true : false無視されます。

より明確に:

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

パスワード チェックの方法を再考するか、$.post呼び出しの前に以下を追加して同期ポストバックを使用する必要があります。

$.ajaxSetup({async:false});

または、使用$.ajaxして渡すことによりasync: false

jQuery.ajax({
  type: 'POST',
  url: "pass.php",
  data: { request: "opensesame" },
  success: function(result) { ... },
  async:   false
});   
于 2012-04-25T17:20:18.263 に答える
4

最初にすべきことは、コードをクリーンアップすることです。

私なら次のように書きます。

<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()は、変数good callの存在を確認していました。それをやり続けます。
  • 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);
    ?>
    
于 2012-04-25T17:22:36.157 に答える
2

入力フィールドをスクリプトのすべてのデータにシリアル化する必要があります。

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

あなたがあなた自身のサーバー上にいる限り、それは通常のフォームがとにかく行うであろうPOSTリクエストを送信するので、私は多くの潜在的な危険を見ません。

于 2012-04-25T17:17:04.243 に答える
1

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

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

于 2012-04-25T17:26:06.520 に答える