2012年8月10日金曜日

Ruby on Rails3で作成したアプリのセキュリティチェック その1

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 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...