SQLインジェクションとは?
SQLインジェクションとは、悪意のあるユーザーがSQL文を意図的に壊したり、改変したりすることで、データベースの情報を不正に取得・操作できてしまう脆弱性のことです。
たとえば、以下のようなログインフォームを考えます:
-
/login
にアクセス -
email
に存在するアドレスを入力 -
password
に' OR 1=1 --
を入力すると…
本来ならパスワードが一致しなければログインできないはずが、「OR 1=1
」により条件が常に真になってしまい、ログインに成功してしまいます。
改善前のコード(脆弱なコード)
const sql = `
SELECT u.id, u.name, u.email, u.password
FROM users u
WHERE u.email='${email}' AND u.password='${password}'
`;
たとえば password
に ' OR 1=1 --
を入力すると、SQLが次のようになります:
SELECT ... FROM users WHERE u.email='test@example.com' AND u.password='' OR 1=1 --'
このようになり、ログインが成功してしまう脆弱性が存在します。
改善後のコード(プレースホルダを使う)
この脆弱性を防ぐには、SQLにプレースホルダを使うことで防げます。
const user = await db.get(
`SELECT u.id, u.name, u.email, u.password
FROM users u
WHERE u.email=? AND u.password=?`,
email,
password
);
このように書くことで、入力値が自動でエスケープ処理され、不正なSQL文として扱われることが無くなります。
まとめ
-
SQLインジェクションは、ユーザーの入力によってSQLが壊されてしまう脆弱性
-
プレースホルダを使って、SQLインジェクションを防ごう
progateで学んだことをもとに書いてアウトプットしてます。