[PHP-dev 1338] mb_check_encoding() のテスト(Re: [PHP-doc 658] Re: mbstring の新関数のマニュアルについて)

komura komura @ ma9.seikyou.ne.jp
2006年 9月 24日 (日) 11:38:00 JST


komura です。

話題が php-doc ではないような気がしますので、php-dev に移動します。

On Thu, 21 Sep 2006 14:19:46 -0900
Rui Hirokawa <rui_hirokawa @ ybb.ne.jp> wrote:

> >> mb_check_encoding()を引数なしで起動すると,リクエスト開始時から関数実行
> >> までに,不正にエンコーディンされた文字が1文字以上あった場合にfalse,
> >> それ以外の場合に,trueを返します。
> >> これは,入力の自動エンコーディング変換やmb_convert_variables()を使用する
> >> 場合を想定しています。

...

> >> ただし,エンコーディングの自動検出等で失敗したケースなどを想定すると,
> >> 攻撃の誤検出が予想され,テストも不十分なままとなっていました。
> >>
> >> きちんとテストケースとか書かないとだめですね。。。
> > 
> > もし、必要でしたら何かお手伝いさせていただきます。
> > 
> 
> ありがとございます。
> 
> 具体的なテスト仕様の策定作業にまだかかっていないのですが,例えば,
> POST/GET/COOKIEに経由で不正にエンコーディングされた文字を挿入した入力を
> 行い,
> 1.mb_get_info('illegalchars')で文字数を検出できるか
> 2.mb_check_encoding()でtrue/falseを正しく検出できるか
> 3.複数のリクエストを繰り返した時に上記の動作がリセットされるか
> を確認して頂けるとありがたいです。

簡単にではありますが、テストしてみました。
環境は Gentoo Linux 上でコンパイルした PHP 5.2.0RC4 です。

1. 不正文字数の数値がいくつであれば正しい検出ができたと言えるのかに
   ついては分かりませんが、mb_get_info( 'illegal_chars' ) で不正な文字数
   の検出はできました。

2. mb_convert_variables() を使用した後に mb_check_encoding() を使用すると、
   正しく true/false による判定ができました。

   問題は、mbstring.encoding_translation が有効になっている場合の自動変換
   なのですが、不正なエンコーディングと思われる値を入力しても、
   mb_check_encoding() 「引数なし」では検出されません。
   mb_get_info( 'illegal_chars' ) も 0 を返します。

   この件はテストに十分な時間が取れなかったような気もしますし、私の
   環境のせいかもしれません。他の方にもテストしていただいた方が良いと
   思います。

3. 複数リクエストを繰り返した場合、mb_get_info( 'illegal_chars' ) の値は
   リセットされ、次のリクエストの際に前の値が残るということはありません
   でした。


上記テスト中に気がついたのですが、mb_check_encoding() は UTF-8 の判定精度
が異常に悪いように感じました。
例えば、mb_check_encoding( "\x80\x80", "UTF-8" ) は、FALSE を返すと考えられ
ますが、実際には TRUE を返します。

以下、例です。

  $ php -v
  PHP 5.2.0RC4 (cli) (built: Sep 17 2006 22:45:06)
  Copyright (c) 1997-2006 The PHP Group
  Zend Engine v2.2.0, Copyright (c) 1998-2006 Zend Technologies

  $ php -r 'var_dump( mb_check_encoding( "\x80\x80", "UTF-8" ) ); '
  bool(true)

mb_detect_encoding() では、UTF-8 としては検出されませんでした。

  $ php -r 'var_dump( mb_detect_encoding( "\x80\x80", "UTF-8" ) ); '
  bool(false)


9月末は忙しいので、また時間ができたら、もう少しテストしてみたいと思います。

-- 
komura <komura @ ma9.seikyou.ne.jp>


PHP-dev メーリングリストの案内