2014-10-21 4 views
1

Я использую рельсы 2.3.2Как проверить, присутствует ли столбец в таблице?

У меня есть параметр, в котором у меня есть имя поля таблицы. Я хочу узнать, присутствует ли поле в таблице, чтобы предотвратить инъекцию sql.

User.find(:all, :group => params[:group], :conditions => { :admin => false }) 

Я хочу, чтобы убедиться, что PARAMS [: группа] представляет собой поле из таблицы, прежде чем на самом деле выполнения вышеуказанного запроса.

Каким образом можно узнать, что данное поле является допустимым полем таблицы?

+0

Итак, группа является одной из ваших столбцов таблицы 'users', правильно? –

+0

Мне нужна команда типа 'column_exists?'. Но этот метод существует для версий версии 3.x или выше. –

+0

правильные параметры [: group] - одно из полей таблицы. –

ответ

3

Вы можете использовать has_attribute?:

user = User.new 
user.has_attribute?(params[:group]) 
+1

Знать метод 'has_attribute?' Доступен только в том случае, если это возможно. Итак, это 'User.has_attribute? : foo' raise error, но эта работа 'User.first.has_attribute? : Foo'. –

+0

@ Зелёный Вы правы, я отредактировал ответ. – zwippie

3

Для случаев вы можете использовать:

user.has_attribute?(params[:group]) 

Для классов:

User.column_names.include?(params[:group]) 

Но ActiveRecord в методы создания запроса, такие как: where, group , order и т. Д., Равны защищен от SQL-инъекций, если вы не используете необработанные SQL-запросы. o Я бы не стал беспокоиться об этом.

+0

Параметр может иметь следующее значение 'params [: group] =" name UNION SELECT * FROM users "', что сделает его уязвимым –

+0

Я не могу отметить это, поскольку у меня уже есть другой ответ. оба ответа действительны, и я хочу отметить оба. как это сделать? –

+0

никак .. вам нужно выбрать один – Fer

Смежные вопросы