Являются ли параметры метода .order в ActiveRecord дезинфицированными по умолчанию?
Я пытаюсь передать строку в метод .order, например
Item.order(orderBy)
Мне было интересно, будет ли orderBy подвергаться дезинфекции по умолчанию, а если нет, то какой лучший способ его дезинфицировать.
Ответы
Ответ 1
Заказ не подвергается санитарной обработке. Этот запрос фактически удалит таблицу Users:
Post.order("title; drop table users;")
Вам нужно проверить переменную orderBy
перед запуском запроса, если какой-либо способ orderBy
может быть испорчен из пользовательского ввода. Что-то вроде этого может работать:
items = Item.scoped
if Item.column_names.include?(orderBy)
items = items.order(orderBy)
end
Ответ 2
Они не дезинфицируются так же, как предложение .where
с ?
, но вы можете использовать #sanitize_sql_for_order
:
sanitize_sql_for_order(["field(id, ?)", [1,3,2]])
# => "field(id, 1,3,2)"
sanitize_sql_for_order("id ASC")
# => "id ASC"
http://api.rubyonrails.org/classes/ActiveRecord/Sanitization/ClassMethods.html#method-i-sanitize_sql_for_order
Ответ 3
Я использую что-то вроде следующего:
@scoped = @scoped.order Entity.send(:sanitize_sql, "#{@c} #{@d}")
Где Entity - класс модели.