15

대량 할당시 보안 위험을 방지하는 공식적인 방법은 attr_accessible입니다. 그러나 일부 프로그래머는 이것이 모델에 대한 직업이 아니라고 생각합니다 (또는 은 모델에 대해서만이 아닙니다).왜 params 해시를 분할하면 대량 할당시 보안 문제가 발생합니까?

@user = User.update_attributes(params[:user].slice(:name)) 

설명서에 명시 그러나 : 컨트롤러에 그것을하는 가장 간단한 방법은 PARAMS에게 해시 분할됩니다

참고 attr_accessible 의 장소에 조각을 제외하고 또는 해시 # 해시 #을 사용하여 속성을 살균하는 것은 충분한 보호를 제공하지 못합니다.

왜 그렇습니까? 매개 변수의 허용 목록 슬라이싱으로 충분한 보호 기능이 제공되지 않는 이유는 무엇입니까?

UPDATE :Rails 4.0 will ship strong-parameters, 매개 변수의 세련된 슬라이스, 그래서 전체 슬라이스 것은 결국 그렇게 나쁘지 않았다 같아요.

+1

처음에는 불편할뿐입니다. 'attr_accesible'을 사용하면 (저장하지 않고) 모델에서': name'을 사용할 수 있지만,'.slice'를'params' 해시에서 제외하면 그렇게 할 수 없습니다. 'attr_accessible'을 사용하는 것은 훨씬 더 의미가 있습니다. 왜냐하면 다른 사람들에게 모델과의 속성 관계를 알려주고 있기 때문입니다. – Alex

+3

@Alex : * attr_accessible *은 대량 할당을 관리하는 편리한 방법이라는 것을 알고 있습니다. 좋습니다.하지만 params [: xyz] .slice를 사용하는 보안 구멍은 무엇입니까? – tokland

+0

레코드의 경우 [attr_accessible] (http://api.rubyonrails.org/classes/ActiveModel/MassAssignmentSecurity/ClassMethods.html#method-i-attr_accessible)에 다음과 같이 표시됩니다. "* 해시 # except 또는 해시 # 슬라이스 사용 attr_accessible to satitize 속성은 기본적으로 동일한 기능을 제공하지만 중첩 된 속성을 처리하는 것은 약간 까다 롭습니다. ""또한 [Edge API] (http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters .html)을 사용하여 Rails 4 문서를 미리 읽고, 레일스 4 이전에 무엇을 사용할 지에 대해서는 [strong_parameters plugin] (https://github.com/rails/strong_parameters)을 참조하십시오. – user664833

답변

6

컨트롤러의 슬라이스 및 예외 문제는 모델에서 accept_nested_attributes_for과 함께 발생할 수 있습니다. 중첩 된 특성을 사용하는 경우 컨트롤러에서 업데이트하는 모든 위치의 매개 변수를 조각화해야합니다. 특히 중첩 된 시나리오의 경우 항상 쉬운 작업은 아닙니다. attr_accesible을 사용하면이 문제가 발생하지 않습니다.

+0

아아 (nested attributes),이 경우'params '를 필터링하는 것은 실제로 불쾌한 일이 될 것입니다. – tokland

2

params 해시에서 : name을 제거하면 해당 작업의 속성을 설정하지 못하게됩니다. 그것은 당신이 기억하는 행동에 대해서만 작동합니다.

그러나이 방법은 연결에 자동으로 추가되는 모든 방법을 사용하여 남용을 방지하지 않습니다.

class User < ActiveRecord::Base 
    has_many :comments 
end 

는 PARAMS에서 comments 속성을 삭제할 경우에도 comments_ids 속성을 설정 누군가를 위해 당신이 취약 떠날 것이다.

연관을 위해 추가 된 메소드가 많으므로 나중에 변경 될 수 있으므로 attr_accessible을 사용하여 모델에서 속성을 보호하는 것이 가장 좋습니다. 이렇게하면 이러한 종류의 공격이 가장 효과적으로 중단됩니다.

+2

해시 # 슬라이스는 허용 목록에 사용됩니다 : {: comments_ids = > [1,2,3], : name => 'hello'}. slice (: name) # => {: name => "hello"}. 가능한 일이 잘못 될 수 있는지 없는지 (위험한 문구 :-)) – tokland

+1

어쨌든, 내가 말했듯이, 왜 * attr_accessible *가 대량 할당 보안을 처리하는 좋은 방법인지 이해합니다. 그러나 슬라이스에 무엇이 잘못되었는지, 여분의 보안이 제공하는 것은 무엇인지 궁금했습니다. * attr_accessible *? – tokland

+2

attr_accessible은 각 컨트롤러에 모든 모델을 넣지 않고도 항상 모든 액션에서 모델을 보호합니다. –

4

레일 4에서 매개 변수를 분할하면 대량 할당 보안을 처리하는 데 선호되는 방법입니다. Rails 핵심 팀은 이미이를 처리 할 플러그인을 이미 개발했으며 중첩 된 속성 및 서명 된 양식에 대한 지원을 통합하기 위해 노력하고 있습니다. 체크 아웃 할 항목 : http://weblog.rubyonrails.org/2012/3/21/strong-parameters/

+1

"기본 아이디어는 질량 할당 보호를 모델에서 컨트롤러가 속한 컨트롤러로 옮기는 것입니다." 좋은. – tokland

0

@tokland 귀하의 마지막 코멘트는 일부 유효하지 않습니다. 귀하의 웹 사이트가 데이터가 들어오고 나가는 유일한 진입 점으로 브라우저를 가지고 있지 않은 한.

웹 응용 프로그램에 API가 있거나 컨트롤러 수준에서 다른 API의 보호 기능과 통신하면 그 뒤에 배후의 구멍이 생기고 다른 소스의 모든 데이터는 삭제되거나 검사되지 않습니다. 나는 그대로 유지하는 것이 좋습니다. 대량 할당 application.rb에서 보호하고 장고/파이썬 스타일처럼 작동하도록 ActiveSupport FormHelpers를 발전시키는 것이 좋습니다.혼자 화이트리스트 대 컨트롤러 슬라이스에 DHH에서

+0

내 의견 중 하나는 무엇입니까? 나는이 페이지에서 많은 것을 썼다 :-) 어쨌든, 나는 API 나 브라우저 폼을 갖는 것의 차이점을 보지 못했다. 물론 요점은 사용자가 속성을 변경하여 가정하지 않은 속성을 업데이트하지 못하도록하는 것입니다. – tokland

+0

@tokland "기본 아이디어는 대량 할당 보호를 모델에서 컨트롤러가 속한 컨트롤러로 옮기는 것입니다." – theCrab

+0

링크 된 기사의 인용문입니다. 그러나 나는 이것이 모델과 컨트롤러 모두를위한 작업이라고 생각한다. – tokland

4

재미있는 요점 :

https://gist.github.com/1975644 컨트롤러 내에서이를 관리 할 필요가 강화

class PostsController < ActionController::Base 
    def create 
    Post.create(post_params) 
    end 

    def update 
    Post.find(params[:id]).update_attributes!(post_params) 
    end 

    private 
    def post_params 
     params[:post].slice(:title, :content) 
    end 
end 

설명 : 개인적으로

https://gist.github.com/1975644#gistcomment-88369

I을 둘 다 적용하십시오 - 예기치 않은 결과가 발생하지 않도록 slice와 함께 attr_accessible을 적용하십시오. 절대 블랙리스트에 의존하지 마십시오!

관련 문제