🙄
SQLインジェクション(memo)
SQLインジェクションとは?
攻撃者がSQL文に不正な命令を埋め込むことによって、製作者の意図しない動作(データの不正取得や改ざんなど)を引き起こさせること。
攻撃の具体例
ウェブサイトやアプリケーションの入力欄などからSQL文を入力する。
例えば以下のようなログインフォームがあったとする。

そして以下のようなデータベースに対してのクエリを次のようなSQL文で記述していたとする。
SELECT * FROM users WHERE username = 'メールアドレス' AND password = 'パスワード';
まず、攻撃者はメールアドレスの欄に' OR '1'='1と入力する。するとsql文は以下のようになる。
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '';
これによりORの次の'1'='1'は常にTrueとなる。
次に先ほどのメールアドレスの欄に入力に付け足し、' OR '1'='1' --と入力する。付け足された--は以降のSQL文をコメントアウトしてしまい、パスワードの判定を無効にする。
SELECT * FROM users WHERE username = '' OR '1'='1' --' AND password = '任意の値';
これによって攻撃者はパスワードを知らなくても個人に成りすましてログインできてしまう。
これはあくまでも簡単な一例であり、実際にこのような手法はほぼ通じない、悪用厳禁!!!
対策
SQLインジェクションに対する最も効果的な方法はSQL文にプレースホルダーを用いることである。
SELECT * FROM users WHERE username = $1 AND password = $2;
この$1,$2というのがプレースホルダーである。これによりユーザーからの入力は文字列としてしか扱われないため、不正な入力をSQL文として認識されないようにする。
他にもいくつかの対策があるが、この方法がもっとも単純で根本的な対策となる。
Discussion