攻撃の原因は、ウェブアプリケーションでユーザーの入力を適切に検証・エスケープしていないことです。攻撃者は、ウェブフォームの入力欄やURLのクエリパラメータなどに特殊な文字列を挿入し、SQL文を改ざんすることができます。
以下に、SQLインジェクション攻撃からデータベースを保護するためのいくつかのシンプルで簡単な方法とコード例を示します。
- プレースホルダを使用する: SQL文を構築する際には、プレースホルダを使用してユーザーの入力を安全に組み込むことが重要です。プレースホルダは、SQL文のパラメータに対応する場所に特殊な記号(通常は「?」や「%s」など)を置き、実行時にその値をバインドします。以下は、Pythonの例です。
import psycopg2
# プレースホルダを使用したSQL文の実行
def execute_query(user_input):
conn = psycopg2.connect(database="mydb", user="myuser", password="mypassword", host="localhost", port="5432")
cur = conn.cursor()
cur.execute("SELECT * FROM users WHERE username = %s", (user_input,))
rows = cur.fetchall()
conn.close()
return rows
- エスケープ関数を使用する: 入力値をエスケープするための関数を使用することも有効な方法です。エスケープ関数は、入力値に含まれる特殊文字やメタ文字を無効化します。以下は、PHPの例です。
$user_input = $_GET['username'];
$escaped_input = mysqli_real_escape_string($connection, $user_input);
$query = "SELECT * FROM users WHERE username = '$escaped_input'";
$result = mysqli_query($connection, $query);
- ホワイトリスト入力検証: ホワイトリスト入力検証は、許可された文字やパターンのみを受け入れる方法です。入力値を事前に定義された許可された文字セットと比較し、不正な入力を拒否します。ただし、この方法は特定のケースに限定されます。
以上の方法を組み合わせて使用することで、SQLインジェクション攻撃からデータベースを保護することができます。ウェブアプリケーションのセキュリティには常に注意が必要であり、定期的なセキュリティ監査やアップデートも重要です。