нужна ли защита массового назначения в модели без контроллера?

У меня такая модель:

class Page < ActiveRecord::Base
  attr_accessible :page_id, :name, :page_url, :username
end

и у него нет связанного контроллера, но в другом контроллере я выполняю этот код:

fgraph  = Koala::Facebook::API.new(ftoken)

@pages = fgraph.fql_query("select XXX from pages where xxx")

@pages.each do |p|

    newpage = Page.find_or_initialize_by_page_id("#{p["page_id"]}")
    newpage.update_attributes(
      name: p["name"],
      username: p["username"],
      page_url: p["page_url"]
      )
end

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


person Fran Martinez    schedule 12.02.2013    source источник
comment
Если этот метод изменяет какие-либо атрибуты, кроме упомянутых в списке, rails выдаст ошибку. Если нет, то все будет нормально. Это не имеет ничего общего с контроллером. Вы не можете изменять недоступные атрибуты из любого места в вашей кодовой базе.   -  person Arindam    schedule 13.02.2013
comment
этот метод изменяет все атрибуты из класса Page. Они должны быть доступны, потому что мне нужно написать в этом классе некоторую информацию из facebook. В коде нет метода обновления PagesController или pages #, только this.   -  person Fran Martinez    schedule 13.02.2013
comment
Это отличный ответ: [stackoverflow.com/questions/2652907/ [1]: stackoverflow.com/questions/2652907/   -  person Fran Martinez    schedule 13.02.2013


Ответы (1)


Да, это. Верно, что атрибуты из белого списка можно обновить из любого другого места с помощью массового назначения.

update_attributes - это метод rails, который принимает хэш пар attr-value и пытается применить его к объекту и сохранить. Прежде чем save вернется успешно, все model validations запускаются, чтобы увидеть, можно ли выполнить операцию сохранения.

Поскольку в вашем случае обновление нацелено на поля из белого списка, ваш метод работает нормально. В тот день, когда ваш метод попытается обновить любой другой атрибут, скажем, date_of_birth, метод выйдет из строя, заявив, что date_of_birth не может быть обновлено массово.

В целях безопасности данных вам следует использовать дезинфицирующие средства для направляющих, желательно по адресу время записи или время чтения. Это обеспечит

  1. Представленные данные читабельны и не уродливы (как правило, вводимые пользователем данные)
  2. Данные в таблицах безопасны для HTML
  3. Не вызывает никаких инъекций кода.
person Arindam    schedule 13.02.2013