サニタイズしてください(サンプルでも)

8/13現在、記事が改訂されて以下の脆弱性は取り除かれている模様。



ちょっとまずいんじゃないかなぁ
http://codezine.jp/a/article.aspx?aid=104
軽量なMVCフレームワークの自作 [初級〜中級] 手軽に利用できるMVCフレームワークの作成

/**
 * 永続オブジェクトの保持する値からform内に埋め込むhiddenなinputタグの集合を生成
 * <pre>
 * $_mode='form'の場合、永続オブジェクトを維持する為に、
 * 永続オブジェクトの保持する値を、hiddenなinputタグとして、
 * 送出するページのform内に埋め込む必要がある
 * そのタグを文字列として生成する
 * 1time値は対象外とする
 * </pre>
 * @return string form内に埋め込むhiddenなinputタグの集合
 **/
    function createHiddenInput() {
        if($this->_mode != 'form')
            return '';
        $ret = '';
        foreach($this->_session as $key => $value)
            if(!preg_match("/^{$this->_ot_head}/", $key))
                $ret .= "<input type='hidden' name='$key' value='$value'>";
        return $ret;
    }

/**
 * 永続オブジェクトの保持する値からURL引数を生成
 * <pre>
 * 1time値は対象外とする
 * </pre>
 * @return string URL引数
 **/
    function createURLString() {
        $ret = '';
        foreach($this->_session as $key => $value)
            if(!preg_match("/^{$this->_ot_head}/", $key))
                if(strpos("&$key=$value", ' ') === false)
                    $ret .= "&$key=$value";
        return substr($ret, 1);
    }

この仕組みによって、情報の引き継ぎが、セッション変数なしに実現できます。ただし、全ての情報がブラウザに送出されるため、セキュリティ上は好ましくありません。

$this->_session に詰め込んだセッション情報をcookieなしでやりとりする場合の説明、なんだけど。いや、セキュリティー上まずいのは「全ての情報がブラウザに送出されるため」だけじゃないぞ!

  • value に htmlタグみたいなのを入れることもあるし、valueに&が入ることもあるし。もしかするとkeyにも。両方とも、htmlspecialchars や ulrencode をかけないとまずくない? クロスサイトスクリプティング問題が!
  • value に配列とか入れた場合のことが考慮されていない。オブジェクトの復元は可能かどうか微妙という問題があるけど、配列はserializeとかすれば可能なんだからしたほうがいいと思う。

サンプルだから、とかのいいわけはダメだと思う(やむを得ない場合でも「紙面の関係でサンプルコード中はサニタイズを省いています」とかの言い訳が、絶対その場に必要)。特に初心者向け、と書いてある記事においては。
こういうコードを説明に出している時点でこの人の書いているコードを使う気になれない。サニタイズは当たり前の物として身に付いていない人のコードを利用する場合、どこにこの手の問題が潜んでいるかかわからないから。安全のためにコードのすべてを見直す必要が出てくる。


ちなみに全体をダウンロードするためには登録が必要と言われたので全体をダウンロードはしていません。もしかしたらライブラリ本体ではサニタイズされているのかもしれません。