PHPでは、 Serialize関数がオブジェクトまたは配列を文字列に変換して簡単に保存または送信するために使用されることがよくあります。データをデータベースに保存する場合でも、ネットワーク上にデータを送信する場合でも、 Serializeは重要なツールです。この記事では、PHPのシリアル化機能がどのように機能するかを詳細に分析し、その基礎となる実装原則を明らかにします。
Serialize関数は、PHP変数を保存可能または転送可能な文字列に変換します。この関数の一般的な用途には次のものがあります。
配列またはオブジェクトを文字列に変換し、データベースに保存します。
特にキャッシュなどのシナリオでは、文字列として他のサービスにデータを転送します。
例えば:
$data = array("name" => "John", "age" => 30);
$serializedData = serialize($data);
echo $serializedData;
出力の結果は次のとおりです。
a:2:{s:4:"name";s:4:"John";s:3:"age";i:30;}
この結果から、 Serializeは特定の形式を介して配列をエンコードして、後で元の配列構造に復元できるようにすることがわかります。
PHPは特定の形式を使用してデータをシリアル化します。この形式には、データ型識別子とデータコンテンツが含まれます。異なるタイプのデータには異なる識別子があります。
A:配列
S:文字列
I:整数
B:ボレン
D:フローティングポイント
O:オブジェクト
たとえば、シリアル化された文字列A:2:{s:4: "name"; s:4: "john"; s: "age"; i:30;}は、 2つの要素を含む配列を表します。最初の要素は文字列名と対応する文字列値Johnで、2番目の要素は文字列年齢と整数値30です。
オブジェクトをシリアル化すると、 Serializeはオブジェクトのクラス名、属性、および属性値を一緒にシリアル化します。たとえば、次のコードを検討してください。
class Person {
public $name;
public $age;
}
$person = new Person();
$person->name = "John";
$person->age = 30;
$serializedPerson = serialize($person);
echo $serializedPerson;
出力は次のとおりです。
O:6:"Person":2:{s:4:"name";s:4:"John";s:3:"age";i:30;}
ここで、 O:6:「人」とは、クラス名が人であることを意味し、その後にクラス名と年齢の2つの属性が続き、その価値はそれぞれジョンと30です。
Serializeの関数は、データを文字列に変換することであり、 Unserialize関数はこの文字列を元のPHP変数に復元します。 Unserializeを介して、元のデータ構造を再ゲッジできます。
$originalData = unserialize($serializedData);
Unserializeを使用する場合、回復したデータ型と構造はシリアル化時間と一致している必要があり、そうでなければエラーを引き起こす可能性があることに注意してください。
データベースストレージでは、シリアル化および非正規化関数が非常に一般的です。たとえば、キャッシュシステムは、これら2つの関数を使用して複雑なデータ構造を保存することがよくあります。シリアル化により、複雑なデータ構造(配列やオブジェクトなど)を文字列に変換して、簡単に保存して送信できます。
PHPセッション管理は、セッションデータを保存するためにSerializeも使用します。 PHPは、セッション内のオブジェクトと配列を自動的にシリアル化して、異なるリクエスト間のセッションデータのステータスを維持します。
シリアル化および非正規化関数は多くのシナリオで非常に役立ちますが、特定の安全リスクもあります。特に、信頼されていないソースからデータを処理すると、セリール化機能がセキュリティの脆弱性を引き起こす可能性があります。たとえば、悪意のある構築されたデータを脱出すると、攻撃者がアプリケーションを操作できるコード実行の脆弱性がトリガーされる場合があります。
このタイプのリスクを回避するために、非顕性の2番目のパラメーターを使用して、脱出を許可するクラスを制限できます。例えば:
unserialize($data, ["allowed_classes" => false]); // オブジェクトの脱3を無効にします
または、データソースの信頼性をチェックすることにより、悪意のあるデータが非正規化に渡されないことを確認してください。
SerializeおよびUnserialize機能は、PHPで非常に重要な機能であり、データストレージ、セッション管理、その他のシナリオで広く使用されています。データを文字列形式に変換することにより、複雑なデータ構造を簡単に保存または転送できます。これら2つの機能の根底にある原則を理解することは、それらをよりよく活用し、潜在的なセキュリティの問題を回避するのに役立ちます。