2012-07-06 2 views
0

나는이 질량 할당 문제에 대해 약간 혼란 스럽다. 이름 로그인, 업데이트 방법은 트리거 편집하는 동안 비밀번호 이메일Ruby-On-Rails 대량 할당에서 하나 이상의 필드 지정을 어떻게 억제 할 수 있습니까?

:

def update 
    @user = User.find(params[:id]) 
    if @user.update_attributes(params[:user]) 
    .... 
end 

내 머리에 여기에 내 질문에

말은 나는 다음과 같은 속성을 가진 사용자 모델을 가지고 있어요 암호/전자 메일/로그인이 손상되는 것을 원하지 않기 때문에이 속성 중 전부는 아니더라도 대부분을 보호하는 것이 좋습니다.

그래서 다른 모든 속성은, 이름에서 잡담은 대량 할당 할 수 없을 것입니다 이름 : 그래서

attr_accessible 모델에서이 작업을 수행 할 것입니다.

이렇게하면 유효한 편집 양식은 어떻게 작동합니까? @ user.email = params [: user] [: email] 등의 업데이트 메소드에서 속성을 하나씩 할당해야합니까? 또는 나는 아마 뭔가를 오해하고 있는가?

감사합니다.

편집 :

더 구체적으로 :

은 보통 보호 관리자 속성의 예를 참조하십시오. 그리고 그것은 의미가 있습니다.

하지만 비밀번호 또는 이메일 속성은 어떻게됩니까? 그것들은 보통 보호되지 않습니다. 왜 비밀 번호는 보호되지 않았을까요? 잠재적으로 누군가가 전자 메일을 재설정하고 암호 재설정을 수행하거나 암호 속성을 재설정하여 시스템에 액세스 할 수 있음을 의미 할 수 있습니다.

+0

제목을 편집했습니다. 잘하면 그것은 당신이 묻는 질문을 캡처합니다. 원래 제목은 쓸모가 없었습니다. –

+0

내가 그걸 요구하지 않아서 그것이 맞는 제목이라고 생각하지 않습니다. 보호가 어떻게 작동하는지에 대한 일반적인 질문이라고 생각합니다. 질문을 좀 더 명확하게 편집하려고합니다. – lsaffie

답변

1

는 시계 이것은 당신이 잘못된 방향으로 대량 할당 보안에 대해 생각 http://railscasts.com/episodes/26-hackers-love-mass-assignment/

을 railscasts. attr_accessbile은 암호 값을 공개하지 않습니다 (filter_parameter를 사용하여 해당 값을 숨김).

이렇게하면 사용자 폼이 생깁니다. 사용자가 암호를 사용하여 계정을 만들 수 있지만 관리자로 추가 할 수 없도록하려고합니다 (SQL 주입 또는 POST 매개 변수 조작을 통해이 작업을 수행 할 수 있습니다). 이것으로부터 보호하려면 이름, : 암호, : attr_accessible에 전자 메일을 입력하고 관리 필드를 생략하십시오.

+0

관리자 예제를 이해합니다. 암호 또는 전자 메일 부분을받지 못합니다. attr_accessible : email, : login, 공격자가이 두 가지 형식으로 할당 할 수 있습니까? 어떤 방법 으로든 업데이트 방법을 변경해야합니까? – lsaffie

+0

단순히 게시 요청 (대부분 폼)을 통해 사용자가 어떤 특성을 만들거나 업데이트 할 수 있어야하는지 명시하고 있습니다. –

+0

이 맞습니다.따라서 사용자 편집 양식에서 이름, 전자 메일 또는 암호를 편집 할 수 있습니다. 그렇지 않은 경우 보안 침해라고 생각하므로 이러한 모든 특성을 보호하고 싶습니다. 그렇게하면 update_attributes (params [: user])를 사용할 수 없게됩니다. 하나씩 user.email = params [: user] [: email], user.name = params [: user] [: name] 등으로 하나씩 처리해야합니다. 그러나, 그것은 나에게 지저분 해 보인다 .... – lsaffie

0

아이디어는 컨트롤러의 매개 변수를 필터링하는 것입니다 (as described here).

class PeopleController < ActionController::Base 
    # This will raise an ActiveModel::ForbiddenAttributes exception because it's using mass assignment 
    # without an explicit permit step. 
    def create 
    Person.create(params[:person]) 
    end 

    # This will pass with flying colors as long as there's a person key in the parameters, otherwise 
    # it'll raise a ActionController::MissingParameter exception, which will get caught by 
    # ActionController::Base and turned into that 400 Bad Request reply. 
    def update 
    redirect_to current_account.people.find(params[:id]).tap do |person| 
     person.update_attributes!(person_params) 
    end 
    end 

    private 
    # Using a private method to encapsulate the permissible parameters is just a good pattern 
    # since you'll be able to reuse the same permit list between create and update. Also, you 
    # can specialize this method with per-user checking of permissible attributes. 
    def person_params 
     params.required(:person).permit(:name, :age) 
    end 
end 
관련 문제