[pgsql-jp: 36852] Re: client encoding と PQexec

Jun Kuriyama kuriyama @ imgsrc.co.jp
2006年 3月 9日 (木) 23:44:40 JST


At Thu, 09 Mar 2006 23:05:33 +0900 (JST),
Tatsuo Ishii wrote:
> > > 以前SJISで同じ現象が発生してDBDのソースを調査したのですが
> > > DBDのquote処理は、マルチバイト文字を考慮してないのでSJIS文字
> > > 2バイト目の\までエスケープしてしまうため、SJISでDBI::DBDを使って
> > > はダメだ。という結論に達しました。
> > 
> >  重村氏とやんややんやと議論してみたのですが、彼も DBD::Pg が SJIS を
> > 意識した quote をしないのがダメ、といっています。というよりも、quote
> > をサーバ側に任せないで自前でやっているのがダメ、というのが根本的なとこ
> > ろな気がしています。
> 
> サーバ側というのは,PostgreSQLのバックエンド側ということですか?でも,
> クライアント側でescape処理をしなかったら,SQLインジェクションがやり放
> 題になりませんか?

 言葉足らずで申し訳ありません。

 libpq を使うクライアント側が入力の escape を行う、というのはもちろん
なんですが、(少なくとも私の場合)多くの場合は placeholder を使うので、
明示的に値を escape する、ということはその場合はしていません。

# という理解で大丈夫?

 今回、Perl モジュールの DBD::Pg が、サーバのバージョンが古い時には
placeholder を見つけると自分で quote 処理を行って、placeholder の場所
に quoted value を入れた SQL 文を作る、ということをしているのですが、
DBD::Pg 側が PQexec に渡す SQL 文字列を作るときに、insert 時の value 
の所など single quote 文字で括られた値が、バイト単位の quote 処理を行
うべきなのか、encoding を意識した文字単位の quote をするべきか、という
のがわからなかったのです。

# なんかうまく伝えられる自信がなくなってきた……。
#
# client encoding が sjis, server(db) encoding が euc の時に、
# PQexec() に渡すのは
# insert into test (colname) values ('ヘソ');
# であるべきか、
# insert into test (colname) values ('ヘソ\');
# であるべきか、ということなのですが。


-- 
Jun Kuriyama <kuriyama @ imgsrc.co.jp> // IMG SRC, Inc.



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