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

Tatsuo Ishii ishii @ sraoss.co.jp
2006年 3月 10日 (金) 10:15:26 JST


石井です.

> > >  重村氏とやんややんやと議論してみたのですが、彼も DBD::Pg が SJIS を
> > > 意識した quote をしないのがダメ、といっています。というよりも、quote
> > > をサーバ側に任せないで自前でやっているのがダメ、というのが根本的なとこ
> > > ろな気がしています。
> > 
> > サーバ側というのは,PostgreSQLのバックエンド側ということですか?でも,
> > クライアント側でescape処理をしなかったら,SQLインジェクションがやり放
> > 題になりませんか?
> 
>  言葉足らずで申し訳ありません。
> 
>  libpq を使うクライアント側が入力の escape を行う、というのはもちろん
> なんですが、(少なくとも私の場合)多くの場合は placeholder を使うので、
> 明示的に値を escape する、ということはその場合はしていません。
> 
> # という理解で大丈夫?

それで良いと思います.本物のprepared query(parameterized query)がサポー
トされていればの話ですが.

>  今回、Perl モジュールの DBD::Pg が、サーバのバージョンが古い時には
> placeholder を見つけると自分で quote 処理を行って、placeholder の場所
> に quoted value を入れた SQL 文を作る、ということをしているのですが、

うわー,そうなんですか.危なそう...こういう「なんちゃってparameterized
query風実装」は使わない方がよいと個人的には思います.

> 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 ('ヘソ\');
> # であるべきか、ということなのですが。

こっちであるべきですね.

> insert into test (colname) values ('ヘソ');
--
Tatsuo Ishii
SRA OSS, Inc. Japan



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