0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Railsとセキュリティの概念について学んだよ① 〜ユーザーの操作によっておこる問題編〜

Posted at

こんにちは。
Railsを学び始めたばかりの初学者です。
今回は「ユーザーの操作によっておこるセキュリティの問題」と、それをどう防ぐかについて学んだことをまとめます。

はじめに

Railsには「Rails Way(レールズウェイ)」という考え方があるようです。
知らなかったです。
これは「Railsが想定する標準的な書き方に沿って開発すれば、安全性・保守性・拡張性が高まる」というものです。
セキュリティの観点からも、Rails Wayに従えば基本的には安心と言われてるようです。

セキュリティの問題は大きく2つ

Railsアプリケーションでは、大きく以下の2つのセキュリティリスクがあるみたいです。

  1. ユーザーの操作によっておこる問題
  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初学者ですが、「セキュリティ」というテーマはとても大事だと感じています。
次は、悪意のある攻撃者による問題について記事を残します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?