Ruby on Rails3で作成したアプリのセキュリティチェックのまとめ記事その1。
環境はruby-1.9.3-p0, rails3.2.2, postgresです。
難易度★★★☆☆
SQLインジェクション
SQLインジェクションは、パラメーターとして指定された文字列の一部がリテラルをはみ出すことにより、SQL文が変更されることです。
SQLインジェクション対策
静的(動的)プレースホルダを利用してSQLを呼び出す
例:ログイン
メールアドレスとパスワードでログインするアプリの場合を考える
1.インジェクションサンプル
入力値mail: test@co.jp(正しいメールアドレス) password: '' or 'a' = 'a'ログインコード
Users.where("mail = " + params[:mail] + " and password =" + params[:password]) ↓ select * from users where mail = test@co.jp and password = '' or 'a' = 'a'
上記のようなログイン処理の場合、パスワードを知らない悪意のあるユーザーがログインできてしまいます。
SQLインジェクションの原因は、パラメーターとして指定した文字列の一部がリテラルをはみだすことでSQL文の文字構造が変化してしまうことにあります。(そもそも上記のようなログイン処理を実装してはいけません)
SQLインジェクションの対策方法は、プレースホルダを利用することです。
×Users.where("mail = " + params[:mail] + " and password =" + params[:password]) ○Users.where("mail = ? and password = ?", params[:mail], params[:password]) もしくは ◎Users.where(:mail => params[:mail], :password => params[:password])
Hashを使ったコードの方が個人的には読みやすいと思います。
以上です。
参考書籍
0 件のコメント:
コメントを投稿