Ложное предупреждение о массовом назначении выдается Брекманом Gem в model.new и model.update_attibutes и model.create

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

User.new(params[:user])

Хотя я не использую хеш напрямую для сопоставления с полями, доступными в таблице. Вместо этого я делаю что-то вроде:

User.new(:first_name => params[:first_name], :last_name => params[:last_name ], :address => params[:address])

или же

user.update_attributes(:first_name => params[:first_name], :last_name => params[:last_name ], :address => params[:address])

Почему это приводит к уязвимости массового назначения? Так как я не присваиваю хешу вслепую, я выборочно обновляю только несколько атрибутов таблицы.

Одним из решений этой проблемы является следующее:

user = User.new
user.first_name = params[:first_name]
user.last_name = params[:last_name ],
user.address = params[:address]
user.save

Но это похоже на написание ненужного кода, так что Brakeman не предупреждает об этом как о проблеме. Это на самом деле делает то же самое в 4 строки вместо одной строки.

Может кто-нибудь, пожалуйста, объясните мне, в чем здесь проблема, или подтвердите, что это ложное предупреждение, а также есть ли способ предотвратить появление этого ложного предупреждения?

Я использую ruby ​​1.8.7, Rails 2.3.2, Brakeman 3.0.5

1 ответ

Решение

Возможны проблемы массового присвоения со значениями из-за accepts_nested_attributes_for, Однако, если вы не используете accepts_nested_attributes_for тогда это, вероятно, ложный положительный результат.

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

Вы можете использовать конфигурацию игнорирования Brakeman, чтобы игнорировать ложные срабатывания. Вы также можете игнорировать предупреждения о слабой уверенности, запустив Brakeman с -w 2, Также можно отключить предупреждения о массовых назначениях с помощью -x MassAssignment но я бы не советовал, так как вы используете древнюю (и, вероятно, очень уязвимую) версию Rails.

Другие вопросы по тегам