Я создаю API с RoR 4 и PostgreSQL. Я хочу дать своим пользователям некоторые функции поиска через действие индекса в моих контроллерах. С этой целью я построил следующую функцию.Избегайте потенциальных SQL-инъекций
query_params является результатом params.permit в одном контроллере.
Вывод этой функции затем отправляется на активную запись where функция.
def searchable (query_params)
query = ''
query_params.each do |key, value|
value = value.to_s # Ensure this is a string or you will have crashes below
# Equals any of multiple values
if value[/\A(mul-)/]
value[0..3] = ''
query += "#{key} IN (#{value}) AND "
# Not a single value
elsif value[/\A(<>)/]
value[0..1] = ''
query += "(#{key} <> #{value}) AND "
# Bigger or smaller than a single value
elsif value[/\A[><]/]
operator = value[/\A[><]/]
value[0] = ''
query += "(#{key} #{operator} #{value}) AND "
# Equals a single value
else
query += "#{key} = '#{value}' AND "
end
end
query = query[0..-5] # removes the last AND
end
Я беспокоюсь, что этот метод открывает мои DB до инъекций sql. Я прав? Если у вас есть пример возможной инъекции, это было бы здорово. Наконец, есть ли что-нибудь, что я могу сделать, чтобы блокировать инъекции?
Спасибо!
должны использовать подготовленные заявления для смягчения против SQL инъекций – smoggers
@smoggers как бы вы сделать это и сделать его динамичным, что позволяет пользователю API, чтобы выбрать, что искать? – UKatz
Есть несколько довольно аккуратных решений для поиска с postgreSQL. Я думаю о gem pg_search (https://github.com/Casecommons/pg_search Если этого недостаточно =>, вы можете посмотреть http://api.rubyonrails.org/classes/ActiveRecord/Sanitization /ClassMethods.html#method-i-sanitize_sql –