ルール
回避 動的 変数 名
動的 変数 names (変数 変数) できる 導く
に 困難 維持 維持 コード し 予期せぬ 動作。
彼らの 使用 は 通常 結果 結果 の 誤字
サポート言語: PHPはじめに
PHPの可変変数機能により、ある変数の値を別の変数の名前として使用できます。 $$ 構文。一見すると便利なショートカットのように見えるものが、静的にどの変数が存在するか、あるいはそれらが何を保持しているかを判断できない場合、デバッグの悪夢となる。以下のようなコードを使用する $$userName 配列やオブジェクトのプロパティの代わりに使うと、IDEが自動補完を提供したり、静的解析ツールがバグを検出したり、開発者がアプリケーション内のデータフローを追跡したりできなくなる。
なぜそれが重要なのか
コードの保守性:可変変数は開発者が依存するあらゆるツールを破壊する。IDEは変数名の自動補完、使用箇所の検索、安全なリファクタリングを行えない。静的解析ツールは未定義変数や型不一致を検出できない。デバッグには実行時検査が必要となる。コードベースをgrepして変数が設定または読み取られる箇所を見つけることができないためだ。
セキュリティーへの影響: 変数名がユーザー入力から生成される場合、攻撃者はセキュリティ上重要な変数を含む任意の変数を上書きできる。悪意のあるリクエストパラメータは以下を標的とすることが可能である: $_GET['var'] 上書きする $isAdmin, $userIdまたはセッション変数。これにより、検出が困難で悪用されやすい変数注入の脆弱性が生じます。
パフォーマンスへの影響:変数変数は、コンパイル時のシンボル解決ではなく、PHPに実行時検索を強制します。インタプリタはアクセスごとに動的に変数名を評価する必要があり、通常の変数で機能する最適化を妨げます。配列やオブジェクトは同様の機能を提供しつつ、より優れたパフォーマンス特性を備えています。
コード例
非準拠:
function processFormData($formType) {
$userForm = ['name' => '', 'email' => ''];
$adminForm = ['name' => '', 'email' => '', 'role' => ''];
$formName = $formType . 'Form';
$$formName = array_merge($$formName, $_POST);
if ($$formName['email']) {
sendEmail($$formName['email']);
}
return $$formName;
}
// What variable does this actually use?
processFormData('user');
なぜそれが間違っているのか: コードは$userFormを作成するか、または $adminForm 動的に使用して フォーム名どの変数が変更されているのか追跡不可能になる。もし $formType ユーザー入力に由来するため、攻撃者は任意の変数名を注入して重要な変数を上書きできる。
✅ 準拠:
function processFormData(string $formType): array {
$forms = [
'user' => ['name' => '', 'email' => ''],
'admin' => ['name' => '', 'email' => '', 'role' => '']
];
if (!isset($forms[$formType])) {
throw new InvalidArgumentException('Invalid form type');
}
$form = array_merge($forms[$formType], $_POST);
if (!empty($form['email'])) {
sendEmail($form['email']);
}
return $form;
}
// Clear which data structure is being used
processFormData('user');
重要性:このコードは既知のキーを持つ明示的な配列を使用しているため、データフローが明確になり、すべてのIDE機能が利用可能です。入力検証によりインジェクション攻撃を防止でき、静的解析でコードの正しさを検証できます。
結論
変数変数は配列、オブジェクト、あるいはより優れたコード構造で置き換える。動的なキーアクセスが必要な場合は配列を、既知のプロパティを持つ構造化データにはオブジェクトを使用し、重複したロジックは適切な抽象化へリファクタリングする。変数変数はほぼ常に設計上の問題を示しており、適切なデータ構造を用いることでより明確に解決できる。
.avif)
