こんにちは。
Railsを学び始めたばかりの初学者です。
今回は「ユーザーの操作によっておこるセキュリティの問題」と、それをどう防ぐかについて学んだことをまとめます。
はじめに
Railsには「Rails Way(レールズウェイ)」という考え方があるようです。
知らなかったです。
これは「Railsが想定する標準的な書き方に沿って開発すれば、安全性・保守性・拡張性が高まる」というものです。
セキュリティの観点からも、Rails Wayに従えば基本的には安心と言われてるようです。
セキュリティの問題は大きく2つ
Railsアプリケーションでは、大きく以下の2つのセキュリティリスクがあるみたいです。
- ユーザーの操作によっておこる問題
-
悪意のある攻撃者による問題
今回の記事では、1つ目の「ユーザーの操作によっておこる問題」に焦点を当て、記事を残します。
ユーザーの操作で起きる問題
例えば、ログインしているユーザーが以下のようなことを意図せずに行えると危険。
- 他人のデータを見れてしまう
- 他人のデータを編集・削除できてしまう
これは、本来アクセスできるはずのないデータにアクセスできてしまうという、非常に重要なセキュリティ問題。
例:問題のあるコード
以下は、一見それっぽく見えるけれど、他のユーザーの投稿を削除できてしまう危険なコード。
class ArticleController < ApplicationController
before_action :authenticate_user!
def destroy
article = Article.where(user_id: params[:user_id], article_id: params[:article_id])
article.destroy!
end
end
問題点
-
params[:user_id]
やparams[:article_id]
をそのまま使っている - ログイン中のユーザー(current_user)を使っていない
これでは、悪意がなくてもURLを少しいじるだけで、他人の投稿を削除できてしまう。
解決策:current_userを使う
このような問題は、常に「current_user」からデータを参照することで防げるみたいです。
class ArticleController < ApplicationController
before_action :authenticate_user!
def destroy
article = current_user.articles.find(params[:id])
article.destroy!
end
end
current_user.articles.find(params[:id])
のようにすることで、ログイン中のユーザーが所有する記事しか操作できなくなります。
まとめ
- Railsのセキュリティは 「Rails Way」に従うことが基本
-
current_user
からデータを取得・操作することで、他のユーザーの情報を守れる -
params[:user_id]
などを不用意に使うと、重大な問題を引き起こす可能性がある
私はまだRails初学者ですが、「セキュリティ」というテーマはとても大事だと感じています。
次は、悪意のある攻撃者による問題について記事を残します。