SQLインジェクションの基本から実践的な対策まで、具体的なコード例を交えて解説します。あなたのWebアプリケーションは本当に安全ですか?
SQLインジェクションとプレースホルダによるデータベースセキュリティ対策の実践ガイド
データベースセキュリティの要となるSQLインジェクション対策について、プレースホルダを使用した具体的な実装方法を解説します。あなたのシステムは本当に安全ですか?
SQLインジェクション攻撃は、Webアプリケーションの入力フォームなどを通じて、悪意のあるSQL文を注入する攻撃手法です。以下のような典型的な攻撃パターンがあります:
-- 安全でないクエリの例
$sql = "SELECT * FROM users WHERE username = '" . $_POST['username'] . "' AND password = '" . $_POST['password'] . "'"
攻撃者が以下のような入力を行った場合:
username: admin' --
password: anything
実際のSQLは次のように解釈されます:
SELECT * FROM users WHERE username = 'admin' -- ' AND password = 'anything'
この場合、パスワードチェックが完全にバイパスされてしまいます。
プレースホルダを使用することで、SQLインジェクション攻撃を効果的に防ぐことができます。以下に主要な言語での実装例を示します:
PHP(PDO)での実装:
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password")
$stmt->bindValue(':username', $username)
$stmt->bindValue(':password', $password)
$stmt->execute()
Python(MySQL Connector)での実装:
cursor = cnx.cursor(prepared=True)
sql = "SELECT * FROM users WHERE username = %s AND password = %s"
cursor.execute(sql, (username, password))
Node.js(mysql2)での実装:
const [rows] = await connection.execute(
'SELECT * FROM users WHERE username = ? AND password = ?',
[username, password]
)
プレースホルダには2つの実装方式があり、それぞれ特徴が異なります:
プレースホルダを効果的に活用するために、以下の点に注意が必要です:
-- 誤った使用例
$sql = "SELECT * FROM ? WHERE id = ?" // テーブル名にプレースホルダは使えない
-- 正しい使用例
$sql = "SELECT * FROM users WHERE id = ?"
$placeholders = str_repeat('?,', count($ids) - 1) . '?'
$sql = "SELECT * FROM users WHERE id IN ($placeholders)"
$stmt->execute($ids)
$stmt = $pdo->prepare("SELECT * FROM users WHERE name LIKE :name")
$stmt->execute(['name' => '%' . $searchTerm . '%'])
最新のセキュリティ対策として、以下のような技術が注目されています:
これらの技術を組み合わせることで、より強固なセキュリティを実現できます。