$30 off During Our Annual Pro Sale. View Details »

Kaigi on Rails 2023 - ActiveSupport::CurrentAttributes: すっごく便利なのに嫌われ者?!

Kaigi on Rails 2023 - ActiveSupport::CurrentAttributes: すっごく便利なのに嫌われ者?!

ActiveSupport::CurrentAttributesを嫌う人がいますが、ものすごく便利、というのは言わざるを得ないです。 みんな大好きなグローバル変数を安全にリクエストの中で使える!本当に便利な優れものです。
なんで嫌われているのかについて話して、注意点など、これまでにあったセキュリティ欠陥(Pumaとrailsの組み合わせで、情報が漏洩されていたものがありまして。。。)の話などをして、みんなでActiveSupport::CurrentAttributesを使おう!とまではいかなくても、本当に使わないといけない時があれば一つの選択肢としてありますよ、ということを伝えたいです。

Sampo Kuokkanen

October 30, 2023
Tweet

Other Decks in Programming

Transcript

  1. ActiveSupport::CurrentAttributes:
    すっごく便利なのに嫌われ者?!

    Kaigi on Rails
    令和五年

    View Slide

  2. 自己紹介
    合同会社イービルマーシ
    ャンズ代表
    イービルマーシャンズの
    日本支社の色々やってま
    す!火星について知りた
    い方は連絡待ってます🤓
    日本の開発のお手伝いさ
    んも
    時々Ruby
    も書きたいの
    で、日本の会社のRails

    発のお手伝いも。最近は
    Hotwire
    にハマっていま
    す。
    KUOKKANEN SAMPO
    #THANKYOURUBY
    日本で暮らしている
    フィンランド人です。
    Ruby,
    ゴルフ、車が好
    きです。ホンダビート
    乗りです。

    View Slide

  3. View Slide

  4. なんで今日ActiveSupport::CurrentAttributes
    について話すねん?

    RAILS
    の便利な機能なのにあまり知られていない
    目的:発表聞いて、初心者でも実際にRAILS
    のプロジェクトに
    導入できるようになる
    もしかしたら古いコードでセキュリティ欠陥があるものもあ
    り、それをCURRENTATTRIBUTES
    に書き換えたら解消できる
    かもしれない

    View Slide

  5. 今日ActiveSupport::CurrentAttributes
    について話す内容
    1 どうやってRAILS
    に入った機能? 2 不具合とかあったかな。。。
    3 使い方 4 使わない方がいい?!?!

    View Slide

  6. NSX
    $variables
    どこからでもアクセスでき
    る!
    ビート
    CurrentAttributes
    1リクエストの間だけ、どこから
    でもアクセスできる!
    RUBY
    のグローバル変数、ホンダの車で例えるなら。。。

    View Slide

  7. View Slide

  8. View Slide

  9. 次のようなコード、あなたのプロジェクトに入ってます
    か?
    入ってたらCurrentAttributes
    に書き換えましょう!

    View Slide

  10. View Slide

  11. さっきのようなコード。。。
    使ってるウェブサーバーによっては大丈夫
    例えばUNICORN
    だと使って大丈夫!リクエスト
    はメモリースペースを共有していないため
    スレッド系のPUMA
    などだと、お掃除しないとヤ
    バいかも。。。

    View Slide

  12. 問題点をACTIVESTORAGE::CURRENTATTRIBUTES
    で解決!

    View Slide

  13. DHH
    様!

    View Slide

  14. View Slide

  15. View Slide

  16. View Slide

  17. なんでこのような機能がRails
    に追加されましたか?
    すでにBASECAMP,GITHUB
    など大きなアプリケーションでこ
    のパターンが使われていた
    DEEPLY NESTED,
    ネスティングが深いコードで毎回パラメータ
    ーとして渡さなくてもいい
    注意点、アプリケーションで最も重要なエンティティのみに使
    おう

    View Slide

  18. 不具合。。。
    問題発生!

    View Slide

  19. View Slide

  20. 使おう!の前にバージョンをご確認
    PUMA
    バージョン5.6.2
    以前とRAILS
    バージョン7.0.2.2
    以前で
    は、レスポンスボディがある一定条件だと閉じられず、これが
    情報漏洩を引き起こす可能性があった
    レスポンスボディが閉じられたら、リセット処理が走るが、閉
    じられないのなら、リセット処理も走らず、前のリクエストの
    データが残る可能性が!
    この問題は、PUMA
    のバージョン5.6.2
    と4.3.11
    、および
    RAILS
    のバージョン7.02.2
    、6.1.4.6
    、6.0.4.6
    、5.2.6.2
    で修
    正されています。
    修正されたバージョンにアップグレードするか、提供されたミ
    ドルウェアを使用して問題を回避できます。

    View Slide

  21. Puma
    の方でどうやって修正されたか?

    View Slide

  22. 自分のコードでもCurrent
    を使いたい!
    まずはCURRENT
    というモデルを作成

    View Slide

  23. View Slide

  24. View Slide

  25. View Slide

  26. テストはどうする?

    View Slide

  27. View Slide

  28. View Slide

  29. リクエストスペックはどう書
    く?

    View Slide

  30. View Slide

  31. 何も変更がない!!

    View Slide

  32. 便利だけど、反対意見もある
    有害?

    View Slide

  33. Ryan Bigg
     ー CurrentAttributes
    は有害である
    1
    グローバルステート、
    コードがわかりにくく
    なる
    2
    コードがテストしにく
    くなる
    3
    魔法/マジックすぎる 4
    明確に意図がわかるコ
    ードがいい
    HTTPS://TECHRACHO.BPSINC.JP/HACHI8833/2023_04_26/43810

    View Slide

  34. DHH
    の例

    View Slide

  35. View Slide

  36. VS

    View Slide

  37. VS

    View Slide

  38. HTTPS://EVILMARTIANS.JP
    ご視聴ありがとうございました!

    View Slide

  39. Twitter/X
    で電話かけたい方へ

    View Slide