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)
IPが変化すると、substr($this->_ip,0,strrpos($this->_ip,'.'))が取得したIPセグメントは、同じIPセグメント内でなければ同じセッションキーを取得できません.さらにセッションの具体的な情報が得られず,重複登録を招く.これも、ローカルで問題を再現できない理由です.はい、問題が見つかりました.では、どうやって解決しますか?最も簡単な方法はIPセグメントを取得した部分を削除することであり,修正した関数もこのようになる.
これにより、重複ログインの問題を解決できます.しかし、これはプログラムのセキュリティの問題にも関連しており、sessionがIPを漏らすと判断が失効する.これにより、Webサイトのセキュリティがさらに低下し、その中でどのように取捨選択しても賢明になります.
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サイトのセキュリティがさらに低下し、その中でどのように取捨選択しても賢明になります.