0

編集:自分自身に回答を割り当てることについて苦情があった後、提供された回答が満足のいくものではなかったことを更新したいと思います。誰も出てきて、これがあなたの問題であると明確に言ったわけではありません。これを行うと、解決策が得られます。報奨金を授与するには、単なる提案では不十分です。最後に、問題はサーバー設定にあり、サーバー セッションに関する調査を行い、Stackoverflow/Serverfault を調べた後、この問題を解決する最善の方法を判断することができました。ですから、自分の答えを正解とするのは不当だとは思いませんでした。

LDAP に依存して身元を確認し、セッションを使用してユーザーの認証状態を維持する PHP ベースの認証システムがあります。

最近、セッションが期限切れになったように、ログイン ページに戻されているように見えることに気付きました。問題は、私が気づいた特定の理由ではないようであり、このようなものをデバッグ/テストする方法がわからないことです。

セッションを開始する認証関数は次のとおりです。

function authenticateUser($user, $password){
    //assuming ldap connection and verification of user login/pass
    //this is what will happen with authenticate user which is called 
    //when user submits login/pass on authentication form. 
    $_SESSION['id'] = $uID;
    $time = time(); 
    $_SESSION['time'] = $time;                                  
    $_SESSION['lastActivity'] = $time; 
    $_SESSION['expiration'] = $time+$cookieExpiration; 
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];  
    $_SESSION['secret'] = md5(rand());                          
    $_SESSION['userHash'] = getSessionHash();  
    $_SESSION['firstLogin'] = isFirstLogin($user); 
    //assign cookie to user and log authentication 
    giveCookie("userHash", $_SESSION['userHash'],0);
    logAuthenticationAttempt($user, $_SERVER['REMOTE_ADDR'], 1);
    return true;
}//end authenticateUser 

クッキー関数を与える:

function giveCookie($name, $value, $expiration=0){
    global $path, $site; 
    setcookie("userHash", $_SESSION['userHash'], $expiration, $path, $site, true, true);    
}//end giveCookie 

認証ステータスを必要とするアクションを続行できるようにする前に、ユーザーが認証されていることを確認するために各ページで呼び出される関数を次に示します。

function isValidUser(){
    global $links; global $userName; global $userID; global $cookieExpiration; 
    if(isset($_COOKIE['userHash']) and isset($_SESSION['userHash'])){
        if($_COOKIE['userHash'] == $_SESSION['userHash']){

         $userName = $_SESSION['nameN'];
         $userID = $_SESSION['id'];
         //update userHash cookie for additinoal expiration time this way session
         $time = time(); 
         $expiration = $time+$cookieExpiration; 
         $_SESSION['lastActivity'] = $time; 
         giveCookie("userHash", $_SESSION['userHash'],0);
         $_SESSION['expiration'] = $expiration; 
         return true;
         }
    }
    return false;
}//end isvalidUser() 

これをテストする方法に関するアドバイスやフィードバックをいただければ幸いです。何らかのアクションを実行した後、ログイン ページに戻されることがある理由を突き止めようとしています。

認証を要求するページで、私が上部で行うことは次のとおりです。

if(!isValidUser()){changePage($links['login']."?refer=".$links['requestHelp']);}
//note: changePage is just a function for header("location: somepage.php"); 
4

6 に答える 6

2

認証、承認、およびセッション管理を混乱させているようです。3つすべてをテストしたい場合は、スクリプト化可能でステートフルなHTTPセッション再生が可能なある種の自動テストツールが必要です(例: http::recorder / www::mechaninze with Perl)。

OTOH デプロイされたアプリケーションを使用してセッション管理を調査したい場合は、現在のセッションとユーザーがそこにルーティングされた方法に関する情報を取得するために、ログイン ページをインストルメント化することをお勧めします。セッション Cookie を Web サーバーに記録することも検討する必要があります。

于 2010-09-14T12:39:38.503 に答える
2

現在使用しているテスト ソフトウェアはわかりませんが、Seleniumを強くお勧めします。これにより、スクリプト化されたテストをブラウザーで実行できるようになり、エンド ユーザーが何を実行し、何を表示するかを効果的にシミュレートできます。

于 2010-09-20T14:38:07.713 に答える
1

機能テストを書きます。このようなものには、SimpleTest の WebTestCase を使用できます。次のドキュメントを参照してください: http://www.simpletest.org/en/web_tester_documentation.html

もちろん、個別にテストしやすいように、コードを小さなビットに分割することもできます。現在、認証システムはサーバーの状態 (セッション管理など) と密接に結びついています。この 2 つを切り離すことで、機能テストではなく単体テストで認証システムをテストできるようになります。

于 2010-09-20T14:33:30.207 に答える
0

session.configurationを詳しく見てみましょう

私は(あなたがあなたのコンセプトを考えたくないのであれば)isValidUserあなたが今までに得たものをログに記録するように変更しますreturn false

function isValidUser(){
    global $cookieExpiration; // since $links isn't used and $userName and $userId come from $_SESSION no need for global there
    if( (isset($_COOKIE['userHash']) and isset($_SESSION['userHash'])) 
        and ($_COOKIE['userHash'] == $_SESSION['userHash']) ){

         $userName = $_SESSION['nameN']; // why these lines?
         $userID = $_SESSION['id']; // see above
         //update userHash cookie for additinoal expiration time this way session
         $time = time(); 
         $expiration = $time+$cookieExpiration; 
         $_SESSION['lastActivity'] = $time; 
         giveCookie("userHash", $_SESSION['userHash'],0);
         $_SESSION['expiration'] = $expiration; 
         return true;
    }
    // $logger ist just an example an could be a p.e Zend_Logger Object
    $logger->debug($_SESSION); // serialize if needed
    $logger->debug($_COOKIE); // serialize if needed
    $logger->err(error_get_last());
    return false;
}//end isvalidUser()

そして、あなたはsession_start()前に電話したのは確かですかisValidUser()

于 2010-09-20T14:30:14.387 に答える
0

サーバーはおそらくセッション cookie を上書きしています。これにより、セッション ハッシュが変更され、クライアント側の cookie と等しくなくなります。あなたはこれを考えすぎているようです。それらを確認するためにシステムに Cookie を設定する必要はありません。$_SESSION 変数がすべてを処理します。

チャレンジに合格すると、認証レベルを与える $_SESSION var が設定されます。

あなたのような他の変数に $_SESSION を渡さないでください。$username = $_SESSION['username'] に行かないでください。安全でないデータ ($username) が含まれている可能性があるためです。しかし、そうではないかもしれません。

セッション情報を表示するときはいつでも、それが馬の口からのものであることを確認してください。

于 2010-09-20T14:23:07.643 に答える
-1

これは、サーバー自体の単純な構成ミスだったようです。このサーバー環境は何百ものサイトの共有環境であるため、php.ini などでサーバー全体の設定を変更することはできません。

私ができたのは...

session_set_cookie_params(time()+$expiration, $path, $domain, true, true); 

これにより、問題が解決されました。セッションの有効期限が正しく設定されていない前に表示され、この特定のアプリケーションに応じて設定されます。

于 2010-09-20T15:01:16.003 に答える