らしいです。
これからのプログラムの作り方 - 文字エンコーディング検証は必須
mb_check_encoding関数が使えるのはPHP 4.4.3以降らしいので、それ以前の場合はmb_convert_encoding関数を使用すれば良い模様。
けど、UTF8だと同じUTF8でも違う結果を出力する場合も有るんだよなあ。
ハイフンとかその辺りだった気がするが・・・。
まあ、その辺はセキュリティとのトレードオフってことになるんだろうね。
※2008/09/02追記
Ethna 2.5.x用のプラグインを作ってみた。
エラーメッセージの英語に自信ないけど、その辺はご愛嬌で。
あと、エラーコードも追加。
一回も動かしてないけど、こんな感じでいけるかな?
なるべく上の方に持っていけば、そのタイミングでチェックしてくれると思うけど、typeが一番最初に来てしまうことも注意。
きになるなら、そこまで手を加える必要がある。
これからのプログラムの作り方 - 文字エンコーディング検証は必須
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が一番最初に来てしまうことも注意。
きになるなら、そこまで手を加える必要がある。
コメント