PHPシーケンス化入門

3929 ワード

シーケンス化と逆シーケンス化により,PHPにおけるオブジェクトの伝達を容易に行うことができる.本質的に反シーケンス化は危害を及ぼさない.しかし,ユーザがデータを制御可能であれば,逆シーケンス化を用いてpayload攻撃を構築することができる.
phpシーケンス化の役割:
上の话の翻訳の率直な点はストレージと运送と伝达を便利にすることで、例を挙げると:1つの配列あるいはオブジェクトをファイルあるいはデータベースの中に保存したいならば、どのようにします.文字列のような記憶はできないでしょう.だから配列やオブジェクトを格納する前にデータをserializeし、コンテンツを取り戻すときにunserializeします.
jsonも同じではないかと思い出す人もいるかもしれませんが、私もそう思っていたので、jsonとシーケンス化された検索と長所と短所を探してみました.
ここで私はただ長所と短所の結果だけを貼って、詳しい対比の過程はこの招待状の中で見ることができます:https://blog.51cto.com/zhweizhi/1952116
 
 
json
serialize
メリット
  • 変数のシーケンス化後も
  • を読み取ることができる.
  • は、JSONフォーマットが標準の
  • であるため、他のシステムで使用できます.
  • UTF-8以外の変数
  • を許可する
  • はstdClassの例を除く他の例
  • をサポートする.
    欠点
  • はUFT-8のデータのみに有効であり、他の符号化はうまく機能しない可能性がある
  • stdClassクラスの例に対してのみ有効な
  • 符号化されたテキストは、人間にとって読み取り不能な
  • である.
  • 他の言語のシステムによって参照できない
  •  
     
     
     
     
     
     
    同時にその文章の最後に見ることができます.
    「jsonシーケンス化と逆シーケンス化はクラス内のプライベートメンバー変数を失い、serializeシーケンス化と逆シーケンス化はクラスの変数であればよいが、クラスのメンバーメソッドではシーケンス化と逆シーケンス化はできないことが分かった.
    一般的には、jsonはプラットフォームをまたぐ汎用フォーマットなので、jsonのほかにxmlを使うのがいいです.では、いつserialize方式を使いますか?
    クラスをserialize逆シーケンス化すると、マジックメソッドがデフォルトで呼び出されます.wakeUp()は、オブジェクトがシーケンス化時に保持できなかった様々な状態を再構築できるようにします.たとえば、データベース接続などです.それはもう一つの問題です.ここでは深く研究しません.」
    もう一度serializeシーケンス化に戻ります
    serialize()/オブジェクトを文字列に変換
    unserialize()/文字列をオブジェクトに変換
    PHP
    class test
        {
            private $flag = "flag{233}";
            public $a = "aaa";
            public $b = 1234;
            static $c = "bbb"; }
    $test = new test; $data = serialize($test); echo $data; ?> //O:4:"test":3:{s:10:"testflag";s:9:"flag{233}";s:1:"a";s:3:"aaa";s:1:"b";i:1234;}

    serializeの結果をどう思うか説明します
    O:4:「test」はobject名に4つの文字列があることを示す
    :3オブジェクトのプロパティが2つあることを示します(flag,a)
    {}には属性の値が入っています
  • s:10:「testflag」はstringタイプを表し、長さは10、値は「testflag」
  • である.
  • i:1234はintタイプを表し、値は1234
  • である.
    ここでは詳細に注意してください.flagは4しかなく、testflagも8しかありませんが、ここに表示される長さは10です.これはprivateプロパティなので、ドキュメントをめくると説明が表示され、両側に空のバイトが追加されます.したがって、入力シーケンス化文字列を逆シーケンス化する際には、2つの空のバイトを補完することに注意する必要があります.
    public、protected、privateの下でシーケンス化されたオブジェクトの違いをもう一度話します
  • public変数
  • 直接変数名逆シーケンス化
  • protected変数
  • x 00+*+x 00+変数名
  • private変数
  • x 00+クラス名+x 00+変数名

  •  
     
    重要な2つの方法:
    __sleep()serialize()関数は、クラスにマジックメソッドが存在するかどうかをチェックします.sleep().存在する場合は、シーケンス化操作を実行する前にメソッドが呼び出されます.この機能を使用すると、オブジェクトをクリーンアップし、オブジェクト内のすべてのシーケンス化すべき変数名を含む配列を返すことができます.メソッドが何も返さない場合、NULLはシーケンス化され、E_が生成される.NOTICEレベルのエラー.オブジェクトがシーケンス化される前にトリガーされ、シーケンス化された格納が必要なメンバー属性を返し、不要な属性を削除します.
    __wakeup()unserialize()は、1つの__が存在するかどうかをチェックします.wakeup()メソッド.存在する場合は、先に__が呼び出されます.wakeupメソッドは、オブジェクトに必要なリソースを事前に準備します.オブジェクトリソースを事前に準備し、voidを返します.逆シーケンス化操作でデータベース接続を再確立したり、他の初期化操作を実行したりするのによく使用されます.
     
    バイパス_wakeup()
    CVE-2016-7124脆弱性、シーケンス化文字列の中でオブジェクトの属性の個数の値が真実の属性の個数より大きいことを表す時スキップします_wakeupの通常のシーケンス化オブジェクトの実行後は、↓
    シーケンス化オブジェクトの構築:O:5:SoFun:1:{S:7:"00*00 file";s:8:flag.php";バイパス_wakeup:O:5:"SoFun":2:{S:7:"\00*\00file";s:8:"flag.php";}