この質問は、this oneの拡張として見ることができます。PHPセッションのエンコードとデコードのためのこれらのメソッドの安全
私たちは、任意のセッションデータを編集できるように、大規模な制作サイトのテーブルに保存されているセッションデータをデシリアライズしてシリアル化するクラスをリリースすることを検討しています。 (それだけで、現在のセッションのシリアル化された文字列を返す。)
問題session_decode()
は、復号配列を返すことなく、現在の$_SESSION
を取り込み、であり、そしてsession_encode()
は、指定された配列をコードしない
デフォルトのPHPセッションシリアライズハンドラ単純にserialize()
を使用してセッションをエンコードするのではなく、セッションのエンコードとデコードの同じ機能を利用する唯一の方法は、グローバル$_SESSION
の変数を移動(セッションに格納、データの取得、復元)するか、 session.serialize_handler
の実装を再現します。
私たちは後者の再生アプローチを、それほど邪魔にならないように選択しました。コメント欄には、この再現に関する多くの試みが文書の中でsession_encodeとsession_decodeとなっています。私は最も信頼できると思われる2つを選んで適用しました。デコード方法は非常に堅牢ですが、エンコード方式は有効ですが5年以上前に投稿されました
これらのメソッドが破損する可能性のある目立ったエッジケースが存在する可能性があるため、
結局、私が探している:以下のメソッドを中断します
- 例、またはこれらの方法は、生産に使用されており、その
- おそらく選択肢を壊さないであろうことを
- 安心プロダクションで試されテストされていますか?
おはようございます!
コード:
class Session extends BaseSession
{
/**
* Taken from http://www.php.net/manual/en/function.session-decode.php#108037
*/
public function unserialized() {
$session_data = $this->content;
$method = ini_get("session.serialize_handler");
switch ($method) {
case "php":
return self::unserialize_php($session_data);
break;
case "php_binary":
return self::unserialize_phpbinary($session_data);
break;
default:
throw new Exception("Unsupported session.serialize_handler: " . $method . ". Supported: php, php_binary");
}
}
/**
* Taken from http://www.php.net/manual/en/function.session-encode.php#76425
*/
public function serialize($array, $safe = true) {
// the session is passed as refernece, even if you dont want it to
if($safe) $array = unserialize(serialize($array)) ;
$raw = '' ;
$line = 0 ;
$keys = array_keys($array) ;
foreach($keys as $key) {
$value = $array[ $key ] ;
$line ++ ;
$raw .= $key .'|' ;
if(is_array($value) && isset($value['huge_recursion_blocker_we_hope'])) {
$raw .= 'R:'. $value['huge_recursion_blocker_we_hope'] . ';' ;
} else {
$raw .= serialize($value) ;
}
$array[$key] = Array('huge_recursion_blocker_we_hope' => $line) ;
}
$this->content = $raw;
$this->save();
}
private static function unserialize_php($session_data) {
$return_data = array();
$offset = 0;
while ($offset < strlen($session_data)) {
if (!strstr(substr($session_data, $offset), "|")) {
throw new Exception("invalid data, remaining: " . substr($session_data, $offset));
}
$pos = strpos($session_data, "|", $offset);
$num = $pos - $offset;
$varname = substr($session_data, $offset, $num);
$offset += $num + 1;
$data = unserialize(substr($session_data, $offset));
$return_data[$varname] = $data;
$offset += strlen(serialize($data));
}
return $return_data;
}
private static function unserialize_phpbinary($session_data) {
$return_data = array();
$offset = 0;
while ($offset < strlen($session_data)) {
$num = ord($session_data[$offset]);
$offset += 1;
$varname = substr($session_data, $offset, $num);
$offset += $num;
$data = unserialize(substr($session_data, $offset));
$return_data[$varname] = $data;
$offset += strlen(serialize($data));
}
return $return_data;
}
}
まあ書か質問は:) –
おかげで上ところで:)ホープ[この質問](http://stackoverflow.com/questions/9948182/custom-serialize- hand-for-custom-php-sessionhandler-db-storage?rq = 1)カスタムシリアル化ハンドラを使用している人がいましたが、それはあまりにも大きな動きになりますので、デフォルトハンドラ〜 –