PHP開発では、 Serialize()関数を使用して、データ構造(配列やオブジェクトなど)を文字列に変換して簡単に保存または送信します。ただし、ファイルのアップロードと組み合わせて使用すると、特に脱必要なデータの場合、ケアが不十分なケアはセキュリティの脆弱性につながる可能性があります。この記事では、ファイルアップロードシナリオでSerialize()関数を安全に使用し、ベストプラクティスに従う方法について説明します。
PHPのSerialize()関数は、PHP値(配列、オブジェクトなど)を保存または転送できる文字列形式に変換します。例えば:
$data = ['username' => 'admin', 'password' => '12345'];
$serialized_data = serialize($data);
echo $serialized_data;
出力は次のとおりです。
a:2:{s:8:"username";s:5:"admin";s:8:"password";s:5:"12345";}
比較的、 unserialize()は、 serialize()からphp値に戻る文字列出力を変換するために使用されます。ファイルアップロードのプロセス中に、ファイルデータを特定の形式のファイルに保存します。たとえば、 Serialize()を介してファイルによってアップロードされた情報を保存します。
ファイルアップロード機能があるとします。ユーザーは、ファイルをアップロードして、 serialize()を介して関連情報を保存できます。単純なファイルアップロードコードは次のとおりです。
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
$file = $_FILES['file'];
$file_data = [
'filename' => $file['name'],
'filetype' => $file['type'],
'filesize' => $file['size'],
'filetmp' => $file['tmp_name']
];
// 使用 serialize() ファイル情報を保存します
$serialized_data = serialize($file_data);
file_put_contents('uploads/file_info.txt', $serialized_data);
}
脱力化(つまり、 unserialize() )は、特に攻撃者が悪意のあるコードを実行したり、データの整合性を損傷する可能性がある攻撃的なデータを操作できる場合、いくつかのリスクを引き起こす可能性があります。たとえば、攻撃者は、悪意のあるPHPオブジェクトまたはコードを含む慎重に構築されたシリアル化データをアップロードできます。
脱介入のセキュリティを確保するために、いくつかのベストプラクティスを次に示します。
機密情報(パスワード、APIキーなど)をシリアル化して、Serialize ()を介して保存しないでください。この情報は、常に暗号化された形式に保存する必要があります。
ファイルをアップロードするときは、ファイルの種類とファイルサイズを確認して、悪意のあるファイルのアップロードを避けてください。 $ _files ['file'] ['type']および$ _files ['file'] ['size']を使用して、ファイルの種類とサイズを決定できます。
if ($file['size'] > 5000000) {
echo "ファイルが大きすぎる";
exit;
}
$allowed_types = ['image/jpeg', 'image/png'];
if (!in_array($file['type'], $allowed_types)) {
echo "サポートされていないファイルタイプ";
exit;
}
PHPを使用すると、脱色時にオブジェクトを作成できます。クラスの使用が制限されていない場合、攻撃者は悪意のあるオブジェクトを渡すことができます。これにより、危険なコードの実行がトリガーされます。 Aloction_Classesパラメーターを設定することにより、悪意のあるクラスの脱必要なことを防ぐことができます。
$data = file_get_contents('uploads/file_info.txt');
$file_data = unserialize($data, ["allowed_classes" => false]); // オブジェクトの作成を無効にします
この動きは、攻撃者が脱必要な脆弱性を使用して悪意のあるコードを実行することを効果的に妨げる可能性があります。
アップロードされたデータの整合性を確保するために、ハッシュ値(MD5、SHA256など)を使用して、アップロードされたファイルデータを確認できます。ファイルがアップロードされると、ハッシュが生成され、実際のファイルのハッシュと比較されるため、改ざんは回避されます。
$uploaded_hash = hash_file('sha256', $file['tmp_name']);
$stored_hash = file_get_contents('uploads/file_hash.txt');
if ($uploaded_hash !== $stored_hash) {
echo "ファイルコンテンツに改ざんされています";
exit;
}
ファイルアップロード自体も攻撃の入り口になる場合があります。ファイルの種類とサイズの確認に加えて、悪意のあるファイルのアップロードを防ぐには、ユーザーが実行可能なPHPファイルのアップロードを防ぐために測定する必要があります。たとえば、 .phpや.exeなどのファイルタイプのアップロードは禁止されているか、実行されていないディレクトリにアップロードされたファイルを保存します。
$disallowed_extensions = ['php', 'exe'];
$file_extension = pathinfo($file['name'], PATHINFO_EXTENSION);
if (in_array(strtolower($file_extension), $disallowed_extensions)) {
echo "このファイルタイプは禁止されています";
exit;
}
ファイルとデータを安全な場所に保存し、アップロードされたファイルが適切に分離され、保護されていることを確認します。ファイルデータ全体のシリアル化結果を保存する代わりに、データベースを使用して、アップロードされたファイル(ファイルパス、ハッシュなど)のメタデータを保存できます。
Serialize()関数をファイルアップロード機能と組み合わせる場合、セキュリティの問題に注意する必要があります。降下攻撃、ファイルの種類とサイズの確認、ファイルストレージ方法などの要因はすべて、開発プロセス中に厳格な設計と保護が必要です。ベストプラクティスを使用することにより、ファイルアップロードのセキュリティを確保することができ、悪意のあるユーザーが脆弱性を活用することを妨げます。
上記は、PHPでSerialize()関数を安全に使用し、ファイルアップロードと組み合わせる方法のベストプラクティスです。ご質問がある場合は、お気軽にお問い合わせください!