более простой способ вывести строку из файла? - PullRequest
0 голосов
/ 23 декабря 2009

Я хотел бы сохранить запрос MySQL в файле. Я планирую заменить его части на переменные из моей программы.

Я играл с методом 'eval' в ruby, и он работает, но кажется немного неуклюжим.

Используя irb, я сделал следующее.

>> val = 7
=> 7
>> myQuery = "select * from t where t.val = \#{val}" #escaped hash simulates reading it from file
=> "select * from t where t.val = \#{val}"
>> myQuery = eval "\"#{myQuery}\""
=> "select * from t where t.val = 7"

Как видите, это работает! Но чтобы это работало, мне пришлось обернуть переменную 'myQuery' в экранированные кавычки, и все это выглядит немного грязно.

Есть ли более простой способ?

Ответы [ 4 ]

1 голос
/ 24 декабря 2009

Как правило, вам не следует использовать интерполяцию строк для построения запросов SQL. Это оставит вас открытыми для SQL-инъекций атак, при которых кто-то вводит ввод с закрывающей кавычкой, а затем другой запрос. Например, используя ваш пример:

>> val = '7; DROP TABLE users;'
=> "7; DROP TABLE users;"
>> myQuery = "select * from t where t.val = \#{val}"
=> "select * from t where t.val = \#{val}"
>> eval "\"#{myQuery}\""
=> "select * from t where t.val = 7; DROP TABLE users;"

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

Также, как правило, рекомендуется избегать использования eval без крайней необходимости; это делает возможным, что если у вас есть ошибка в вашей программе, кто-то может выполнить произвольный код, передав его в eval, и это делает код менее поддерживаемым, так как часть вашего исходного кода будет загружена из мест, отличных от вашего обычного источника дерево.

Итак, как ты это делаешь вместо этого? API базы данных обычно включают команду prepare, которая может подготовиться к выполнению оператора SQL. В этом выражении вы можете включить ? символов, которые представляют параметры, которые могут быть заменены в этом выражении. Затем вы можете вызвать execute в операторе, передав значения для этих параметров, и они будут выполнены безопасно, и никто не сможет выполнить произвольный фрагмент SQL.

Вот как это будет работать в вашем примере. Предполагается, что вы используете этот модуль MySQL / Ruby ; если вы используете другой, он, вероятно, будет иметь похожий интерфейс, хотя он может не совпадать.

>> val = 7
>> db = Mysql.new(hostname, username, password, databasename)
>> query = db.prepare("select * from t where t.val = ?")
>> query.execute(val)
0 голосов
/ 24 декабря 2009

Вы можете использовать printf как синтаксис для замены строки

"123 %s 456" % 23 # => "123 23 456"

Это работает, только если ваша программа заранее знает, какие переменные использовать.

0 голосов
/ 24 декабря 2009

Не могли бы вы использовать параметризованные запросы?

Я не знаю, как это сделать в ruby, но в основном это связано с маркировкой вашего оператора SQL командами, которые распознает SQL, заменяются параметрами, которые отправляются в дополнение к вашему оператору.

Эта ссылка может помочь: http://sqlite -ruby.rubyforge.org / sqlite3 / faq.html # 538670816

0 голосов
/ 23 декабря 2009

Вместо этого вы можете использовать шаблоны ERB - читать их из файлов и интерполировать переменные (преобразовывать теги <% = кое-что%> в фактические значения).

Вот официальный документ , он довольно полный и простой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...