プログラマーを職業としてます。 Flex,Air,C#,Oracle,PHPの言語ノウハウを中心に情報発信していきます


[IT] SQLインジェクションに気をつけよう

SQLインジェクションって言葉ご存知ですか?

WEBアプリ開発者なら常識なのかもしれません。
システム脆弱性の一種です。
セキュリティ上考慮しないと、大変なことになる可能性があります。

どういうことかというと、ログイン画面のチェックロジックが以下のようなSQLになっていた場合、

String sql = "SELECT * FROM user WHERE userid='" + userId + "' AND password='" + password + "'"

ユーザ名、パスワード欄に「’ OR ‘A’=’A」と入力すると、実行されるSQL文は、

SELECT * FROM user WHERE userid='' OR 'A'='A' AND password='' OR 'A'='A'

となります。

このSQL文だと、WHERE句に指定した条件が変わってしまい、ログイン可能となってしまいます。
さらに、ユーザIDが分かっていれば、普通のログインとなんら変わらない状態でシステムが利用可能状態となりますので、ログインチェックの意味がなくなります。

こういったSQLの差込をすることをSQLインジェクションというらしいです。
実装によっては、DELETE文やUPDATE文も差し込める可能性があります。

何でも以前のカカクコムの情報流出事件は、この方法が使われたとか?

SQLインジェクションができるってのは、明らかにシステムのバグで、原因がはっきりすれば、作った側にも責任が生じるんじゃないかと思います。

上で書いているようなSQLと引数と+でつなげたSQLを直接実行するようなやり方は、通常やってはいけません。
ほとんどの言語では、PreparedStatementといわれる、実行時にSQL文にパラメータを埋めこませる方法が使えますので、
その仕様に従っていれば、基本的には問題有りません。

ただし、テスト時には念のために、SQL文を引数にして変に実行されたりしないかを確認しておく必要があります。

安全なウェブサイトの作り方というサイトで、簡単ではありますが、説明があります。

詳しくは、この本がオススメ。SQLインジェクションだけではなくて、安全なWebアプリケーションを作るためのノウハウがしっかり書かれています。
難しい部分もありますが、読みやすい本です。

体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践

新品価格
¥3,360から
(2012/2/3 12:40時点)

 

== ランキングに参加しています。ぜひクリックお願いします ==

プログラム ブログランキングへ
にほんブログ村 IT技術ブログへ
にほんブログ村

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です