PHPセッションは、一意のセッションIDを使用してサーバー上のユーザーデータを保存します。ユーザーがリクエストを行うたびに、PHPはセッションIDを探し、対応するセッションデータをロードします。データは通常、 $ _Session Hyperglobal変数を介してアクセスされます。
PHPは、シリアル化関数を内部的に自動的に使用して、オブジェクトや配列などのデータを文字列ストレージに変換し、 Unserialize関数を使用して元のデータ型に復元します。
ただし、これらのシリアル化されたデータに直接アクセスしたり、手動で処理したりする場合があります。また、非正規機能が特に重要になります。
Unserialize関数は、シリアル化された文字列をPHP変数に変換するために使用されます。
<span><span><span class="hljs-keyword">mixed</span></span><span> </span><span><span class="hljs-title function_ invoke__">unserialize</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$data</span></span><span> [, </span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$options</span></span><span> = [] ] )
</span></span>$ data :deserializeする文字列。
$オプション:追加の敏arialization化制御(PHP 7+サポート)を提供するオプションのパラメーター。たとえば、脱出を許可するクラスを指定できます。
成功したときに脱介入変数を返し、障害時にfalseを返します。
基本的なユーザー情報を含むユーザーオブジェクトがあるとします。オブジェクトを手動でシリアル化し、セッションに保存します。
<span><span><span class="hljs-title function_ invoke__">session_start</span></span><span>();
</span><span><span class="hljs-comment">// ユーザーオブジェクトを作成します</span></span><span>
</span><span><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span> </span><span><span class="hljs-title">User</span></span><span> {
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-variable">$name</span></span><span>;
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-variable">$email</span></span><span>;
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">__construct</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$name</span></span></span><span>, </span><span><span class="hljs-variable">$email</span></span><span>) {
</span><span><span class="hljs-variable language_">$this</span></span><span>->name = </span><span><span class="hljs-variable">$name</span></span><span>;
</span><span><span class="hljs-variable language_">$this</span></span><span>->email = </span><span><span class="hljs-variable">$email</span></span><span>;
}
}
</span><span><span class="hljs-comment">// ユーザーオブジェクトをインスタンス化します</span></span><span>
</span><span><span class="hljs-variable">$user</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">User</span></span><span>(</span><span><span class="hljs-string">'John Doe'</span></span><span>, </span><span><span class="hljs-string">'[email protected]'</span></span><span>);
</span><span><span class="hljs-comment">// ユーザーオブジェクトをシリアル化して保存します session</span></span><span>
</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'user_data'</span></span><span>] = </span><span><span class="hljs-title function_ invoke__">serialize</span></span><span>(</span><span><span class="hljs-variable">$user</span></span><span>);
</span></span>上記のコードでは、ユーザークラスを作成し、ユーザーオブジェクトJohn Doeをシリアル化し、 $ _Session ['user_data']に保存します。
セッションにデータが保存されると、後続のリクエストでデータを回復できます。 Unserialize機能を通じて、セッションに保存されているシリアル化データを元のオブジェクトフォームに復元できます。
<span><span><span class="hljs-title function_ invoke__">session_start</span></span><span>();
</span><span><span class="hljs-comment">// 診る session 何かありますか 'user_data' データ</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'user_data'</span></span><span>])) {
</span><span><span class="hljs-comment">// 敏arialialiation session データ</span></span><span>
</span><span><span class="hljs-variable">$user</span></span><span> = </span><span><span class="hljs-title function_ invoke__">unserialize</span></span><span>(</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'user_data'</span></span><span>]);
</span><span><span class="hljs-comment">// 出力ユーザー情報</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Name: '</span></span><span> . </span><span><span class="hljs-variable">$user</span></span><span>->name . </span><span><span class="hljs-string">'<br>'</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Email: '</span></span><span> . </span><span><span class="hljs-variable">$user</span></span><span>->email . </span><span><span class="hljs-string">'<br>'</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'No user data found in session.'</span></span><span>;
}
</span></span>このコードでは、最初に$ _Session ['user_data']が存在するかどうかを確認します。存在する場合、 Unserialize機能を使用してユーザーオブジェクトに復元し、そのオブジェクトのプロパティを出力します。
Unserialize機能を使用する場合、セキュリティの問題に特別な注意を払う必要があります。特に、信頼されていないソースからのデータの脱必要なデータは、オブジェクト噴射攻撃につながる可能性があります。これにより、攻撃者は悪意のあるシリアル化データを構築することにより、危険な操作を実行できます。したがって、非正検入を使用するときにそのような問題を回避するためにセキュリティ対策を追加することをお勧めします。
PHP 7+では、 Aloct_Classesオプションを設定することにより、脱色クラスを制限できます。たとえば、制限はユーザーのクラスのみを脅かすことができます。
<span><span><span class="hljs-variable">$options</span></span><span> = [</span><span><span class="hljs-string">'allowed_classes'</span></span><span> => [</span><span><span class="hljs-string">'User'</span></span><span>]];
</span><span><span class="hljs-variable">$user</span></span><span> = </span><span><span class="hljs-title function_ invoke__">unserialize</span></span><span>(</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'user_data'</span></span><span>], </span><span><span class="hljs-variable">$options</span></span><span>);
</span></span>このようにして、他のクラスがブロックされる一方で、ユーザークラスのオブジェクトのみを降下できます。
Unserializeは、交差バージョンまたはサーバーのPHP環境で互換性の問題を経験する場合があります。たとえば、クラスが異なるバージョンで変更された場合、脱出は失敗する可能性があります。この問題を回避するために、開発者は特に単純なデータ構造が関与している場合、 JSON_ENCODEおよびJSON_DECODEを代替として使用できます。