3

困惑する問題があります。Webサイトのログインシステムを構築していますが、IE 9の1人のユーザーのコンピューターでのみ、サインインスクリプトが失敗します。Fiddlerを使用して、適切なPOSTデータが送信されていることを確認しました。私はそのコンピューターでもっと仕事をするでしょうが、私にはその機会がありません。

正しいログインの詳細が送信されていることを知っています。誤ったログイン詳細が送信されると、PHPスクリプトによって正しいエラーが送信され、すべてのアカウントでログインが失敗します。サインインシステムはPHPセッションを使用します。私はこれに完全に困惑していて、そのようなものを見たことがありません。

Gatewaymma.comにあるサイト私は特別なアクセス権を持たないテストアカウントを設定しました:

ユーザー名:testAcc

pwd:test22

繰り返しますが、これはIE 9でのみ発生し、他のブラウザーでは発生せず、1台のマシン(win 7)でのみ発生するため、複製できませんでした。私が知る限り、正しい$_POSTデータが受信されます。

誰かがこれを複製するか、これを引き起こしている可能性があると彼らが見た可能性のある領域を与えることができれば、それは大いにありがたいです。

Cookieのセキュリティが問題の原因である可能性があると思っていましたが、Cookieのチェックを追加した後、エラーは発生しませんでした。

ログインスクリプトの一部は次のとおりです。

            if(/* the password was correct, there is def no problem here*/){
                
                session_regenerate_id(true);
                
                $_SESSION['logged'] = true;
                /*set other session vars*/
                
                
                DB::query("UPDATE fa_logged_ips SET tries = 0, next_try = 0 WHERE ip = %s LIMIT 1", $_SESSION['ip']);
                
                DB::query("UPDATE fa_users SET last_login = $_SESSION[last_activity] WHERE ID = %s LIMIT 1", $_SESSION['uid']);
            }
        }
        //If the login was not successful (this error message is not fired, so I don't believe the session is being lost somewhere after this point
        if($_SESSION['logged'] !== TRUE){
            $fArray['loginErr'] = "The username and password combination you entered is not valid.";
            check_ip();
        }

スクリプトの最後のセクションでは、ユーザーがログインしていることを確認します。つまり、セッションは正常に作成されましたが、ユーザーがホームページにリダイレクトされると、セッションが失われていることに注意してください。

編集:もう1つ、このログインシステムは、同じコンピューターで正常に動作するサイトの別のセクション(サブドメイン)で起動したものから派生しており、過去5か月間は正常に動作しています。

編集:

if(!isset($_SESSION['logged'])){

formatSession();
setcookie('cookieTest', '1', time()+3600*24*30); //set a cookie that will be checked for later
$ip = $_SERVER['REMOTE_ADDR'];  //Get the user's ip address

//Check if the IP is logged in the system
$logged_ip = DB::queryFirstRow("SELECT * FROM fa_logged_ips WHERE ip = %s", $ip);

//if so
if(!empty($logged_ip)){
    
    //if ip has too many failed logins
    if ($logged_ip["tries"] < $login_attempt_limit) {   
        $_SESSION['next_try'] = $logged_ip["next_try"]; //store when their lockout ends
    }
    else {
        $_SESSION['next_try'] = 0; //otherwise they may try to log in at their discretion
    }
    
    $_SESSION['tries'] = intval($logged_ip["tries"]); //store how many login tries the ip has
}               
}

The session format funciton

 function formatSession(){
global $sysEnable;

$_SESSION['logged'] = false;        //The user is not logged in
$_SESSION['sysEnable'] = $sysEnable;//Store wether or not the system is accessible
}

編集

これは、IEのある種のセキュリティ設定に関連していると強く感じています。これは、1台のコンピューターでのみ発生し、他のマシンでは複製できなかったためです。また、Cookieのセキュリティを強化することで同様の効果を出すことができましたが、前述のように、コンピュータでのCookieのチェックは成功しました。

9/1を編集

IEがセッションの維持に失敗している可能性があると思います。IEはセッションIDを保存していません。繰り返しますが、私はこの動作を再現できなかったので、そのコンピューターで作業できるようになるまで、100%ポジティブになることはできません。

4

1 に答える 1

2

ああ、私は最近これに遭遇しました!投稿データが正しく渡されたので、それが起こっていることを自分の目で信じることができませんでした!私は正確なログインスクリプトを作成しましたが、IEでのみ同じ問題が発生しました。

ログイン後にEnterキーを押し、フィールドにパスワードを入力したとき、および他のすべてのブラウザーでログインが正常に行われたとき、IEではページが更新されただけでした。しかし、パスワードフィールドの下にあるサインインボタンをクリックすると、すべてがうまくいきました!

それに対する論理的な説明はありませんでした、そして今私はそれがただIEの見過ごされているバグであると言わなければなりません!

私がしたことは、ユーザーのブラウザーが検出され、IEの場合は、Enterキーをキャンセルし、ユーザーにサインインボタンをクリックするように強制しました。

このクレイジーな問題を解決するための私のコードは次のとおりです。

function browserIE(){
 if($.browser.msie){ 
     return true;
 }
 return false;
}

$(document).keypress(function(event) {
        var keycode = (event.keyCode ? event.keyCode : event.which);
        if (keycode == '13' && browserIE()){
            event.preventDefault();
            event.stopPropagation();
        }
});

これが、IEユーザーに適切なサインインを行うためにsinginボタンをクリックするように強制する唯一の方法でした。なぜなら、Enterキーを押す前に言ったように、フィールドにいることは私の場合も失敗したからです。

編集:

別の解決策1

他の解決策もあり得ますが、私の場合は機能しませんでした。非表示の入力フィールドを追加することです。

<!-- Fix for Internet Explorer bug (One text input and submit, disables submit on pressing "Enter") -->
  <div style="display:none">
    <input type="text" name="hiddenText"/>
  </div>

別の解決策2

Internet Explorerは読み込み時にページをスキャンし、どの送信ボタンが表示されているかを判断してから、送信への入力機能をそれらのフォームに添付しているようです。

このシナリオを修正するには、次のjQueryコードを使用できます。

$(document).ready(function() {
   $('input').keydown(function(e){
     if (e.keyCode == 13) {
        $(this).parents('form').submit();
        return false;
     }
   });
}); 

リターンfalseは、リターンを押した場合に聞こえる可能性のあるビープ音を防ぐため、InternetExplorerではかなり重要です。ビープ音は「ここにEnterキーを押すことはできません!」と言っていますが、falseを返すとキーの押下がキャンセルされるため、ブラウザは警告を表示しません。

これと人々のコメントについてもっと読む:Enterを使ってIEでフォームを送信する

また、読むことをお勧めします:InternetExplorer以降のボタンと入力[type="submit"]

于 2012-08-13T15:21:00.567 に答える