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

広告

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

SQLiteの場合には「sqlite_escape_string」関数を使います。

sqlite_escape_string() は、 item で指定した文字列を SQLite SQLステートメ
ントで使用できるように正しくクオートします。 この際、シングルクオート(')
は2重にされ、 クエリ文字列のバイナリセーフでない文字がチェックされます。

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

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

簡単なサンプルで試してみます。

sqlitetest5.php

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

<?php

$test = "bo¥ok's";
print('変換前'.$test.'<br>');

$quote = sqlite_escape_string($test);
print('変換後'.$quote.'<br>');

?>
</body>
</html>

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

パラメータのエスケープ

シングルクオーテーションは、シングルクオーテーションを2つ並べたものに変換されます。

では、この「sqlite_escape_string」関数を使って、前のページのINSERTのテストのサンプルを書き換えてみましょう。

sqlitetest6.php

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

<?php

$link = sqlite_open('test.db', 0666, $sqliteerror);
if (!$link) {
    die('接続失敗です。'.$sqliteerror);
}

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

$id = 3;
$name = 'パソコン';
$sql = sprintf("INSERT INTO shouhin(id, name) VALUES (%s, '%s')"
         , $id, sqlite_escape_string($name));

$result_flag = sqlite_exec($link, $sql, $sqliteerror);

if (!$result_flag) {
    die('クエリーが失敗しました。'.$sqliteerror);
}else{
    print(sqlite_changes($link).'件のレコードを追加しました。<br>');
}


sqlite_close($link);

print('切断しました。<br>');

?>
</body>
</html>

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

パラメータのエスケープ

PHP入門の他の記事を見てみる

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)