Почему нарезка хеша params создает проблему безопасности при массовом назначении? - PullRequest
15 голосов
/ 20 сентября 2011

Официальным способом предотвращения угроз безопасности с помощью массового назначения является использование attr_accessible .Однако некоторые программисты считают, что это не работа для модели (или, по крайней мере, только для модели).Самый простой способ сделать это в контроллере - это разрезать params hash:

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

Однако в документации говорится:

Обратите внимание, что с использованием Hash #, кромеили Hash # slice вместо attr_accessible для очистки атрибутов не обеспечит достаточную защиту.

Почему это так? Почему нарезка белого списка параметров не обеспечивает достаточной защиты?

ОБНОВЛЕНИЕ: Rails 4.0 будет поставлять сильные параметры , улучшенная нарезка параметров, так что я думаю, что все срезы были не так уж и плохи.

Ответы [ 5 ]

6 голосов
/ 07 марта 2012

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

4 голосов
/ 30 ноября 2012

Интересная суть DHH при нарезке в контроллере по сравнению с одним белым списком:

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

Я лично применяю оба - attr_accessible with slice, чтобы ничего неожиданного не произошло.Никогда не полагайтесь только на черный список!

4 голосов
/ 23 марта 2012

Начиная с Rails 4, разделение параметров будет предпочтительным методом работы с безопасностью массового назначения. Основная команда Rails уже разработала плагин для решения этой проблемы и работает над интеграцией поддержки вложенных атрибутов и подписанных форм. Определенно что-то проверить: http://weblog.rubyonrails.org/2012/3/21/strong-parameters/

2 голосов
/ 20 сентября 2011

Простое удаление: name из хэша params не позволяет установить этот атрибут для этого действия.Он работает только для действий, которые вы помните, защищаете.

Однако эта практика не защищает вас от злоупотреблений, используя все методы, автоматически добавленные для ассоциаций.

class User < ActiveRecord::Base
  has_many :comments
end

сделает вас уязвимым длякто-то устанавливает атрибут comments_ids, даже когда вы удаляете атрибут comments из params.

Поскольку для ассоциаций добавлено довольно много методов, и поскольку они могут измениться в будущем, рекомендуетсячтобы защитить ваши атрибуты на модели, используя attr_accessible.Это наиболее эффективно остановит подобные атаки.

0 голосов
/ 03 мая 2012

@ tokland Ваш последний комментарий в некоторой степени неверен. Если на вашем веб-сайте браузер не является единственной точкой входа, где данные поступают и выходят.

Если ваше веб-приложение имеет API или взаимодействует с защитой другого API на уровне контроллера, это оставляет дыры, и все данные из других источников не подвергаются очистке или проверке. Я рекомендую оставить все как есть, включить массовое назначение защита в application.rb и перевести ActiveSupport FormHelpers для работы в стиле Django / Python.

...