PHPのserialize/unserialize関数は安全なデータストレージなどにPHP変数を保存する為に利用します。一旦、外部に保存されたデータ($_POST、$_GET、$_COOKIEなど)は改ざんされ、unserialize時に不正なデータとなっている可能性があります。この結果、不正な値に改ざんされたり、不正なオブジェクトを注入されたり、メモリ管理の不具合(解放済みアドレスの利用など)による任意コード実行が行われたりします。
$mydata = unserialize($_GET['mydata']);
JSONを利用する場合、不正なオブジェクトの注入は不可能になり、メモリ管理の不具合のリスクはほぼ無くなります。
$mydata = json_decode($_GET['mydata']);
HMACやHKDFで改ざんされていないこと検証している場合、信頼可能である。
if ($_GET['mac'] && $_GET['mac'] === hash_hmac('sha3-512', $_GET['mydata'], $_SESSION['hmac_key']) { throw new Exception('$_GET[mydata] is modified by user'); } $mydata = json_decode($_GET['mydata']);
この例の場合、HMACで改ざんを検出しているので不正なデータやオブジェクト、攻撃用データが挿入されていないことを保証できる。
[ルール/推奨事項の例外]
[ルール/推奨事項のリスク評価]
[評価例 - 英語表記に統一]
| Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
|---|---|---|---|---|---|
| IDS05-J | medium | unlikely | medium | P4 | L3 |