SQLインジェクションの基本から実践的な対策まで、具体的なコード例を交えて解説します。あなたのWebアプリケーションは本当に安全ですか?
SQLインジェクションのテスト手法と実践的な脆弱性診断方法
SQLインジェクションの脆弱性を発見・検証するためのテスト手法について、実践的なコード例を交えながら解説します。あなたのWebアプリケーションは本当に安全ですか?
SQLインジェクションの脆弱性を検証するための基本的な手順について説明します。まずは、以下のような単純なログインフォームを例に考えてみましょう。
$user_id = $_POST['user_id']
$password = $_POST['password']
$sql = "SELECT * FROM users WHERE user_id='$user_id' AND password='$password'"
このコードには明らかな脆弱性が存在します。テストには以下の入力値を使用します:
'
' OR '1'='1
'--
より高度なテスト手法として、以下のような方法があります:
' UNION SELECT null,null,null--
' AND (SELECT CASE WHEN (1=1) THEN 1 ELSE 1/0 END)=1--
' AND (SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END)--
対策の実装状況を確認するためのテストコードを示します:
$stmt = $pdo->prepare("SELECT * FROM users WHERE user_id = :user_id AND password = :password")
$stmt->bindParam(':user_id', $user_id, PDO::PARAM_STR)
$stmt->bindParam(':password', $password, PDO::PARAM_STR)
$stmt->execute()
テスト項目チェックリスト:
効率的なテストのために、以下のような自動化ツールの活用が有効です:
ツール名 | 主な機能 | 特徴 |
---|---|---|
sqlmap | 自動検出・攻撃 | 高機能で詳細な診断が可能 |
OWASP ZAP | 脆弱性スキャン | 使いやすいGUIインターフェース |
Burp Suite | プロキシ解析 | 高度な手動テストが可能 |
テスト結果の分析と報告には以下の項目を含めます:
-- 脆弱性のある実装例
SELECT * FROM users WHERE id = '$user_input'
-- 安全な実装例
SELECT * FROM users WHERE id = ?
テスト結果のドキュメント化には、以下の情報を含めることが重要です: