[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.강력한 매개 변수의 요점은 그 이름에 : 당신의 입력 매개 변수를 강하게 만든다. 당신이 반드시 사용자에 의해 업데이트되지 않도록하려면 값을 삽입하는 사람을 허용하는 것처럼 모든 매개 변수를 허가하는 것은 매우 좋은 생각 일 것이다.
강력한 매개 변수의 요점은 그 이름에 : 당신의 입력 매개 변수를 강하게 만든다. 당신이 반드시 사용자에 의해 업데이트되지 않도록하려면 값을 삽입하는 사람을 허용하는 것처럼 모든 매개 변수를 허가하는 것은 매우 좋은 생각 일 것이다.
당신이주는 예에서, 당신은 당신이 현재 제공하는 데 필요한 두 개의 매개 변수를 언급 : [: lever_id : 설명].
모든 매개 변수를 허용하는 경우 누군가가 다른 값을 변경하는 것이 가능하다. created_at 또는 예 lever_id.
이것은 확실히 보안 문제가 될 것입니다 당신이 그것을하지 말아야 할 이유입니다. 명시 적으로 당신이 그것을 할 때 지루한을 보일 수 있습니다 모든 속성을 지정. 그러나 이것은 응용 프로그램이 보안을 유지하는 것이 필요하다.
편집 : 사람들이 downvoting하십시오. 이것은 당신이 찾고있는 해답이 될하지 않을 수 있습니다,하지만 당신이 필요로하는 답변입니다. 모든 중첩 된 속성을 허용 목록에 튼튼 PARAMS이 당신을 보호하기 위해 노력하고, 당신이 그것을 제거하고 있다는 엄청난 보안 결함이다. strong_params 구축으로 이어질 무엇인지 봐, 어떻게 당신을 위해 나쁜 될 수 있습니다 사용하지 : https://gist.github.com/peternixey/1978249
-
==============================
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.사실 그냥 흰색 - 목록 방법 중첩 된 모든 매개 변수가있다.
사실 그냥 흰색 - 목록 방법 중첩 된 모든 매개 변수가있다.
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.먼저, 당신이 정말 중첩 된 해시 값을 모두 허용 할 것을 확인합니다. 보안 취약점의 잠재적 인 개방을 이해하는 데미안 마티유의 대답을 통해 읽기 ...
먼저, 당신이 정말 중첩 된 해시 값을 모두 허용 할 것을 확인합니다. 보안 취약점의 잠재적 인 개방을 이해하는 데미안 마티유의 대답을 통해 읽기 ...
당신이 여전히 필요하면 / 당신이 코드의 다음 비트를 사용하여 달성 할 수있다 (완벽하게 유효한 사용 사례, 예를 들어 레코드에 대한 구조화, 사용자가 제공 한 메타 데이터를 저장이 거기에있다) 해시에서 모든 값을 허용 할 :
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.시험
시험
params.require(:lever).permit(:name, leave_benefit_attributes: LeaveBenefit.attribute_names.collect { |att| att.to_sym })
from https://stackoverflow.com/questions/17810838/strong-parameters-permit-all-attributes-for-nested-attributes by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 콘솔 libreadline 때문에로드하지 않습니다 레일 (0) | 2020.03.01 |
---|---|
[RUBY-ON-RAILS] 레일 응용 프로그램에서 Omniauth-으로 OAuth2를 사용하여 토큰을 새로 고침 (0) | 2020.03.01 |
[RUBY-ON-RAILS] 한 번에 레일 양식 유효성 검사 오류 메시지 하나에 루비를 표시하는 방법 (0) | 2020.03.01 |
[RUBY-ON-RAILS] 탄성 콩 줄기 루비 / 레일은 자식이 그렇게 작품을 설치 번들 설치해야합니다 ..하지만 아니다 (0) | 2020.03.01 |
[RUBY-ON-RAILS] 카피 스트라 노 및 환경 변수 (0) | 2020.03.01 |