복붙노트

[RUBY-ON-RAILS] 강력한 매개 변수가 중첩 된 속성에 대한 모든 속성을 허용

RUBY-ON-RAILS

강력한 매개 변수가 중첩 된 속성에 대한 모든 속성을 허용

nested_attributes 모델의 모든 속성을 허용하는 강력한 매개 변수 방법이 있나요? 다음은 샘플 코드입니다.

class Lever < ActiveRecord::Base
 has_one :lever_benefit
 accepts_nested_attributes_for :lever_benefit
end

class LeverBenefit < ActiveRecord::Base
  # == Schema Information
  #  id          :integer          not null, primary key
  #  lever_id    :integer
  #  explanation :text
end

간 강력한 매개 변수의 난 현재이 쓰고

def lever
 params.require(:lever).permit(:name,:lever_benefit_attributes => [:lever_id, :explanation])
end

내가 명시 적으로 lever_id 및 설명과 같은 속성 이름을 부여하지 않고 모든 속성을 허용하기 위해 쓸 수있는 중첩 된 속성에 대한 방법이 있나요?

참고 : 허용이 문제와 혼동하지 마십시오! 또는 허가 (모든)이 중첩 된 속성에 대한 모든 허용을위한

해결법

  1. ==============================

    1.강력한 매개 변수의 요점은 그 이름에 : 당신의 입력 매개 변수를 강하게 만든다. 당신이 반드시 사용자에 의해 업데이트되지 않도록하려면 값을 삽입하는 사람을 허용하는 것처럼 모든 매개 변수를 허가하는 것은 매우 좋은 생각 일 것이다.

    강력한 매개 변수의 요점은 그 이름에 : 당신의 입력 매개 변수를 강하게 만든다. 당신이 반드시 사용자에 의해 업데이트되지 않도록하려면 값을 삽입하는 사람을 허용하는 것처럼 모든 매개 변수를 허가하는 것은 매우 좋은 생각 일 것이다.

    당신이주는 예에서, 당신은 당신이 현재 제공하는 데 필요한 두 개의 매개 변수를 언급 : [: lever_id : 설명].

    모든 매개 변수를 허용하는 경우 누군가가 다른 값을 변경하는 것이 가능하다. created_at 또는 예 lever_id.

    이것은 확실히 보안 문제가 될 것입니다 당신이 그것을하지 말아야 할 이유입니다. 명시 적으로 당신이 그것을 할 때 지루한을 보일 수 있습니다 모든 속성을 지정. 그러나 이것은 응용 프로그램이 보안을 유지하는 것이 필요하다.

    편집 : 사람들이 downvoting하십시오. 이것은 당신이 찾고있는 해답이 될하지 않을 수 있습니다,하지만 당신이 필요로하는 답변입니다. 모든 중첩 된 속성을 허용 목록에 튼튼 PARAMS이 당신을 보호하기 위해 노력하고, 당신이 그것을 제거하고 있다는 엄청난 보안 결함이다. strong_params 구축으로 이어질 무엇인지 봐, 어떻게 당신을 위해 나쁜 될 수 있습니다 사용하지 : https://gist.github.com/peternixey/1978249

  2. ==============================

    2.중첩 된 PARAMS 해시에서 임의의 키를 허용 어디 발생했습니다 유일한 상황은 직렬화 된 컬럼에 기록 할 때입니다 나에게 합리적인 것 같다. 나는이처럼 그것을 처리하기 위해 관리했습니다 :

    중첩 된 PARAMS 해시에서 임의의 키를 허용 어디 발생했습니다 유일한 상황은 직렬화 된 컬럼에 기록 할 때입니다 나에게 합리적인 것 같다. 나는이처럼 그것을 처리하기 위해 관리했습니다 :

    class Post
      serialize :options, JSON
    end
    
    class PostsController < ApplicationController
      ...
    
      def post_params
        all_options = params.require(:post)[:options].try(:permit!)
        params.require(:post).permit(:title).merge(:options => all_options)
      end
    end
    

    옵션 키 : 물론 우리는의 존재를 필요로하지 않는 차종을 시도해보십시오.

  3. ==============================

    3.사실 그냥 흰색 - 목록 방법 중첩 된 모든 매개 변수가있다.

    사실 그냥 흰색 - 목록 방법 중첩 된 모든 매개 변수가있다.

    params.require(:lever).permit(:name).tap do |whitelisted|
      whitelisted[:lever_benefit_attributes ] = params[:lever][:lever_benefit_attributes ]
    end
    

    이 방법은 다른 솔루션에 비해 장점이있다. 그것은 깊은 중첩 된 매개 변수를 허용 할 수 있습니다.

    다른 솔루션은 좋아하지만 :

    nested_keys = params.require(:lever).fetch(:lever_benefit_attributes, {}).keys
    params.require(:lever).permit(:name,:lever_benefit_attributes => nested_keys)
    

    하지 마십시오.

    출처:

    https://github.com/rails/rails/issues/9454#issuecomment-14167664

  4. ==============================

    4.먼저, 당신이 정말 중첩 된 해시 값을 모두 허용 할 것을 확인합니다. 보안 취약점의 잠재적 인 개방을 이해하는 데미안 마티유의 대답을 통해 읽기 ...

    먼저, 당신이 정말 중첩 된 해시 값을 모두 허용 할 것을 확인합니다. 보안 취약점의 잠재적 인 개방을 이해하는 데미안 마티유의 대답을 통해 읽기 ...

    당신이 여전히 필요하면 / 당신이 코드의 다음 비트를 사용하여 달성 할 수있다 (완벽하게 유효한 사용 사례, 예를 들어 레코드에 대한 구조화, 사용자가 제공 한 메타 데이터를 저장이 거기에있다) 해시에서 모든 값을 허용 할 :

    def lever_params
      nested_keys = params.require(:lever).fetch(:lever_benefit_attributes, {}).keys
      params.require(:lever).permit(:name,:lever_benefit_attributes => nested_keys)
    end
    

    참고 :.이 TF 매우 유사하다의 대답하지만 당신이 어떤 허가되지 않은 매개 변수를받지 않습니다 때문에 더 우아한 조금 : 경고 / 오류를 lever_benefit_attributes.

  5. ==============================

    5.시험

    시험

    params.require(:lever).permit(:name, leave_benefit_attributes: LeaveBenefit.attribute_names.collect { |att| att.to_sym })
    
  6. from https://stackoverflow.com/questions/17810838/strong-parameters-permit-all-attributes-for-nested-attributes by cc-by-sa and MIT license