[PHP-users 11110] Re: フォームの変数をPostgreSQL にINSERT

Yasuo Ohgaki php-users@php.gr.jp
Sun, 27 Oct 2002 11:11:01 +0900


大垣です。

セキュリティーに関する事なのでコメントします。
下記の書き方ではSQLインジェクションが簡単にできます。

# データを不正に取得、挿入、削除、更新できます。

> か〜、なんてこった。
> 徹夜で悩んだことがこれですか?
> どうして気付かなかったのでしょうか。
>>
>>---- Snip Snip ----
>>
>>>$sql_insert = "insert into test (name) values (' ".$_POST['$name']."
>>
>>---- Snip Snip ----
>>$sql_insert = "insert into test (name) values (' ".$_POST['name']."')";
>>では、いかがでしょうか。

PHP 4.3.0からは

$db = pg_connect();
if (!pg_insert($db, 'table_name', $_POST)) {
  // テーブルに存在しないフィールド(キーがフィールド名)を送信したか
  // 不正な形式(日付形式がおかしいなど)のデータ(配列要素の値)が送信
  // された。
  trigger_error('User sent malformed data.', E_USER_ERROR);
}
// OK

といった形で安全にデータベース保存できます。

# pg_insert()はデフォルトpg_convert()を内部的に呼び
# 必要なエスケープ処理、クオートで囲む処理を自動的に行ないます。

pg_insert/pg_select/pg_update/pg_deleteを使わない場合
pg_convertを利用するとスクリプトで処理するより遥かに効率的です。

# ただし、現状のpg_convertは一部のデータ型(array, cricleなど)
# とユーザー定義型に対応していません。

配列関数と組み合わせると複雑な処理も簡単に行なえます。

4.3.0より古いPHPの場合はpg_escape_string()またはaddslashes()
などを利用しなければなりません。

--
Yasuo Ohgaki