Как оценить строку в ruby, если строка содержит команду ruby? - PullRequest
1 голос
/ 12 марта 2010

В моем случае

Я сохранял SQL-запрос в своей базе данных в виде текста. Я показываю вам одну запись, которая присутствует в моей базе данных

Query.all

:id  => 1, :sql => "select * from user where id = #{params[:id]}"

str = Query.first

Теперь 'str' имеет значение "select * from user, где id = # {params [: id]}"

Здесь я хочу разобрать строку как Если мои параметры [: id] равны 1, тогда

"выберите * у пользователя, где id = 1"

Я использовал eval (str). Это правильно?

Ответы [ 2 ]

4 голосов
/ 12 марта 2010

eval будет делать то, что вы описываете в этом случае. Однако это очень плохая идея , так как она подвержена SQL-инъекции . например рассмотрим, что произойдет, если params[:id] будет равно "1; удалить * из запросов".

Если вам нужен способ хранения произвольных запросов в вашей базе данных, вам лучше хранить параметризованную версию запроса:

select * from user where id = ?

и eval параметры отдельно.

1 голос
/ 12 марта 2010

Строка SQL, хранящаяся в базе данных, должна использовать параметры подстановки вместо кода Ruby. Строка SQL должна храниться в формате, показанном ниже:

   str = "\"SELECT * FROM users WHERE id = ? AND type = ? \", 
              params[:id], params[:type]"

Теперь вы можете подставить значение для параметров, используя метод класса sanitize_sql_array и eval.

sql = eval("User.send(:sanitize_sql_array, [#{str}])")
users = User.find_by_sql(sql)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...