Безопасное экранирование строк для фрагментов SQL для объединений, ограничений, выбора и т. Д. (Не условий) в Rails - PullRequest
12 голосов
/ 12 ноября 2009

В Ruby on Rails, для условий, легко создавать SQL-инъекционные запросы:

:conditions => ["title = ?", title]

где заголовок приходит извне, из веб-формы или чего-то в этом роде.

Но что, если вы используете фрагменты SQL в других частях запроса, например:

:select => "\"#{title}\" AS title"   # I do have something like this in one instance
:joins => ["LEFT JOIN blah AS blah2 ON blah2.title = \"#{title}\""]

Есть ли способ правильно избежать этих строк?

1 Ответ

23 голосов
/ 12 ноября 2009

Как правило, в Rails объединения выполняются как символ (или как хеш для объединений второго порядка), представляющий соединение id, и вы используете условия для его фильтрации. Если вам нужно сделать это, как показано, то вы можете использовать ActiveRecord sanitize_sql_array для очистки строки SQL, например:

sanitize_sql_array(["LEFT JOIN blah AS blah2 ON blah2.title = ?", @blah.title])
...