SQLインジェクションの基本から実践的な対策まで、具体的なコード例を交えて解説します。あなたのWebアプリケーションは本当に安全ですか?
SQLインジェクション or 1=1 の脆弱性と対策方法を解説
データベースを狙った攻撃手法「SQLインジェクション」について、実例を交えて詳しく解説します。あなたのWebサイトは本当に安全ですか?
典型的なSQLインジェクション攻撃の例を見てみましょう。以下は脆弱性のあるPHPコードです:
$userid = $_POST['userid']
$password = $_POST['password']
$sql = "SELECT * FROM users WHERE user_id='$userid' AND password='$password'"
このコードに対して、以下のような入力を行うと:
userid: admin' OR '1'='1
password: anything
実際に実行されるSQLは以下のようになります:
SELECT * FROM users WHERE user_id='admin' OR '1'='1' AND password='anything'
OR '1'='1'
という条件が常に真となるため、パスワードの検証をバイパスできてしまいます。
プレースホルダを使用した安全なコードの例:
$stmt = $pdo->prepare("SELECT * FROM users WHERE user_id = :userid AND password = :password")
$stmt->bindValue(':userid', $userid, PDO::PARAM_STR)
$stmt->bindValue(':password', $password, PDO::PARAM_STR)
$stmt->execute()
このコードでは、ユーザー入力が必ず文字列として扱われるため、SQLインジェクション攻撃を防ぐことができます。
セキュリティ監視のポイント:
最近発生した主な被害事例:
年 | 企業・組織 | 被害内容 | 流出情報数 |
---|---|---|---|
2024 | A社 | 顧客情報流出 | 約10万件 |
2023 | B研究所 | 個人情報漏洩 | 5,527件 |
2023 | C決済代行 | カード情報流出 | 非公表 |
最新のセキュリティ動向:
対策として、以下の実装が推奨されます:
function validateInput($input) {
return preg_replace('/[^a-zA-Z0-9_]/', '', $input)
}
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?")
$stmt->execute([$user_id])
さらに、定期的なセキュリティ監査とペネトレーションテストの実施も重要です。
[以下、記事は5000文字以上続きます…]