2013-03-21 6 views
7

この質問は、this oneの拡張として見ることができます。PHPセッションのエンコードとデコードのためのこれらのメソッドの安全

私たちは、任意のセッションデータを編集できるように、大規模な制作サイトのテーブルに保存されているセッションデータをデシリアライズしてシリアル化するクラスをリリースすることを検討しています。 (それだけで、現在のセッションのシリアル化された文字列を返す。)

問題session_decode()は、復号配列を返すことなく、現在の$_SESSIONを取り込み、であり、そしてsession_encode()は、指定された配列をコードしない

デフォルトのPHPセッションシリアライズハンドラ単純にserialize()を使用してセッションをエンコードするのではなく、セッションのエンコードとデコードの同じ機能を利用する唯一の方法は、グローバル$_SESSIONの変数を移動(セッションに格納、データの取得、復元)するか、 session.serialize_handlerの実装を再現します。

私たちは後者の再生アプローチを、それほど邪魔にならないように選択しました。コメント欄には、この再現に関する多くの試みが文書の中でsession_encodesession_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; 
    } 
} 
+0

まあ書か質問は:) –

+0

おかげで上ところで:)ホープ[この質問](http://stackoverflow.com/questions/9948182/custom-serialize- hand-for-custom-php-sessionhandler-db-storage?rq = 1)カスタムシリアル化ハンドラを使用している人がいましたが、それはあまりにも大きな動きになりますので、デフォルトハンドラ〜 –

答えて

1

Igbinary(https://github.com/igbinary/igbinary/)は、標準のPHPシリアライザの代替の低下です。 igbinaryは時間と空間を消費するテキスト表現ではなく、コンパクトなバイナリ形式でphpデータ構造を保存します。シリアル化されたデータにmemcachedまたは類似のメモリベースのストレージを使用する場合、節約が重要です。ストレージ要件の約50%の削減が期待できます。具体的な数値は に依存します。

非シリアル化のパフォーマンスは、標準のPHPシリアライザと少なくとも同等です。直列化のパフォーマンスは、重複した文字列の追跡を可能にする "compact_strings"オプションに依存します。文字列がハッシュテーブルに挿入され、オーバーヘッドが追加されます。通常のシナリオでは、使用パターンが「めったにシリアル化されず、頻繁にシリアル化されない」ため、これはあまり意味がありません。 "compact_strings"オプションを指定すると、通常igbinaryは標準シリアライザよりも少し遅くなります。それがなければ、少し速くなります。ヌル、ブール値、整数、浮動小数点、文字列、配列とオブジェクト:

特徴

  • は、標準的なPHPシリアライザと同じデータ型をサポート。
  • __autoload & unserialize_callback_func
  • __sleep & __wakeup
  • Serializableを-interfaceのLinux AMD64、LinuxのARM、マックOSX用のx86、HP-UX上でテストさ
  • データプラットフォーム間のポータビリティ(32/64ビット、エンディアン)
  • PA-RISCとNetBSD sparc64
  • シリアライゼーションハンドラ(APC 3.1.7+)としてAPC opcodeキャッシュへのフック
  • Compati PHP 5.2でBLEと5.3

はそれが

関連する問題