1

attr_accessible의 보안 위협에 대해 많은 이야기가 있습니다. 여기에 문제가 있습니다.attr_accessible에 대한 문제와 설명이 필요합니다

attr_accessible :body,:sender_id,:recipient_id 

내가 내 messages_controllerupdate 또는 edit 조치를하지 않아도 : 나는 다음이있는 Message 모델을 가지고있다. newcreate 작업을 통해 새 메시지를 만들고이를받는 사람에게 보낼 수 있습니다. 로그인하고 특정 조건을 충족하는 사용자 만이 서로 메시지를 보낼 수 있습니다. 나는 before_filter의 도움으로 그 일을하며 조건은 잘 작동합니다. 메시지는 저장되며 senderrecipient으로 볼 수 있습니다. 완전한!

내가 가진 질문은 :body,:sender_id,:recipient_idattr_accessible에 포함되어 있기 때문에 악의있는 ​​사용자가 어떻게 든 원래 메시지의 :body,:sender_id,:recipient_id을 바꿀 수 있습니까? 이 속성을 attr_readonly에도 추가하면 저장된 후에 수정할 수 없습니까?

이 질문은 나를 실제로 괴롭 히고있다.

답변

3

악의적 인 사용자가 some : body, : sender_id, : recipient_id 원본 메시지를 어떻게 변경할 수 있습니까?

이것은 다른 것보다는 attr_accesible에 달려 있습니다. attr_accesible은 일괄 지정을 사용하여 업데이트 할 수있는 필드 만 필터링합니다. update 조치가 없다고 했으므로 이제는 사용자가 조치를 작성하여 항상 Message을 새로 작성하므로 사용자가 메시지를 편집 할 수있는 방법이 있습니다.

하지만 신경 써야 할 것이 있습니다. sender_id은 무엇입니까? 앱에 사용자가 있고 서로 메시지를 보내는 경우 sender_id은 사용자가 다른 사용자를 대신하여 메시지를 보낼 수 있으므로 액세스 할 수있는 필드이 아니어야합니다. 당신은 아마 이런 식으로 뭔가를 attr_accessible 목록 떨어져 해당 필드를 유지하고 싶지 :

m = Message.new params[:message] # body and recipient_id 
m.sender_id = current_user.id # this is not mass assignment 
m.save 
..... 
+0

sender.id == current_user.id. 그것이 내가 현재 가지고있는 방법입니다. 이것에도 불구하고 위협이 있습니까? – pratski

+1

왜 sender_id를리스트에 넣을까요? 대량 할당이 허용 된 필드가 아니어야합니다. – aromero

1

글쎄, 그것은 당신이 모델의 인스턴스를 생성하는 방법에 따라 달라집니다. 당신이 사용하는 경우 :

FooModel.create(params[:foo]) 

을 명시 적으로 이러한 속성에 대한 필드를 형성 제공하지 않는 경우에도 로그인 한 사용자 A가 요청에 추가 매개 변수를 전달할 수 있기 때문에 다음 네, 당신은 안전하지 않습니다.

sender_id, recipient_id (요청의 값)를 사용하여 '만들기'작업에 게시하는 모든 사용자는 작업에 신경 쓰지 않는 한 을 변경할 수 있습니다.

+0

알았습니다. 감사. 나는 행동에서 배정을 돌본다. 예를 들어 보낸 사람은 current_user이고받는 사람은 params를 통해 가져옵니다. 그러나받는 사람은 숨겨진 필드를 통해 가져오고 설정된 사용자를가집니다. – pratski

+1

그런 다음 attr_accessible에서 sender_id를 제거하고 명시 적으로 조치로 설정해야합니다. –

+0

2 개의 정답을 고를 수 있으면 좋겠다. – pratski

관련 문제