ホームページ  >  記事  >  バックエンド開発  >  セッションIDの破棄についてアドバイスをお願いします。

セッションIDの破棄についてアドバイスをお願いします。

WBOY
WBOYオリジナル
2016-06-23 13:49:351406ブラウズ

簡単なログイン関数を作成し、session_set_save_handler を使用してセッション データを管理用にデータベースに保存します。 ここで問題が発生します。最初のユーザーが同じブラウザでログインしたとき、2 番目のユーザーがログインしたときに行うのは正常です。同じブラウザ内に存在できるセッション ID は 1 つだけなので、新しいセッションを作成します

コードは次のとおりです
function open($save_path, $session_name) {
return(true) );
}
function close() {
return(true);
function read($id) {
$sql = "sess_id='$id' のセッションから * を選択"
if ($result = mysql_query($ sql) {
) IF ($ row = MySQL_FETCH_ARAY ($ Result)) {
Return $ row ["session_data"] ITE ($ ID, $sess_data) {
$data_array =explode("username",$); sess_data);
$i = 0;
foreach ($data_array as $data_item){
if($i == 1){
$data_array_sub =explode (""",$data_item);
if($username ! = null && strlen($username ) & gt; 0) {
$ con = mysql_connect ("127.0.0.1", "root", "111111");
mysql_select_db ("session"); ()."',`session_data`='$sess_data' where `username`='$username' and `sess_id`='$id'";
$result = mysql_query($sql);
if ($result= =true) {
を通じて を通じて を通じて を通じて ' s ' ‐ ‐‐‐‐‐‐‐‐ if ($result==true) session set sess_id=' ',session_data='' where sess_id='$id'";
if ($result = mysql_query($sql)) {
}
function gc($maxlifetime) {
$sql = "`セッション` を更新 set sess_id= '',session_data='' where unix_timestamp(now()) -`session_time` > '1800' and LENGTH(sess_id)>1";
$result = mysql_query($sql) ;
if ($result == true) {
echo $sql;
return true; } else {
echo "error"; return false }

}
session_set_save_handler("open", "close", "read", "write", " destroy", "gc");
session_start();
?>
//ファイル名は session_user_start.php です
login.php のコードは


require_once "config/session_user_start.php";
$_SESSION['login'] = 1;
$_SESSION['id_user'] =11;
...login.php のコードは省略されています
問題ありませんそうすることで

ここで問題が発生します。セッション ID が同じであるため、2 番目のユーザーがログインするときに、以前にログインしたセッション データをクリアしたいので、login.php を次のように変更します
require_once "config/session_user_start .php";
session_unset() ;
session_destroy();
require_once "config/session_user_start.php";
$_SESSION['login'] = 1;
$_SESSION['id_user'] =11;
... login.php に続く .code は省略されています

破棄するときは destroy 関数が呼び出されますが、破棄後、login.php が実行を終了して write($id, $sess_data) を呼び出すと
$sess_data の値は空です、そして2 番目のセッション データを書き込むことができません。
session_unset();
session_destroy(); これらの 2 つの文を実行した後、再試行してください
session_set_save_handler("open", "close", "read", "write", "destroy", " gc");
session_start() ;それは不可能ですか? なぜデータを取得できないのですか? 教えてください


session_unset()
は現在メモリ内に作成されているすべての $_SESSION 変数を解放しますが、セッション ファイルを削除せず、対応するセッション ID を解放しません

session_destroy()
現在のユーザーに対応するセッション ファイルを削除し、セッション ID を解放します
メモリ内の $_SESSION 変数の内容は保持されます。破棄されてから session_start() が呼び出された場合、セッション ID の値は変わりません。

require_once "config/session_user_start.php";ロードされているため、後で何度実行しても無効になります session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
作業中のものをバインドするだけです機能であり、特定のデータとは何の関係もありません。何度も実行しても意味がありません

また、php5.4以降、session_start()を繰り返すとエラーが報告されるようになります

sessionidの値を変更するには、session_regenerate_id関数を使用します

そのため、プロセスは次のようにする必要があります
require_once "config /session_user_start.php";
if (yes New user) {
session_regenerate_id();
$_SESSION 割り当て操作
}
通常の検証操作

sessionid が変更されているため、元の sessionid は当然無効になります
gc によってクリーンアップが完了します



require_once "config/session_user_start .php";
一度ロードするとロードされないので、後から何度実行しても無効になります
session_set_save_handler("open", "close", "read ", "write", "destroy", "gc") ;
これは単なるバインディング作業関数であり、特定のデータとは何の関係もありません。何度も実行しても意味がありません

なお、php5.4からはsession_start()を繰り返すとエラーになります

sessionidの値を変更するにはsession_regenerate_id関数を使います

そのため、処理は
require_once "config/session_user_start. php";
if (yes New user?) {
session_regenerate_id();
$_SESSION 割り当て操作
}
通常の検証操作

sessionid が変更されているため、元の sessionid は当然無効になります
gc によってクリーンアップが完了します

ありがとう

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。