English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
もしあなたのサイトがユーザーがウェブページを通じて入力を行い、その入力内容をSQLiteデータベースに挿入することを許可している場合、その時点でSQLインジェクションと呼ばれるセキュリティ問題に直面することになります。この章では、このような状況を防ぎ、スクリプトやSQLiteクエリのセキュリティを確保する方法について説明します。
インジェクションは、ユーザーが入力を提供する際に発生します。例えば、ユーザー名を入力する必要があるが、ユーザーがSQLite文を入力し、その文が無意識にデータベースで実行されることがあります。
提供されるデータを常に信頼しないように、検証されたデータのみを処理します。このルールはパターンマッチングで実行されます。以下の例では、ユーザー名 username はアルファベット数字文字またはアンダースコアで制限され、長さは 8 まで 20文字から - 必要に応じてこれらのルールを変更してください。
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)){ $db = new SQLiteDatabase('filename'); $result = @$db->query("SELECT * FROM users WHERE username = $matches[0]);} else { echo "username not accepted";}
問題を説明するために、以下の抜粋を見てください-
$name = "Qadir'; DELETE FROM users;";@$db->query("SELECT * FROM users WHERE username = '{$name}'");
関数呼び出しは、ユーザーが指定した名前と一致する name カラムのレコードをユーザーテーブルから検索するために使用されます。通常、$name アルファベット数字文字またはスペースのみを含む、例えば文字列 ilia です。しかし、ここでは $name に新しいクエリが追加され、データベースへのこの呼び出しが災害的な問題を引き起こします:インジェクションされた DELETE クエリは users のすべてのレコードを削除します。
既に、クエリスタックを許可しない、または単一の関数呼び出しで複数のクエリを実行するデータベースインターフェースがありますが、SQLiteやPostgreSQLではクエリスタックが行われ、提供された文字列の中ですべてのクエリを実行します。これは深刻なセキュリティ問題につながります。
スクリプト言語、例えばPERLやPHPでは、すべてのエスケープ文字を巧妙に処理できます。プログラミング言語PHPは、文字列関数 SQLite3::escapeString($string) および sqlite_escape_string() を特殊な入力文字をエスケープするために使用します。
注意:使用関数 sqlite_escape_string() の PHP 版本要求为 PHP 5 < 5.4.0。
更高版本 PHP 5 >= 5.3.0, PHP 7 使用以上函数:
if (get_magic_quotes_gpc()) { $name = sqlite_escape_string($name); } $result = @$db->query("SELECT * FROM users WHERE username = '{$name}'");
尽管编码使得插入数据变得安全,但是它会呈现简单的文本比较,在查询中,对于包含二进制数据的列,LIKE 子句は使用できません。
注意: addslashes() は SQLite 検索では使用すべきではありません。データを取得する際に奇妙な結果が発生する可能性があります。