はじめに
某マッチングアプリにて”SQLインジェクション”世間が賑わっていた際に、自分のRailsで作ったポートフォリオは問題ないだろうかと思い、学習を兼ねて色々調べた際の備忘録となります。
参考文献
セッションハイジャック
概要
ログイン情報が入ったcookieを盗むことで、そのユーザーになりすましログインができる
対応策
SSLサーバ証明書を取得しHTTPSでの通信を行えるように対応。
また、HTTPでアクセスしたユーザーに対しては、HTTPSにリダイレクトするよう設定。
server {
listen 80;
server_name _;
return 301 https://$host$request_uri;
}
クロスサイトリクエストフォージェリ (CSRF)
概要
imgのソース属性に、"http://www.webapp.com/project/1/destroy"
などを埋め込み、www.webapp.comにログイン状態のユーザーがその画像を閲覧すると、projectの1番が削除されてしまう
対応策
DBを書き換える動作などにはGETを使用しないことで対応
また、Railsにはデフォルトで、Railsで生成されるすべてのフォームとAjaxリクエストに対しセキュリティトークンが自動的に含まれるため、外部から送信が来た場合、そのトークンがマッチしない判定になるため例外が発生する。
クロスサイトスクリプティング (XSS)
概要
サイト上のフォームにスクリプトタグなどを埋め込み、悪意のあるコードを実行させる攻撃
対応策
Railsではデフォルトでエスケープする仕様のため、意図的に解除していない限りは問題なし
しかし、改行の反映はデフォルトのままではできないため、以下内容にて対応
simple_format(h(schedule.content))
SQLインジェクション
概要
フォームなどで、悪意のあるSQL文を打つことで、データを不正に入手したり削除したりする攻撃
対応策
RailsではActiverecordを使用して実行していれば、Rails側で対策をしているので問題なし。
しかし、whereメソッドでは手動でエスケープもしくは、配列やハッシュで文字を渡す対応策は必要。
--検索フォーム入力内容
" a' OR WHERE employee_id = 1 "
WHERE (title LIKE '%a\' OR WHERE employee_id = 1%')
-- 自動的にバックスラッシュが'についている