PHPでは、通常、PHP変数を文字列に変換して保存または転送するために、シリアル化および非正規化関数が使用されます。どちらも開発プロセスで非常に役立ちますが、見つけにくいエラーもいくつか導入する可能性があります。これらのエラーをデバッグするときは、問題を見つけるのに役立つヒントが必要です。この記事では、いくつかの一般的なエラーとそのソリューションを紹介し、これらの機能を効果的にデバッグする方法について導きます。
Serialize関数は、PHP変数を文字列に変換します。これは、 Unserialize関数を介して元のPHP変数に復元できます。 Serializeの後のデータが正しくない場合、 Unserializeは元のデータを正しく回復せず、警告を投げることさえあります。
$myData = array('name' => 'John', 'age' => 30);
$serializedData = serialize($myData);
// シリアル化されたデータを手動で改ざんします
$serializedData = substr($serializedData, 0, 20);
$unserializedData = unserialize($serializedData);
データの整合性を確認する:保存または転送時に、シリアル化されたデータが切り捨てられたり破損したりしないことを確認してください。
シリアル化されたデータを印刷および記録する: Var_DumpまたはEchoを使用して、シリアル化されたデータを出力して、予想される形式を満たしているかどうかを確認します。
var_dump($serializedData);
シリアル化されたデータが予期せず変更されている場合、データの整合性を確保することができます(ハッシュやチェックサムの使用など)データを検証および検証することができます。
Unserializeを使用すると、予期しないデータ型が表示される場合があります。たとえば、シリアル化されたオブジェクトが非適切であるときに正しくロードされない場合、 nullまたは誤ったタイプの値が返される場合があります。
class User {
public $name;
}
$serializedData = serialize(new User());
$unserializedData = unserialize($serializedData);
var_dump($unserializedData); // 予想される User 物体,しかし、戻るかもしれません NULL
クラスが読み込まれているかどうかを確認します。オブジェクトのゆったりとした問題に遭遇した場合、最初に対応するクラスがロードされているかどうかを確認します。
class_exists() and method_exists()を使用してください。脱必要なクラスがPHPで定義され、正しくインスタンス化できることを確認してください。
if (!class_exists('User')) {
echo "親切 User 未定義";
} else {
$unserializedData = unserialize($serializedData);
var_dump($unserializedData);
}
SPL_AUTOLOAD_REGISTER()を使用して、降下オブジェクトのクラスが正しくロードされるか、動的にロードされていることを確認してください。
PHP 5.3以降では、 Unserialize()関数の2番目のパラメーターを使用して、脱色クラスを制限してセキュリティを強化できます。
$unserializedData = unserialize($serializedData, ["allowed_classes" => ["User"]]);
スターリア化操作にはセキュリティリスクがあり、悪意のあるシリアル化データは、特にデータが適切に検証されていない場合、コード実行の脆弱性につながる可能性があります。攻撃者は、シリアル化されたデータを改ざんして、悪意のあるコードを実行しようとすることができます。
$maliciousData = 'O:4:"User":1:{s:4:"name";s:4:"evil";}';
$unserializedData = unserialize($maliciousData);
データソースの確認:データのソースを常に脱却する前に検証し、データが信頼できるソースからのものであることを確認してください。
ホワイトリストメカニズムを使用します。Aldoct_Classesパラメーターを設定することにより、脱介入中に特定のクラスのみが脱必要にされることを確認してください。
asold_classes of unserialize()のパラメーターを使用して、特定のクラスのみを脱必要として制限します。
PHPオブジェクトを直接シリアル化する代わりに、データ転送にJSON形式を使用して、脱出攻撃のリスクを減らすことを検討してください。
$unserializedData = unserialize($maliciousData, ["allowed_classes" => ["User"]]);
開発中に、シリアル化の問題をより効率的にデバッグし、より効率的に解決するために使用できるツールとトリックがあります。
シリアル化されたデータをログファイルにログに記録することにより、何か問題が発生したときに元のデータをバックビューできます。
file_put_contents('serialize_log.txt', $serializedData . PHP_EOL, FILE_APPEND);
シリアル化と脱登り関連コードの単位テストを作成して、データを正しくシリアル化して脱介入し、例外をキャッチできるようにします。
public function testSerialization() {
$data = array('name' => 'John', 'age' => 30);
$serializedData = serialize($data);
$this->assertNotEmpty($serializedData);
$unserializedData = unserialize($serializedData);
$this->assertEquals($data, $unserializedData);
}
var_dumpは、変数の詳細なタイプと内容を表示できる強力なデバッグツールであり、問題を迅速に特定するのに役立ちます。
var_dump($unserializedData);
シリアル化および非正規化のエラーをデバッグする場合、複数の観点から問題を考慮する必要があります。データ形式が完成したかどうか、クラスが正しくロードされているかどうか、データが改ざんされているかどうかなど、厳格なデータ検証、適切なセキュリティ対策により、これらの一般的なエラーを効果的に削減し、修正することができます。
この記事が、PHPでシリアル化を扱ったり、安全でないことを扱うときに、より便利になるのに役立つことを願っています。