0

ロードされるとログインダイアログを表示するログインページがあります。JQueryログインダイアログは、を使用する単なるダイアログですAjax call。そんな感じ:

$(function() {
    var _width = $.browser.msie ? 316 : 'auto';
    var loginDialog = $('#loginDialog');

    loginDialog.dialog({
        closeOnEscape: false,
        open: function() {
            $(this).parent().find('.ui-dialog-titlebar-close').hide();
        },
        resizable: false,
        position: 'center',
        stack: true,
        draggable: false,
        height: 'auto',
        width: _width,
        modal: true,
        buttons: {
            'submit': function() {
                $.ajax({
                type: 'post',
                dataType: 'html',
                url: '/ProjectName/Scripts/php/AccountController.php',
                cache: false,
                // async: false,
                data: $('#loginForm').serialize(),
                success: function(accessStatus) {
                    if(accessStatus === 'granted') {
                        loginDialog.dialog('close');
                    }
                },
                error: function(request, status, error) {
                    // handle it in a specific manner
                    alert(error);
                }
            });
        }
    }        
});

したがって、(サーバー側で)問題がなければ、ダイアログを閉じるだけです。

それからAccountController.php今のところファイルに私はそのようなものを持っています:

<?php   
    session_start();
    if(IsAjaxRequest()) {
        if(isset($_REQUEST['username']) && isset($_REQUEST['password'])) {  
            require_once('LDAPHandler.php');

            // credentials
            $username = $_REQUEST['username'];
            $password = $_REQUEST['password'];
            // ... more parameters

            // ... Fetch against AD
            if(IsInAdminRole($username, $password)) {
                // ... establishing mysql connection & setting connection options

                // and then:                        
                mysql_query(
                    'insert into accounts'. 
                    '(login, sid) values({$username}, {session_id()})'.
                    'on duplicate key update sid=values(sid)'
                );

                // write response
                echo 'granted';
            }
        }
    }
?>

私が欲しいのは、データベースsidの関連レコード()に保存することです。Accounts table私を混乱させるもの:

  • ログインサーバーが成功した後にユーザーがページを複製した場合、私が理解している限り、同じセッションCookieを使用しますか?私は正しいですか?ブラウザを閉じない限り。
  • さまざまなブラウザで状況を処理するにはどうすればよいですか?
  • session_start()セッションを使用する必要がある場合はいつでも、ページで呼び出す必要があることを読みました。これは、sidログイン時に書き込まれるものとは異なりますか?
  • 重複したくない場合は、ユーザーが同じリソースに複数回(同時に)アクセスするべきではないことを意味します。これを処理するにはどちらの方法が最適ですか?
  • また、ユーザーがであると言うために、ある種のフラグ(おそらくアカウントテーブルのフィールド)を使用する必要があることも理解しています。active別の方法では、最後のフラグのみを保存しsidます。または、セッションが終了したらデータベースからユーザーを削除するのがより良い解決策ですか?

どうもありがとう!

4

1 に答える 1

1
  • はい、その通りです(クライアント側に改ざんがない限り)。
  • なぜあなたはそれについて心配する必要がありますか?
  • session_start()新しいセッションを開始し、以前に開始した場合は前のセッションを再開します。
  • 私を信じて、試さないでください。
  • これは、現在ログインしているユーザーを確認するのに役立ちますが、ユーザーがログアウトするとき、またはユーザーがしばらくアクティブになっていないときは、アクティブを0に設定する必要があります(15分が妥当です)。

更新:これらはあなたの質問に直接関係していませんが、覚えておくのは良いことです。

  • あなたのコード(SQL部分)はSQLインジェクションに対して脆弱です。自分自身を保護する方法については、こちらの回答をお読みください。

  • 空の(またはNUL)パスワードが指定されている場合、LDAPコードは誤検知に対して脆弱です。これは、パスワードが指定されていない場合に匿名バインディングldap_bind()を試行し、正しいユーザー名を指定すると誰でもログインできるようになるためです。したがって、必ずすべての制御文字を除外してから、空のパスワードを確認してください。

  • ユーザー名として指定することで、コードにLDAP「インジェクション」を実行することもでき*ます。

于 2012-07-17T08:48:47.903 に答える