====== データ型を指定する場合はデータの表現可能範囲に注意する ====== PHPの関数/メソッドにはタイプヒントが利用できる。PHP 7.0からスカラー型(整数型、浮動小数点型、リソース型、論理型)と配列型のタイプヒントサポートが追加された。PHPのint型は環境によって大きさが異る。32ビットOSでは符号付き32ビット整数、64ビットOSでは符号付き64ビット整数((PHP 7.0未満のWindows環境では64ビットOSでも32ビット整数))となり、int型には注意が必要である。 float型(倍精度浮動小数点 - 符号付き53ビット整数まで正確)や符号付き64ビット整数、任意精度の整数が、符号付き32ビット整数に丸められる。2^31を超えるデータベースのレコードIDが処理できない、などの問題が発生しシステムが動作しなくなったり、演算結果が不正となる問題が発生する。 データベーステーブルのレコードIDは文字列型でも問題なく処理できる。テキスト形式で取り扱うデータ(データベースの値、XMLやJSONの値)は不用意に「整数形式だらint型」を指定すると問題が発生する。特にポータブルなコードを書く場合に重要である。 ===== 非適合コード例 ===== ===== 適合コード例(String type) ===== 100) { throw new Exception('Invalid integer format'); } // Validate $_GET['id'] contains only 0 to 9 chars if (strspn($_GET['id'], '0123456789') !== strlen($_GET['id'])) { throw new Exception('Invalid integer format'); } $ret = findRecord($_GET['id']); ?> タイプヒントを利用しないという選択肢も有りえるが、この場合$idは配列型なども許可してしまう。string型に限定することにより、他のデータ型が渡されるリスクは低減する。 ===== 例外 ===== 64ビット整数をサポートする環境でのみ動作すれば良い場合、64ビット整数をサポートしない場合に動作しないコードにする。 if (PHP_INT_SIZE !== 8) { throw new Exception('System does not support 64 bit integer'); } ===== リスク評価 ===== システムが動作しなくなったり、演算結果が不正となる場合はテストでは判明しない可能性が高い。 ^ Rule ^ Severity ^ Likelihood ^ Remediation Cost ^ Priority ^ Level ^ | IDS05-J | high | likely | low | P4 | L3 | ===== 関連ガイドライン ===== ===== 参考文献 =====