文字エンコーディング検証は必須らしい

らしいです。

これからのプログラムの作り方 - 文字エンコーディング検証は必須

mb_check_encoding関数が使えるのはPHP 4.4.3以降らしいので、それ以前の場合はmb_convert_encoding関数を使用すれば良い模様。
mb_convert_encoding関数を使用し、変換前と変換後の文字エンコーディングに同じ文字エンコーディングを指定し、変換前と変換後の文字列に変化があるかを確かめる事により不正な文字エンコーディングを検出できます。

けど、UTF8だと同じUTF8でも違う結果を出力する場合も有るんだよなあ。
ハイフンとかその辺りだった気がするが・・・。

まあ、その辺はセキュリティとのトレードオフってことになるんだろうね。

※2008/09/02追記
Ethna 2.5.x用のプラグインを作ってみた。
エラーメッセージの英語に自信ないけど、その辺はご愛嬌で。

app/plugin/Validator/Hoge_Plugin_Validator_Charenc.php

class Hoge_Plugin_Validator_Charenc extends Ethna_Plugin_Validator
{
    /** @var    bool    配列を受け取るかフラグ */
    var $accept_array = false;

    /**
     *   文字エンコーディングのチェックを行う
     *
     *  @access public
     *  @param  string  $name       フォームの名前
     *  @param  mixed   $var        フォームの値
     *  @param  array   $params     プラグインのパラメータ
     */
    function &validate($name, $var, $params)
    {
        $true = true;
        $type = $this->getFormType($name);
        if (isset($params['charenc']) == false || $this->isEmpty($var, $type)) {
            return $true;
        }

        // define call back function for array_walk()
        if (function_exists('mb_check_encoding')) {
            // mb_check_encoding exists. just use it
            if (!mb_check_encoding($var, mb_internal_encoding()) {
                if (isset($params['error'])) {
                    $msg = $params['error'];
                } else {
                    $msg = _et('Please input character string
                                of correct character encoding to {form}.');
                }
                return Ethna::raiseNotice($msg, E_FORM_ENCORDING_STRING));
            }
        } else {
            // mb_check_encoding does not exist. use mb_convert_encoding()
            $val = mb_convert_encoding($var, $encoding, $encoding);
            if (!($val === $this->form_vars[$name])) {
                if (isset($params['error'])) {
                    $msg = $params['error'];
                } else {
                    $msg = _et('Please input character string
                                of correct character encoding to {form}.');
                }
                return Ethna::raiseNotice($msg, E_FORM_ENCORDING_STRING));
            }
        }

        return $true;
    }
}

あと、エラーコードも追加。
Hoge_Error.php

define('E_FORM_ENCORDING_INVALID', 301);

一回も動かしてないけど、こんな感じでいけるかな?
なるべく上の方に持っていけば、そのタイミングでチェックしてくれると思うけど、typeが一番最初に来てしまうことも注意。
きになるなら、そこまで手を加える必要がある。

コメント

アーカイブ

2012

  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
  • 09
  • 10
  • 11
  • 12

2011

2010

2009

2008

2007

コンタクト

longkey1[at]gmail[dot]com