送信データ(例:$_GET、$_POST)に対して extract() を呼び出すのはなぜ危険で悪い習慣なのでしょうか?質問する

送信データ(例:$_GET、$_POST)に対して extract() を呼び出すのはなぜ危険で悪い習慣なのでしょうか?質問する

最近読んでいたこのスレッド、いくつかの最悪の PHP プラクティスについて。2 番目の回答では、 の使用に関する短い議論がありますextract()が、私は一体何についてそんなに騒いでいるのか疑問に思っています。

$_GET私は個人的に、やなどの特定の配列を分割するためにこれを使用し、$_POST後で変数に便利な名前が付けられているため、その変数をサニタイズします。

これは悪い習慣でしょうか? ここでのリスクは何でしょうか? の使用についてどうお考えですかextract()?

ベストアンサー1

これは、将来のメンテナー (または数週間後のあなた自身) がどこから来ているのかわからないような変数が多数発生する可能性があるという点でのみ、悪い習慣であると私は考えています。次のシナリオを考えてみましょう。

extract($someArray); // could be $_POST or anything

/* snip a dozen or more lines */

echo $someVariable;

どこ$someVariableから来たのか?どうすればわかるのか?

変数が最初にあった配列内から変数にアクセスすることに問題はないと思うので、良いケースを提示する必要があるでしょう。のためにextract()私にとっては価値があると思います。余分な文字を入力するのが本当に心配な場合は、次のようにしてください。

$a = $someLongNameOfTheVariableArrayIDidntWantToType;

$a['myVariable'];

ここでのセキュリティ面に関するコメントは、やや誇張されていると思います。この関数は、2 番目のパラメータを取ることができ、これによって、既存の変数を上書きしない ( EXTR_SKIP)、既存の変数のみを上書きする (ホワイトリストを作成できる) ( EXTR_IF_EXISTS)、変数にプレフィックスを追加する ( EXTR_PREFIX_ALL) など、新しく作成された変数をかなり適切に制御できます。

おすすめ記事