0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Progateで学ぶSQLインジェクション対策

Posted at

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で学んだことをもとに書いてアウトプットしてます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?