XOOPSに限らず、Webアプリケーションのエラー処理で、リダイレクトを用いるケースが多く見られますが、これは本当に正しいでしょうか?
もちろん、POSTデータを処理した後のリダイレクトには意味があります。ブラウザの「戻る」ボタンとフレンドリーになりますし、正常な処理ですから、リダイレクト画面(header('Location:...')ではなくmetaでリフレッシュするタイプ)のメッセージが読めなくても、さほど問題になりません。
しかし、エラー処理において、リダイレクトするのはどうでしょうか?
そのエラーが、通常の操作において頻繁に起きうるものであればともかく、通常あり得ない値が渡されたケースなどにおいては、die()でさっさと終了すべきでしょう。これは、製作者にとって楽、というだけでなく、善意の利用者にとってもメリットがあります。なんらかの理由でエラーになったとしても、エラーメッセージをじっくり読めますし、どこだか判らないページに飛ばされる実行時間がなくなるだけでもありがたいでしょう。
また、エラー処理のリダイレクトによる無限ループもありえます。通常のブラウザであれば正常なリダイレクトになっているのに、一部の翻訳サイトを経由した場合にだけ、無限ループになる、という現象も見つかっています。(もちろんこれは、その翻訳サイトの問題ではありますが、それらによって食いつぶされてしまう負荷は無視できないでしょう)
もちろん、ブラウザで戻ることを禁止するタイプのガチガチなアプリケーションもあるでしょうから、一概には言えませんが、基本的にはリダイレクトよりdie()を先に検討すべきだと私は考えます。
ここに来て立て続けに、アップロードされたzipファイルを解凍した中身を反映するコードを書いてきましたが、実のところ、これらで利用している PEAR::Archive_Zip には、穴があります。
それは具体的には以下の2点です。
(1) ファイルシステムに解凍すると、Directory Traversalがある
(2) 解凍処理でメモリをすべて食いつぶすようなzipファイルが簡単に作成可能である
このうち、(1)に対しては明確な対応策があります。ファイルシステム上に解凍しなければ良いのです。
$reader = new Archive_Zip( (アップロードテンポラリファイル) ) ;
$files = $reader->extract( array( 'extract_as_string' => true ) ) ;
2つ前記事
前記事
プログラミング解説書籍の脆弱性をどうするか
私自身、3日くらい前に教えていただいたのですが、どうやら、前の記事を書いた1/21の当日に高木氏からコメントを頂戴していたとのこと。ずいぶんとすぐに見つけていただき、恐縮至極です。とても良いお仕事なのでしょうね。
しばらく日記をちゃんと書けそうにない
さきほどざっと読ませていただきましたが、予想していたほどの量ではなく、また、こんな大嘘がまかり通っては困るので、当初予定していた「『サニタイズ言うなキャンペーン』の嘘」の前に先んじて一通りのコメントをつけておきます。
前記事
プログラミング解説書籍の脆弱性をどうするか
高木氏が12/27のブログエントリで書かれた、拙著「PHPサイバーテロの技法」に対する批判は大きく2点に分けられると思います。
(1) 「サイバーテロ本」では、その場しのぎ的な「サニタイズ」を行うコーディングを推奨している
(2) 「サニタイズ言うなキャンペーン」
拙著「PHPサイバーテロの技法」に脆弱性がある、という高木浩光氏のブログがあります。
最初ざっと見たときには、「どんな書籍でも悪意を持って読めば叩き方はいくらでもあるのだな」くらいにしか思っていなかったのですが、他の方のサイトのブログなどを読むと、結構引用されていることが多く、あらためて読んでみたところ、事実として、拙著の記述にミスがあったので、まずはそのことについて書きます。