Railsのセキュリティについて


Railsのセキュリティについて勉強した時のメモです。

セッションハイジャック

セッションハイジャックとは?

セキュリティに問題のあるネットワークを使用するとCookieの内容を盗み取られる可能性がある。
Cookieの中にセキュリティIDがあるのでそれを奪われると代わりにログインされてしまうこと。

対策

Railsにはconfig/environments/production.rb

config/environments/production.rb
config.force_ssl = true

というオプションがありこれを追加することでssl通信(セキュリティ的に安全な通信)しか受け付けないようにできる。

CSRF

CSRFとは?

Cross Site Request Forgeriesと言い、攻撃者が他人のサイトにコードを埋め込むことでユーザーが操作した際に意図しない挙動を生み出す攻撃のこと。
例えば、ECサイトで戻るボタンが購入ボタンになっていて、戻るを押すと決済されていたみたいな感じ。

対策

post,put,deleteなどのデータに変更を加えるものは、tokenと一緒にリクエストしないといけないようにする。
Railsにはapp/views/layouts/application.html.erb

app/views/layouts/application.html.erb
  <%= csrf_meta_tags %>

という記述があり、ここでtoken(鍵のようなもの)が生成されるのでこれを取得してリクエストを送れば対策できる。

SQLインジェクション

SQLインジェクションとは?

SQLを操作するパラメーターなどを送ることでデータベースを操作して攻撃をする手法。
データベースを操作されるので場合によっては全てのデータを削除したり取り出されてしまう恐れがある。
具体的には、

User.where("name = '{params[:name]}'")

のようにwhereにハッシュではなく文字列を渡した場合、

params[:name]' OR 1 --のように送られてきた場合

SELECT * FROM user WHERE name = " OR 1 --'

という全てのデータを取得するクエリが発行されるらしい‥ やばすぎ‥

対策

ユーザーから送られてくる値を直接使ってSQLのクエリを作らない。
findfind_bywhere(name:params['name'])など限定的なメソッドを使う。
Rails、Rubyっぽい書き方をする。

XSS

XSSとは?

Cross Site Scriptingと言い、コード付きのリンクなどを攻撃者が掲示板などに書き込み、そのリンクを踏んだユーザーに対して不正なプログラムを実行する手法。
ユーザー投稿型サービスではユーザーが投稿した内容をそのまま表示するので、ユーザーが投稿した内容にコードが含まれていた場合、投稿内容をクリックなどした人がプログラムを実行してしまう。

対策

投稿時にコードを入力してもコードではなく文字列として表示するようにする。
例えば以下のようにjQueryでコメントした内容を追加する処理の場合、
pタグに${comment.content}のように書くとコメントにコードを書いた場合そのままコードが反映されプログラムが実行される恐れがある。

const appendNewComment = (comment) => {
  $('.comments-container').append(
    `<div class="article_comment"><p>${comment.content}</p></div>`
  )
}

escapeを使うことでコードではなく文字列に変換してくれるので対策できる。

const appendNewComment = (comment) => {
  $('.comments-container').append(
    `<div class="article_comment"><p>${escape(comment.content)}</p></div>`
  )
}