Railsのセキュリティ強化!初心者でもわかるヘッダー設定・リファラ検証・オープンリダイレクト対策
生徒
「Webアプリを作るとき、セキュリティって何をすればいいんですか?」
先生
「とても大切なポイントですね。Railsでは、いくつかの基本的なセキュリティ対策が必要です。」
生徒
「たとえば、どんな対策があるんですか?」
先生
「たとえば、HTTPヘッダーの設定、リファラの検証、そしてリダイレクト時のURLチェックなどがあります。ひとつずつ一緒に学んでいきましょう。」
1. HTTPヘッダーを使ってRailsアプリを守ろう
まずは、HTTPヘッダーの設定から始めましょう。HTTPヘッダーは、Webブラウザとサーバーの間でやり取りされる情報のことです。ここでセキュリティに関するルールを決めることができます。
Railsでは、config/initializersに設定ファイルを作成することで、HTTPヘッダーを制御できます。
たとえば、クリックジャッキングという攻撃を防ぐには、次のような設定を追加します。
# config/initializers/security_headers.rb
Rails.application.config.action_dispatch.default_headers.merge!({
'X-Frame-Options' => 'SAMEORIGIN'
})
この設定により、自分のサイト以外からの<iframe>での読み込みを防ぐことができます。悪意のあるサイトに埋め込まれて、ユーザーが誤って操作してしまう危険を防げます。
2. リファラ検証で不正アクセスを防ぐ
次に、リファラ(Referer)をチェックする方法を紹介します。リファラとは、「どこからアクセスしてきたのか」という情報のことです。
たとえば、自分のフォームから送信されたはずのデータが、外部サイトから送られてきた場合、それは不正なリクエストかもしれません。
これを防ぐために、コントローラでリファラを検証するコードを追加できます。
before_action :check_referer, only: [:create, :update]
private
def check_referer
unless request.referer&.start_with?(root_url)
render plain: "不正なアクセスです", status: :forbidden
end
end
このコードでは、refererが自分のアプリから来ていない場合に、処理を拒否しています。これによって、外部からの不正なPOST送信をブロックできます。
3. オープンリダイレクト攻撃とは?その対策方法
最後に紹介するのは、オープンリダイレクトという攻撃と、その防ぎ方です。
ログイン後に元のページへ戻す機能などで、URLをパラメータとして受け取ることがあります。
redirect_to params[:return_to]
このようなコードでは、悪意のあるURLが指定されてしまうと、ユーザーが外部の偽サイトに誘導されてしまいます。たとえば、パスワードを盗むような危険なサイトです。
これを防ぐには、リダイレクト先のURLが自分のサイト内であるかをチェックする必要があります。
def safe_redirect(target)
uri = URI.parse(target)
if uri.host.nil? && uri.path.start_with?('/')
redirect_to target
else
redirect_to root_path, alert: "不正なリダイレクトです"
end
end
この方法では、hostが空(つまり外部サイトではない)で、pathがスラッシュから始まっているかを確認しています。これで、外部へのリダイレクトを防ぐことができます。
4. まとめて覚えよう!セキュリティの基本ポイント
ここまで、Railsでできるセキュリティ対策のうち、基本的かつ重要な3つのポイントを解説しました。
- HTTPヘッダーの設定でクリックジャッキングを防ぐ
- リファラ検証で外部からの不正なリクエストを防ぐ
- オープンリダイレクト対策で外部サイトへの誘導を防ぐ
セキュリティは「あとでやろう」と思ってしまいがちですが、最初から設計に組み込むことが大切です。Railsではbefore_actionなどのフィルタを使って、こうした対策をアクションの前に自動で実行することができます。
一見難しそうに見えるこれらの対策も、「自分のアプリを守るおまじない」として習慣づけていけば、自然と身についていきますよ。