Home > pgsql > PostgreSQL での文字列のエスケープ

PostgreSQL での文字列のエスケープ

addslashesによるエスケープ処理は止めましょう(yogaki's blog)

ちなみにSQLiteを使っている場合はaddslashesでエスケープ処理はNGです。もっと根本的に間違っています。SQLiteではMS SQL Server, Sybaseと同様「'」は「''」とシングルクオートでエスケープします。

前にもちょっと書いたんですが、PostgreSQL の将来のバージョンでは、 (SQLite 等と同様に) シングルクォート内のバックスラッシュが特別な意味を持たなくなるそうです。

また、8.1.x から E'' という構文が追加されています。これは将来のバージョンで シングルクォート内のバックスラッシュが特別な意味を持たなくなった後でも、 E'' 構文の中のバックスラッシュは 8.1.x 以前同様特殊な文字として扱われます。

今の PHP の pg_escape_string() の実装がどうなっているかは知りませんが、 こういったインタフェースのサポート関数は、 PQparameterStatus() で standard_conforming_strings の確認して、 (将来の変更までに)適切なエスケープ処理を行うよう変更する必要があるようです。

なのでよろしくお願いします(誰に?)。

Writeback:2

from いしだ 2006/02/15 (Wed) 09:04:02
結論を書き忘れてましたが、SJIS を使ってなくても PostgreSQL では addslashes() を使わない方が良いです。
まああと元ネタに関していえば、SJIS 使ってればあたりまえなんじゃないのって感じがしますが、、、
from いしだ 2006/02/15 (Wed) 10:59:35
さらに元ネタについていうと
$_POST['username'] = "\x95' OR username = username /*";
こんな入力データを文字列として扱ってしまうこと自体が問題なわけで、こういった入力が来たらもうDBに投げる必要は無いわけです。
文字列の妥当性を検証する関数がPHPにあればそれがいいんだろうけど、それは無いみたいなので、
$a = mb_convert_string($_POST['username'], 'SJIS');
とか
$a = mb_convert_string($_POST['username'], 'SJIS', 'SJIS');
とかで弾いていいんじゃないかと思います。
バイナリとして格納なんてしたら、まともに like 検索ができないんじゃないでしょうか。
Comment Form

writeback message: Ready to post a comment.

TrackBack ping me at
http://www.mono-space.net/blog/pgsql/e060215_escape.trackback

Page Top