Railsのセキュリティについて勉強した時のメモです。
セッションハイジャック
セッションハイジャックとは?
セキュリティに問題のあるネットワークを使用するとCookieの内容を盗み取られる可能性がある。
Cookieの中にセキュリティIDがあるのでそれを奪われると代わりにログインされてしまうこと。
対策
Railsには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
に
<%= 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のクエリを作らない。
find
、find_by
、where(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>`
)
}