ActiveRecord 모델의 우발적 직렬화 방지

ActiveRecord 모델을 직렬화할 때 직렬화할 필드를 명시하지 않는 경우의 우발적 직렬화를 방지하기 위한 패치를 도입했습니다. 이 변경 사항은 포함할 필드를 우리가 제어할 수 있도록 하여, 불완전하거나 과도한 데이터가 노출될 수 있는 잠재적 문제를 방지합니다.

기본적으로 ActiveRecord 모델을 JSON으로 렌더링하면 모든 속성이 포함되지만, 많은 경우 이는 바람직하지 않을 수 있습니다. 더 나은 관행을 강제하기 위해 직렬화해야 할 필드를 명시해야 합니다.

사용 예시

잘못된 사용법:

def show
  @user = User.first
  render json: @user
end

개발 및 테스트 환경에서 이 경우 다음과 같은 결과가 발생합니다:

ActiveRecordSerializationSafety::BlockedSerializationError:
필드를 지정하지 않고 ActiveRecord 모델(User)을 직렬화하는 것은 허용되지 않습니다.
Serializer를 사용하거나 #serializable_hash에 :only 옵션을 전달하세요. 자세한 정보: https://meta.discourse.org/t/-/314495
./lib/freedom_patches/active_record_disable_serialization.rb:15:in `serializable_hash'

올바른 사용법:

  1. Serializer 사용
class UserSerializer < ApplicationSerializer
  attributes :id, :email
end

def show
  @user = User.first
  render json: @user, serializer: UserSerializer
end
  1. :only 옵션 사용
def show
  @user = User.first
  render json: @user.as_json(only: [:id, :email])
end

이 문서는 버전 관리됩니다 - 변경 사항을 github에서 제안하세요.

6개의 좋아요

실제로 이 문제를 겪는 분들을 위해 명확히 하자면, ActiveModel::Serialization의 직렬화 메서드, 예를 들어 as_json은 컨텍스트(스펙 포함)와 관계없이 only 옵션을 전달하지 않으면 오류가 발생합니다. 자세한 내용은 아래를 참고하세요.

예제는 아래를 참고하세요:

5개의 좋아요

게시물이 새 주제로 분리되었습니다: 새 직렬화 보호에 대한 도움말

글쎄, 21일이나 걸렸지만, 마침내 링크된 코드에서 말씀하신 내용을 적어도 한 가지 컨텍스트에서는 이해할 수 있게 되었습니다. 위에서 언급된 분할된 토픽에서 언급된 다른 한 가지도 이해했기를 바랍니다. 기억에 따르면, 문제가 정확히 어디에 있는지 잘 모르기 때문에 그쪽은 더 어려운 것 같습니다.

오늘을 구해주셔서 감사합니다 (아니면, 적어도 오늘만이라도). :beers:

다른 문제는 제 server 모델에 user 모델이 포함되어 있었고, server 시리얼라이저에서 user 모델의 사용자 시리얼라이저를 호출하거나(또는 필드를 제한해야) 했던 것이었습니다.

결국 제 server 모델에는 user 모델이 전혀 필요하지 않았습니다. (user_id_was는 이미 있었고, 실제로 그걸조차 필요로 하지 않을 가능성이 꽤 있습니다).

1개의 좋아요