[PHP-users 32368] Re: PHPを使ってのPostgresqlについて

ISHIDA Akio iakio @ mono-space.net
2007年 7月 3日 (火) 19:34:35 JST


こんにちは。石田@苫小牧市と申します。

07/07/03 に PAD<pad-traku @ pa-d.com> さんは書きました:
> 楽です。
>
> 大垣さん、
> ありがとうございます。
>
>
> > 本題とは関係ありませんが、
> >
> > PAD さんは書きました:
> >> 楽です。
> >> いつも勉強させてもらっています。
> >> PHPを使ってのPostgreSQL からのデータ取得についてです。
> >>
> >> コードはPHPで書いていますが、PostgreSQL からのデータ取得
> >> ですので、場違いかもしれません。
> >>
> >> ヒアドキュメントを使い、以下のようにして
> >> データを検索し1ページの表示個数を20個にしています。
> >>
> >>
> >> $hoge = $_REQUEST['hoge'];
> >> $whereSQL = "WHERE abc LIKE '%$hoge%'";
> >
> > 2つエスケープ漏れがあります。
> >
> > まず、クエリに渡す全ての変数はpg_escape_string(またはpg_escape_bytea)で
> > エスケープしなければなりません。PEARのescapeメソッドを使えば良いです。
> > # 今PEARのコードを見るとescapeの問題を指摘してから1年以上経ってから
> > # 直しているようですね。CVSタグを見るとRELEASE 1.7.x以上なら問題ない
> > # コードになっています。
> >
> > 次にhogeの中に'%'が含まれている場合が考慮されていません。
> >
>
>  $data = addslashes($data);
>  $data = htmlspecialchars($data);
>
> 上記 $hoge については、割愛しましたが 記載:$data の方法にてエスケープいたしておりますが、
> 不足でしょうか。
> そのあたり、ご教示下さい。
>

htmlspecialchars()してしまっては、まともに検索できないの
ではないでしょうか。

アンダースコアもエスケープする必要があるので、
こんな感じだと思います。

$data = mb_ereg_replace('[%_]', '\\\\0', $data);
$data = pg_escape_string($data);

SJIS等の、2バイト目に0x7f以下がくる文字コードを使って
いなければ、

$data = str_replace('%', '\%', $data);
$data = str_replace('_', '\_', $data);
$data = pg_escape_string($data);

でもよさそうです。

-- 
ISHIDA Akio <iakio @ mono-space.net/ishida @ cycleof5th.com>


PHP-users メーリングリストの案内