[pgsql-jp: 38477] Re: invalid byte sequence for encoding "EUC_JP": 0xa488

Tatsuo Ishii ishii @ sraoss.co.jp
2007年 6月 8日 (金) 09:58:23 JST


石井です.

> こんにちは。石田@苫小牧市です。
> 
> 07/06/07 に haward99 @ yahoo.co.jp<haward99 @ yahoo.co.jp> さんは書きました:
> > 渡辺と申します。
> > Postgresqlサーバーのバージョンアップがらみで手詰まっております。
> >
> > ver8.1.2上のあるテーブルだけをpg_dumpして、
> > 別サーバのver8.2.4上のDBに流し込もうとしたところ、
> > 以下のエラーが発生しました。
> > (新旧両方のサーバの文字コードは全てEUC-JPで固めてある)
> >
> > ERROR:  invalid byte sequence for encoding "EUC_JP": 0xa488
> > HINT:  This error can also happen if the byte sequence does not match the encoding
> > expected by the server, which is controlled by "client_encoding".
> > ERROR:  invalid byte sequence for encoding "EUC_JP": 0xa487
> > HINT:  This error can also happen if the byte sequence does not match the encoding
> > expected by the server, which is controlled by "client_encoding".
> >
> > おそらく、ver8.1.4以降で厳格化されたエスケープ文字の取り扱いに
> > ひっかかったのかな?と推測しております。(違うかな)
> 
> 私もそうだと思います。

ちょっと違うと思います.8.1.4以降では,文字を構成するバイトの範囲が,
そのエンコーディングとして正常な範囲にあるかどうかのチェックが行われて
おり,今回のケースではそれに引っ掛かっているのだと思います.たとえば
0xa488では,a4の部分からこの文字はJIS X 0208 の範囲にあると仮定できま
すが,すると後半の88がその仮定に反してしまうので,正しいEUC-JPのコード
ではないと判断されたものです.

このあたりは,たしか石田さんの「エンコーディング範囲のチェックを厳密に
しないと脆弱性につながるよ」という指摘があって,実装されたと記憶してい
ます.
# その指摘がなければ,PostgreSQLはかなり危ない状態のままだったわけで,
# 石田さんのご指摘には感謝しています.

> > <<<疑問点その1.>>>
> > 新旧両方のDBサーバのpostgresql.confにおいて
> >
> >   log_min_error_statement = error
> >
> > を設定して、エラーを起こしたSQL文をログ記録するようにしている
> > はずなのですが、上記エラーメッセージを吐いた際の
> > 該当のSQL文がログに記録されませんでした。なぜ?
> 
> とりあえずこちらだけ。
> 
> これは、ダンプしたファイルを読み込むクライアントプログラム
> (たぶんpsql)がログを出力しなかったということでしょうか。
> 
> だとすれば、サーバ側のログには出力されているかもしれません。

エンコーディングチェックに引っ掛かった場合には,SQL文はログされません.

> 0xa487、0xa488、というシーケンスを含むレコードをSELECTする、
> またはpg_dumpしたテキストファイルからgrepかなにかで探し出すのに
> うまい方法はないでしょうか?

pg_dump出力を16進ダンプするとかでしょうか.

後はたしか昔MLに投稿したことがあるstrtohexという関数を8.1側に仕込んで,
SELECTすることができると思います.

SELECT * FROM foo WHERE strtohex(bar) ~ 'a487';

のような感じ.
# もし見当たらなければ個人メールでお送りします.
--
Tatsuo Ishii
SRA OSS, Inc. Japan



pgsql-jp メーリングリストの案内