[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 メーリングリストの案内