[PHP-dev 1432] Re: [PHP-users 33830] .htaccessのmbstring系の設定がディレクトリをまたいで他のphpに反映されてしまう現象について

komura komura.db2r1e @ gmail.com
2008年 8月 10日 (日) 21:49:52 JST


komura です。

小泉さん、修正お疲れ様でした。
かなり遅くなってしまいましたが、確認してみました。

以下の点について検証し、いずれも修正されていることを確認しました。
(php5.2-200808081630.tar.bz2 を使用)

 1. "script_encoding" の設定値が別のディレクトリでも反映される件
 2. "substitute_character" の設定値が別のディレクトリでも反映される件
 3. .htaccess で "encoding_translation" を有効にした場合、"illegal_chars"
    の値が蓄積される件


何度も申し訳ないのですが、また他に気になった点がありましたので、
報告します。

encoding_translation が On の場合、mb_check_encoding() を引数なしで
呼び出すと、POST 変数の自動変換に成功したかどうかを確認する機能が
ありますが、これがうまく動作しません。必ず TRUE を返します。

現在のところ、PHP マニュアルに説明はありませんが、以下で説明されて
います。
(http://ml.php.gr.jp/pipermail/php-doc/2006-September/000762.html)


調べたところ、原因は POST データの変換処理でカウントした illealchars
を PHP_RINIT_FUNCTION で初期化してしまっているのが原因のようです。
実際の処理の流れは以下のようになります。

 1) POST データがあった場合、ext/mbstring/mb_gpc.c にある
    SAPI_POST_HANDLER_FUNC(php_mb_post_handler) で自動変換処理が入る
 2) 変換時に不正な文字列があった場合 illegalchars に不正文字数が
    カウントされる
 3) PHP_RINIT_FUNCTION(mbstring) で MBSTRG(illegalchars) = 0; が処理
    され、illegalchars が 0 になる
 4) mb_check_encoding() で illegalchars が 0 なので TRUE を返す
    (mb_check_encoding() は引数なしで呼び出した場合、illegalchars の
     値を見て判定を行うため)

この問題の対応についてですが、illegalchars の初期化位置が難しいように
思います。

POST データの変換の前に illegalchars を初期化し、PHP_RINIT_FUNCTION で
は illegalchars を変更しないようにできれば良いのですが、ソースコードを
読んだところでは、このような処理を mbstring モジュール内で行うのは難しい
ように思います。

とりあえず、PHP_MINIT_FUNCTION 時と PHP_RSHUTDOWN_FUNCTION 時に
illegalchars を初期化するように変更することで、一応、期待通りの動きに
はなりました。参考までに Patch を添付します。
他にもっと良い方法があるようでしたら Patch は無視してください。

マニュアルにも説明はないため、mb_check_encoding() を引数なしで使用して
いることはほとんどないように思います。関数の仕様を含めて検討し、この
問題には対応しないというのも一つの手ではあると思います。

# 個人的には encoding_translation を通常、On にしないため、
# mb_check_encoding() を引数なしで使うようことはないのですが・・・。


On Tue, 05 Aug 2008 09:32:28 +0900
Moriyoshi Koizumi <moriyoshi @ at.wakwak.com> wrote:

> 再度修正を行いましたので、気が向いたときでかまいませんので
> 試していただけると幸いです > 皆様
> 
> スナップショットについては先のメールの以下の説明と同様です。
> 
> >> http://snaps.php.net/ より PHP 5.2 のスナップショットをダウンロードして
> >> 下記のバグが直っているかどうか手元の環境で確認してくださいませんで
> しょうか。
> >> php-5.2-dev.tar.{gz|bz2} というリングがそれです。

-- 
komura <komura.db2r1e @ gmail.com>
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: php527dev_mbstring_illegalchars.patch
型:         application/octet-stream
サイズ:     1606 バイト
説明:       無し
URL:        http://ml.php.gr.jp/pipermail/php-dev/attachments/20080810/22abf529/attachment.obj 


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