[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アプリケーションの作り方 脆弱性が生まれる原理と対策の実践 新品価格 |
== ランキングに参加しています。ぜひクリックお願いします ==
ソニー、NEC、パナソニック、シャープ・・ 軒並み赤字 今年こそは良い年に!! [Java] 文字列中から改行を除く