パラメータをエスケープする

広告

今までの例でSELECTやINSERTを実行する時に、SQL文中で使われている値が固定の値として記述している場合は問題無いですが、例えばフォームなどから条件を入力してもらってSQL文を作成する時に、SQLインジェクション攻撃などを防ぐ為にパラメータをエスケープしておく必要があります。

PostgreSQLの場合には「pg_escape_string」関数を使います。

pg_escape_string
string pg_escape_string(string data)
pg_escape_string() は、データベースに挿入するための 文字列をエスケープし
ます。PostgreSQL フォーマットにエスケープされた 文字列を返します。
addslashes() の代わりにこの関数を 使用することを推奨します。カラム型が 
bytea の場合は、代わりに pg_escape_bytea() を使用しなければなりません。

引数:
  data  エスケープするテキスト文字列。
返り値:
  エスケープされたデータを文字列で返します。

具体的には例えばINSERTする値にシングルクォーテーション(')などが含まれていた場合SQL文がおかしくなってしまいますが、この関数を通すことでSQL文の中で直接記述できないような値に対してエスケープ処理を行ってくれます。例えばシングルクオート(')はダブルクオート(")へ、「\」は「\\」へ変換を行ってくれます。

$test = "bo\ok's";
print($test.'<br>');

$quote = pg_escape_string($test);
print($quote.'<br>');

上記のようなサンプルを実際にブラウザで表示させてみると下記のように表示されます。

エスケープ処理

では前のページで使ったINSERTのサンプルを書き直してみます。

<html>
<head><title>PHP TEST</title></head>
<body>

<?php

$conn = "host=localhost dbname=uriage user=pguser password=pguser";
$link = pg_connect($conn);
if (!$link) {
    die('接続失敗です。'.pg_last_error());
}

print('接続に成功しました。<br>');

pg_set_client_encoding("sjis");

$result = pg_query('SELECT id, name FROM shouhin');
if (!$result) {
    die('クエリーが失敗しました。'.pg_last_error());
}

for ($i = 0 ; $i < pg_num_rows($result) ; $i++){
    $rows = pg_fetch_array($result, NULL, PGSQL_ASSOC);
    print('id='.$rows['id']);
    print(',name='.$rows['name'].'<br>');
}

print('<br>データを追加します。<br><br>');

$id = 6;
$name = 'デジカメ';

$sql = sprintf("INSERT INTO shouhin (id, name) VALUES (%s, '%s')"
         , $id, pg_escape_string($name));

$result_flag = pg_query($sql);

if (!$result_flag) {
    die('INSERTクエリーが失敗しました。'.pg_last_error());
}

print('<br>追加後のデータを取得します。<br><br>');

$result = pg_query('SELECT id, name FROM shouhin');
if (!$result) {
    die('クエリーが失敗しました。'.pg_last_error());
}

for ($i = 0 ; $i < pg_num_rows($result) ; $i++){
    $rows = pg_fetch_array($result, NULL, PGSQL_ASSOC);
    print('id='.$rows['id']);
    print(',name='.$rows['name'].'<br>');
}

$close_flag = pg_close($link);

if ($close_flag){
    print('切断に成功しました。<br>');
}

?>
</body>
</html>

上記ファイルをWWWサーバに設置しブラウザ経由で見ると下記のように表示されます。

エスケープ処理

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。