Является ли ActiveSupport :: CoreExtensions :: String :: Inflections.constantize безопасным для использования с данными, предоставленными пользователем? - PullRequest
3 голосов
/ 27 октября 2009

Фон

В настоящее время я работаю над приложением Rails.У меня есть разные продукты, которые можно обрабатывать у разных поставщиков.Всем поставщикам требуется текстовый файл в определенном формате для обработки заказов.

Я решил использовать класс Factory для генерации экземпляров классов Formatter, которые будут отображать информацию о заказе в правильном формате.

В фабричном классе я думал об использовании следующего кода:

class ExportFactory
  def self.exporter_class_for_vendor(vendor_name)
    class_name = "ProductExporter#{vendor_name}".gsub(' ','').camelize
    class_name.constantize
  end
end

Вопрос

Будет ли сохранено использование ActiveSupport :: CoreExtensions :: String ::Inflections.constantize на данных, предоставленных пользователем?Или я должен просто жестко закодировать имена классов.

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

1 Ответ

5 голосов
/ 27 октября 2009

Это должно быть безопасно, но это зависит от того, что вы делаете с ним после.

Если, например, вы позже вызываете #delete для класса, ввод File будетопасный.

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

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

module AvailableClasses
  Foo = ::Foo
  Bar = ::Bar
end

validates_inclusion_of :user_input, :in => AvailableClasses.constants

AvailableClasses.const_get(user_input)

"AvailableClasses::#{user_input}".constantize
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...