PHPのシリアル化関数は、PHPのデータ構造(配列やオブジェクトなど)を保存または転送できる文字列形式に変換するために使用されます。ただし、他の機能と同様に、 Serializeは使用するといくつかの警告とエラーに遭遇する場合があります。この記事では、シリアル化関数を使用する際の一般的な問題を調査し、それらを回避するための提案を提供します。
未定義のクラスを含むオブジェクトをシリアル化しようとすると、PHPはエラーをトリガーします。たとえば、次のコード:
class TestClass {
public $name = "GitBox";
}
$obj = new TestClass();
$serialized = serialize($obj);
echo $serialized;
このオブジェクトを後で脱必要にすると、PHPはクラスのテストクラスを定義する必要があります。そうしないと、エラーが発生します。具体的には、 TestClassクラスがコードで定義されていない場合、次のエラーが報告されます。
Warning: unserialize(): Error at offset 0 of 20 bytes in ...
このようなエラーを回避するには、関係するすべてのクラスが脱出前にロードまたは含まれていることを確認してください。降下前に、 SPL_Autoload_register関数を使用して、クラスファイルを自動的にロードできます。
spl_autoload_register(function ($class_name) {
include $class_name . '.class.php';
});
これにより、欠落しているクラスファイルが脱介入時に自動的にロードされることが保証されます。
PHPのリソース(データベース接続、ファイルハンドルなど)をシリアル化することはできません。リソースをシリアル化しようとすると、PHPは次のような警告を報告します。
Warning: serialize(): Type of property must be object or array in ...
たとえば、次のコードがこの警告を生成します。
$fp = fopen("file.txt", "r");
$serialized = serialize($fp); // リソースをシリアル化します
この警告を回避するには、シリアル化機能を使用するときに、シリアル化されたリソースタイプではなく、オブジェクトまたは配列であることを確認する必要があります。シリアル化前に変数タイプを確認できます。
if (is_resource($fp)) {
echo "リソースタイプをシリアル化できません";
} else {
$serialized = serialize($fp);
}
PHPは、シリアル化された閉鎖をサポートしていません(匿名関数)。閉鎖を含むオブジェクトまたは配列をシリアル化しようとすると、PHPはエラーをスローします。
Warning: serialize(): Error at offset 0 of 20 bytes in ...
例えば:
$func = function() {
echo "Hello World";
};
$serialized = serialize($func); // 閉鎖をシリアル化してみてください
アプリケーションが閉鎖機能を保存および転送する必要がある場合は、閉鎖を文字列に変換するか、閉鎖のコードを保存したり、閉鎖を再生したりするなど、他のメソッドを使用することを検討してください。
$closure_code = 'function() { echo "Hello World"; }';
$serialized = serialize($closure_code); // 閉鎖を保存するコード
特に、信頼できないソースからの脱色コンテンツが来る場合、脱力化操作は深刻なセキュリティの脆弱性につながる可能性があります。攻撃者は、攻撃化を使用して任意のコードを実行し、セキュリティの脆弱性を引き起こす場合があります。これを避けるために、次の警告がPHPに表示されることがあります。
Warning: unserialize(): Argument is not a valid serialized string in ...
信頼できる情報源からのデータのみをaserializeします。
json_encodeとjson_decodeを使用して、JSON形式のデータがより安全であり、脱出のセキュリティの問題を引き起こさないため、 Serialize and Unserializeを置き換えます。
Serializeが必要な場合は、脱irezizedデータが検証されていることを確認する必要があります。 hash_hmacなどの関数を使用して、データの整合性を確保できます。
非常に大きなデータ構造の場合、シリアル化はパフォーマンスの問題を引き起こす可能性があります。シリアル化プロセスが多数の文字列を作成し、特にメモリが制約された環境で、メモリ消費が増加するためです。
データ構造を分析して、あまりにも大きなデータ構造を渡してシリアル化しないようにします。
データベースを使用して大きなオブジェクトを保存し、メモリに一度にロードすることを避けないでください。
データベースまたはキャッシュシステム(Redisなど)を使用して、大規模なデータストレージと転送を処理します。
上記の提案に従うことにより、PHP Serialize関数を使用してコードの安定性とセキュリティを確保する場合、一般的なエラーや警告を回避できます。この記事があなたを助けることを願っています!