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

広告

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

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

string sqlite_escape_string(string item)

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

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

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

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

<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のテストのサンプルを書き換えてみましょう。

<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サーバに設置しブラウザ経由で見ると下記のように表示されます。

パラメータのエスケープ

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。