「たかがSQLインジェクション」で会社が潰れる?法務とエンジニアが共有すべき防犯のリアル
こんにちは。現場の最前線でセキュリティと向き合っていると、「SQLインジェクションなんて古い攻撃でしょ?」と軽く考えている新人エンジニアによく出会います。
でも、はっきり言います。SQLインジェクションは、今でも企業の命運を握る「一番の弱点」です。
今日は、なぜこの攻撃が法的にヤバいのか、そして私たちが開発者としてどうやって身を守ればいいのか、泥棒の例え話を通してお話ししましょう。
—
1. SQLインジェクションを「家の鍵」で例えると?
まず、皆さんが開発しているWebアプリケーションを「家」だと想像してください。
- データベース: 家の中にある「金庫」です。顧客リストやパスワードが詰まっています。
- SQLクエリ: 金庫を開けるための「命令書」です。
- インジェクション: 泥棒が「合鍵」を作るのではなく、「命令書の書き換え」をして金庫を開けさせる手口です。
例えば、ログイン画面でユーザー名を入力する欄に、本来のIDではなく「' OR '1'='1」なんて文字列を打ち込まれたことはありませんか?
これ、裏側では「ユーザー名が一致するか確認する」という命令書が、「『ユーザー名が一致する』または『1は1である(常に正しい)』なら金庫を開けろ!」という命令に書き換えられているんです。
泥棒は鍵を壊す手間もなく、正面玄関から堂々と家の中の個人情報を全部盗み出せてしまう。これがインジェクションの恐ろしいメカニズムです。
—
2. なぜ「個人のミス」では済まされないのか?
ここで少し怖い話をします。もしあなたのコードのせいで顧客情報が流出したら、どうなると思いますか?
「すみません、バグでした」では済まない時代なんです。個人情報保護法やGDPR(欧州の厳格なデータ保護法)では、企業に「適切なセキュリティ対策を講じる義務」を課しています。
- 損害賠償: 流出した一人ひとりに謝罪し、賠償金を払うことになれば、数億円規模の損失になることも珍しくありません。
- 社会的信用の失墜: 一度「セキュリティが甘い会社」というレッテルを貼られると、顧客は二度と戻ってきません。
- 法的責任: 適切な対策(SQLインジェクション対策など)を怠っていた場合、経営陣の「監督責任」まで問われることになります。
つまり、セキュリティ対策は「エンジニアのこだわり」ではなく、企業の生存をかけた「法務上の義務」なんですね。
—
3. 「一歩ずつ」できる防御対策:プリペアドステートメント
さて、ここからが技術的な本題です。難しく考える必要はありません。「命令書に余計なことを書かせない」仕組みを作ればいいだけです。
一番の特効薬は「プリペアドステートメント(静的プレースホルダ)」を使うことです。
悪い例(これだと書き換えられてしまう!)
// ユーザーが入力した値がそのままSQL文に入ってしまうのがダメなんです
$sql = “SELECT FROM users WHERE username = ‘” . $_POST[‘username’] . “‘”;
良い例(命令書をあらかじめ固定する)
// SQL文の枠組みだけ先に作っておき、値は後から「箱」に入れるイメージです
$stmt = $pdo->prepare(“SELECT FROM users WHERE username = :username”);
// :username という箱に、ユーザーの入力値を安全に流し込みます
$stmt->execute([‘username’ => $_POST[‘username’]]);
これだけで、たとえ泥棒が「OR '1'='1」と入力しても、プログラムはそれを「ユーザー名の一部」としてしか扱わなくなります。「命令」として認識させないこと。これが最大の防御です。
—
4. 念には念を:防御ヘッダーという「防犯カメラ」
アプリ側の対策に加え、HTTPレスポンスヘッダーに少し設定を加えるだけで、ブラウザが勝手に怪しい動きを察知して守ってくれる仕組みがあります。
例えば、Content-Security-Policy (CSP) というヘッダーを設定しておくと、万が一攻撃者がスクリプトを仕込もうとしても、ブラウザが「そのスクリプトは許可されていません!」と止めてくれます。
設定例(Webサーバーの構成ファイルやアプリ側で送信):
信頼できるソースからのスクリプトしか実行させない設定
Content-Security-Policy: default-src ‘self’; script-src ‘self’;
これは「家の中に防犯カメラを設置し、怪しい人物が侵入した瞬間に警報を鳴らす」ようなものです。
—
最後に:セキュリティは「泥臭い積み重ね」です
ここまで読んでくださったあなたは、もう立派なセキュリティ意識を持ったエンジニアです。
セキュリティの世界に「完璧な対策」はありません。でも、「入力を信じない」「命令とデータを分ける」という基本を泥臭く守り続けるだけで、攻撃のほとんどは防げます。
まずは自分の書いたコードを見直して、「もしここに悪意ある文字列を入れたらどう動くかな?」と想像してみてください。その小さな気づきが、会社と顧客、そしてあなた自身を守る盾になります。
一歩ずつ、一緒に強固なシステムを作っていきましょう!応援しています。
コメント