USER_PUBLIC_FIELDS の扱いについて

問題

  • いくつかの api で email を secret にしているユーザーの email が漏洩しているのを確認した。
    • USER_PUBLIC_FIELDS を用いて populate した user 情報をそのまま返しているのが問題である。

対応

  • https://github.com/weseek/growi/pull/3530 external_link にて email が漏洩している箇所を修正した。
  • routes で用いていた USER_PUBLIC_FIELDS を除外してデータ取得後に serializeUserSecurely を使用するようにした。
  • models/page でも USER_PUBLIC_FIELDS を使用している場所があるが以下の理由により修正をしない
    • 影響範囲が大きく使用している箇所を漏れなく特定するのが困難なため
      • 撲滅したときに漏れがあり password が公開されてしまうのを防ぐため
    • 管理ページでも使用されることがあり、その場合は USER_PUBLIC_FIELDS での制限で事足りる
    • USER_PUBLIC_FIELDS の存在自体が悪ではなく、それを routes で使用してしまうことによる人的ミスが問題。
      • models/page で存在することに問題はない。
  • USER_PUBLIC_FIELDS という命名が誤解を招くので USER_FIELDS_EXCEPT_CONFIDENTIAL に rename を行った。

今後の対応

  • https://dev.growi.org/5f3e0b4e21b23d00487da698#開発にあたって の方針と同じく以下のことに気を付ける
    • route, service 層では、全ての情報を取得した後 serializeHoge を使用して秘匿化するまでが責務
      • セーフティネットとして models/page で USER_FIELDS_EXCEPT_CONFIDENTIAL を使った populate は残るが、信頼しない
      • 新たに USER_FIELDS_EXCEPT_CONFIDENTIAL を使うメソッドを作成しない