ecshopログインが自動的に終了する不思議な現象を解決する

2869 ワード

最近ecshopの二次開発をしていて、プログラムが発表された後、テストに不思議な問題が発生しました.何回かページをクリックするとセッションが失われ、繰り返しログインする必要があります.ローカルでどのようにテストしても問題を再現できません.最初はプログラムを修正する問題だと思っていたが、いくら探しても問題点が見つからなかった.ネットで検索してみると、ipが変わったことが原因だという.そこで、次のテストを行いました.
  1、www.ip.cnはIPを照会して記録する
2、上陸
3、ホームページをランダムにクリックして、再登録を要求するまで
  4、www.ip.cn IPを再確認
やはり前後の2つのIPが違います.したがって,IPの変化によるセッションの失効の可能性が高いので,ecshopのセッションメカニズムを調べた.セッションキーを取得する関数はこうです
  includes/cls_session.php(移動先も同様:mobile/include/cls_session.php)
function gen_session_key($session_id)
{
  static $ip = '';

  if ($ip == '')
  {
    $ip = substr($this->_ip, 0, strrpos($this->_ip, '.'));
  }

  return sprintf('%08x', crc32(ROOT_PATH . $ip . $session_id));
}

IPが変化すると、substr($this->_ip,0,strrpos($this->_ip,'.'))が取得したIPセグメントは、同じIPセグメント内でなければ同じセッションキーを取得できません.さらにセッションの具体的な情報が得られず,重複登録を招く.これも、ローカルで問題を再現できない理由です.はい、問題が見つかりました.では、どうやって解決しますか?最も簡単な方法はIPセグメントを取得した部分を削除することであり,修正した関数もこのようになる.
function gen_session_key($session_id)
{
    static $ip = '';

  /*
    if ($ip == '')
    {
        $ip = substr($this->_ip, 0, strrpos($this->_ip, '.'));
    }
   */

    return sprintf('%08x', crc32(ROOT_PATH . $ip . $session_id));
}

これにより、重複ログインの問題を解決できます.しかし、これはプログラムのセキュリティの問題にも関連しており、sessionがIPを漏らすと判断が失効する.これにより、Webサイトのセキュリティがさらに低下し、その中でどのように取捨選択しても賢明になります.