[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