Precena Tech Book
コーポレートサイト採用サイト
  • はじめに
  • ソフトウェア開発
    • 開発環境構築
      • Homebrew
        • Homebrew用語の意味
      • ngrok
        • ngrokの導入
        • ngrokのアップグレード(v2 to v3)
      • Slack
        • Slackの/remind コマンドの形式
        • 対面での相談を気軽にするためのSlack設定
      • AWS CLI
      • Ruby
      • Scala
      • Prettier
      • zsh
        • zsh-completion
      • Mac
        • M1 Macでの開発環境構築(rosetta 無し)
    • バックエンド
      • OpenAPI
        • OpenAPI 定義ファイル分割のすゝめ
      • Ruby on Rails
        • ActiveRecordのfind_or_initialize_byメソッドにブロックを渡したときの挙動
        • Railsのアプリケーションサーバーのプロセス数とスレッド数の設定方法
        • Railsを6.1系から7.0系へアップグレードした時に調査したこと
        • schema.rbで差分が発生する事例とその復旧について
        • tmux + overmind を利用して、複数システムを1コマンドで起動できるよう設定する
        • Rails Migrationチートシート
        • GithubのプライベートリポジトリをGemfileで参照する方法
        • ActiveSupportのto_jsonメソッドの注意点
        • 危険なJSON出力を禁止するRuboCopカスタムルールの作成方法
      • Scala
        • Validated を直列に処理したい
      • DB
        • PostgreSQLにおける、削除行に対するロック獲得時の挙動
    • フロントエンド
      • React
        • Storybookを利用したビジュアルリグレッションテスト
  • インフラ開発
    • AWS
      • IAM
        • スイッチロールの設定手順
        • AWS CLIでのスイッチロールの設定手順
        • AWS Vaultを使ったスイッチロール設定手順
        • Github ActionsでIAMロールを利用してAWSリソースを操作する
      • ECS
      • SES
        • AWS SESメールボックスシミュレーターにて、カスタムヘッダや添付ファイル付きのテストEメールを送信する
      • CloudWatch
        • Amazon SNS + Slack Workflowを使って、CloudWatch Alarmの通知をSlackチャンネルへ投稿する
      • Lambda
        • lambrollでAWS Lambda関数をデプロイしたときのTips
    • Heroku
      • HerokuのStackの設定
      • Heroku Postgresの運用でよく使うコマンド集
  • セキュリティ
    • Web
      • Same Origin PolicyとCORS
      • 脆弱性診断 2社同時依頼実施記録
  • Mail
    • SPF、DKIM、DMARCを使用した迷惑メール対策
  • データ分析
    • データ分析プロセス
  • SaaS
    • Zendesk
      • 問い合わせフォームの項目をサービスごとに出し分け、各サービス担当者に自動で振り分けてメールで通知する
  • イベント
    • RubyKaigi
      • RubyKaigi 2023 に現地参加しました
    • EMConf
      • EMConfJP2025_参加レポート
  • やってみた
    • IoT
      • Raspberry Pi + PaSoRi + Python で、勤怠打刻マシンを作ってみた
  • Precena Tech Book 管理
    • コンテンツ執筆時のルール
  • 関連リンク
    • プレセナエンジニア公式Twitter
GitBook提供
このページ内
  • to_jsonメソッドの注意点
  • 解決策
  • only
  • except
  • include
  • methods

役に立ちましたか?

PDFとしてエクスポート
  1. ソフトウェア開発
  2. バックエンド
  3. Ruby on Rails

ActiveSupportのto_jsonメソッドの注意点

to_jsonメソッドの注意点

ActiveSupportには、to_jsonという便利なメソッドがあります。 Railsで開発しているときに使う場面としては、DBから取得したレコードをAPIのレスポンスとして返す場合があります。

しかし、deviseを認証に使っているサービスなどで、何も考えずに、user.to_jsonのようなコードを書いてしまうと、以下のようなJSONがレスポンスに返されてしまいます。

{
  \"id\":1111111,
  \"email\":\"xxxxx@yyyyy.zzzzz\",
  \"created_at\":\"2023-09-06T14:29:22.188+09:00\",
  \"updated_at\":\"2023-09-06T15:29:38.638+09:00\",
  \"last_sign_in_user_agent\":\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36\"
  }

出力される属性がこれだけなら、それほど大きな問題がないようにも見えます。しかし、userモデルには、サービスへの機能追加に伴ってプライベートな情報が追加されやすいため、そういった情報がto_jsonメソッドで出力されてしまったり、あるいは、本人以外のuser情報も併せて一覧で取得するような場合に、他人の emailやプライベートな情報が含まれてしまったりすると個人情報の漏洩問題になる可能性があります。

したがって、to_jsonメソッドで出力する属性を制限するべきかどうかについて、注意し検討する必要が出てきます。

解決策

幸い、to_jsonメソッドでは、オプションを指定することで、出力を絞り込むことができます。

option
内容

only

特定の属性のみに絞り込む場合に使います。

except

特定の属性を除外したい場合に使います。

include

特定のassociation(has_manyやbelongs_toで指定しているような別のモデル)を出力に含めたい場合に使います。

methods

特定のメソッドを呼び出した結果を含めたい場合に使います。

methodsオプションは、特定の属性を絞り込むというよりかは、追加で情報を出力する用途に使いますが、関連する機能なので併せて説明します。

以下、各オプションの使用例を示します。

only

さきほどの例で、onlyを指定すると、以下のように指定した属性だけが出力されます。

> user.to_json(only: [:id])
=> "{\"id\":1111111}"

except

さきほどの例で、exceptを指定すると、以下のように指定した属性以外のものが出力されます(※)。 ※読みやすくするために、改行を入れています。

> user.to_json(except: [:email])
=> 
{
  \"id\":1111111,
  \"created_at\":\"2023-09-06T14:29:22.188+09:00\",
  \"updated_at\":\"2023-09-06T15:29:38.638+09:00\",
  \"last_sign_in_user_agent\":\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36\"
}

include

さきほどの例で、includeを指定すると、以下のように指定したassociationの属性も併せて出力されます(※)。 ※ some_associationという属性がある前提です。

> user.to_json(include: [:some_association])
=> 
{
  \"id\":1111111,
  \"created_at\":\"2023-09-06T14:29:22.188+09:00\",
  \"updated_at\":\"2023-09-06T15:29:38.638+09:00\",
  \"last_sign_in_user_agent\":\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36\",
  \"some_association\":{\"id\":222222,\"name\":\"名前1\"}
}

なお、includeで指定したassociation内でも出力する属性を制限したい場合は、以下のように書けます。

> user.to_json(include: [{some_association: {only: :name}}])
=> 
{
  \"id\":1111111,
  \"email\":\"xxxxx@yyyyy.zzzzz\",
  \"created_at\":\"2023-09-06T14:29:22.188+09:00\",
  \"updated_at\":\"2023-09-06T15:29:38.638+09:00\",
  \"last_sign_in_user_agent\":\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36\",
  \"some_association\":{\"name\":\"名前1\"}
}

methods

さきほどの例で、methodsを指定すると、以下のように指定したメソッドの呼び出し結果も併せて出力されます(※)。 ※some_methodというメソッドがある前提です。

> user.to_json(methods: [:some_method])
=> 
{
  \"id\":1111111,
  \"email\":\"xxxxx@yyyyy.zzzzz\",
  \"created_at\":\"2023-09-06T14:29:22.188+09:00\",
  \"updated_at\":\"2023-09-06T15:29:38.638+09:00\",
  \"last_sign_in_user_agent\":\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36\",
  \"some_method\": \"some_output\"}
}

本サイトの更新情報は、X(旧Twitter)の株式会社プレセナ・ストラテジック・パートナーズエンジニア公式で発信しています。ご確認ください。

前へGithubのプライベートリポジトリをGemfileで参照する方法次へ危険なJSON出力を禁止するRuboCopカスタムルールの作成方法

最終更新 1 年前

役に立ちましたか?