にゃあ

register_globalの代替策としてextract

かならず、周期的に出てくる話題のひとつがregister_globalとextractの話。韓国でも今ホットな話題のようで、「register_global = offの代替策でextract($_GET)とかやったら、ひどい目に遭いました」という報告があがっています。スレッドを見てみると、こんなレスも...。

extract($_GET)は下手すると、$_SERVER['REMOTE_ADDR ']が上書きされちまうらしいぜ。
なんでも、$_GET['REMOTE_ADDR ']があると、改ざんの危険があるっぽい。

$_GET['REMOTE_ADDR '] がセットされた$_GETをextractしても$_SERVER['REMOTE_ADDR ']は上書きされず、$REMOTO_ADDRという変数ができるだけだと思うんだけどな~。

$_SERVERが上書きされるケースは、$_GET['_SERVER']があるとき。

だからextractは怖いんですよね。

XOOPSでもかつて盛り上がった話題でしたが、コアのあちこちでextract($_GET)をしていて、いったんextractが危ないと認知されるとextractは使わなくなったものの、 今度はforeach($_GET as $key => $value ) $key = $value;とかするようになったりしたことがありました。結局、extractをやめてもforeachで「展開」すればextractをしていることと同じです。楽な方法があると、やっぱり楽な方法でやってしまうのが人の常なのでしょうか。

でも、extract自体は決して危険な関数ではないと考えます。使い方さえしっかりしていれば、とても便利な関数です。私が使うときに漠然とですが注意しているのは、次の点でしょうか。

  • グローバールスコープの配列はextractしない。
  • extractがグローバルスコープの変数を生み出すときも使わない。
  • 配列の中身がある程度固定されているときに使う。
  • できるだけ他の変数に影響の出ない使い方をする。
    • extractは変数があれば上書きしないとか、接頭辞をつけるとかのオプションがあるので、それを利用する。
    • 処理の最初のうちにextractをやっておき、extractが上書きすることは避ける。

それでも、最近はやっぱりextractはあまり使わないようになってきています。それは、extractが危険だからとかいう考えではなく、extractを使うと、できあがったコードが読みにくいものになるという、書き方上の問題が出てきたからです。

extractたった一行で、いくつもの変数を一度に定義できてしまうので、その変数がどこからやってきたのかがたちまちに不明瞭になってしまいます。そのため、最近では、配列の要素が固定されているときは、ちくいち書くようにしています。コードの分量が増えても、そちらのほうがわかりやすいからです。

PHP6で、やっとregister_globalが廃止になるんで喜んでますが、register_global = On が前提のプログラムは対策し直しましょうみたいな雰囲気になって、知らずにextractがばんばん発動するんじゃないかと心配するところもあります。


コメント&トラバ

トラックバックを送る

無関係なスパムのトラックバックを防止するため、リンク先で本サイト(suin.asia)への言及が確認されないトラックバックは破棄しています。

トラバURL : http://suin.asia/trackback/128

コメントを書く

お名前* URL
本文*
合い言葉* ←「toeincojo」と入力して下さい。
* この記事の話題と関係ないコメントはどんな内容でも削除します。(移動できないので)

トラックバック

トラックバックがないのはさみしいにゃん…。

コメント

コメントはないです。誰かコメント書いてよぅ…。

このブログの著者


Suinと申します。

@suin on Twitter

サブメニュー

最近気になるモノ!

WindowsからMacに乗り換えて半年ですが、Macは細かいところまで丁寧に作られていて、親切なユーザーインターフェイスが気に入ってます。iMacはMagic Mouseと洗練されたデザインのBluetoothキーボードがついてくるので、お得だなあ、なんて思ってます。私に買ってもいいという方、いたら教えてください 笑。

最近のエントリ

XOOPS Cube Dev Ring

最近のコメント

最近のトラックバック

ひとりで喜ぶログ
デュラララに登場するチャットを再現した (04/09)
ひとりで喜ぶログ
デュラララに登場するチャットを再現した (03/28)
http://www15.atpages.jp/~classicalstudio/wordpress/?p=50
getcwd()とdirname(__FILE__)は違う結果になるときがある (12/22)
Re:
CSSのtext-align:center;は<div>には通用しない (12/15)
XOOPS専門-株式会社RYUS - d3blog
Shiori 1.02 (12/02)
9deMaio.com - blog
Koins 1.00 (11/11)
インターネット覚え書き「ビボウログ」
CSSのtext-align:center;は<div>には通用しない (09/16)
hinoeuma1966
CSSのtext-align:center;は<div>には通用しない (07/03)
Suin.org
ブログ作ってみた (03/23)
Suin.org
ブログ作ってみた (03/23)