1

Существует так много написано об угрозе безопасности attr_accessible, что я начинаю задаваться вопросом, есть ли у меня какие-либо атрибуты. Вот проблема. У меня есть Message модели, которая имеет следующее:Проблема и уточнение, необходимые с attr_accessible

attr_accessible :body,:sender_id,:recipient_id 

я не имею действия update или edit в моем messages_controller. С действием new и create я могу создать новое сообщение и отправить его получателю. Только пользователи, которые вошли в систему и отвечают определенным условиям, могут сообщать друг другу. Я делаю это с помощью before_filter, и условия работают нормально. Сообщение сохраняется и может быть просмотрено на sender и recipient. Отлично!

Вопрос у меня есть, так как :body,:sender_id,:recipient_id включены в attr_accessible, может ли злоумышленник каким-то образом изменить :body,:sender_id,:recipient_id оригинального сообщения? Должен ли я просто добавлять эти атрибуты к attr_readonly, чтобы они не могли быть изменены после сохранения?

Этот вопрос преследует меня практически для всех моих моделей.

ответ

3

может злоумышленник каким-то образом изменить: 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]) 

тогда да, ваш не являются безопасными, так как зарегистрированный пользователь может передать дополнительные параметры запроса, даже если вы не предоставите явно образуют поля для этих атрибутов.

Таким образом, для случая, любой проводки в вашей «создать» действие с sender_id, recipient_id (значения в запросе) будет иметь возможность изменить их , если не позаботиться об этом присвоений в своем действии.

+0

Есть. Благодарю. Я занимаюсь заданиями в действии. Например, отправитель является current_user, тогда как получатель получается через params. Но получатель получается через скрытое поле и имеет заданного пользователя. – pratski

+1

Затем вы должны удалить sender_id из attr_accessible и установить его явно в своем действии. –

+0

Хотел бы я выбрать 2 правильных ответа! – pratski