2013-03-23 2 views
1

мне нужно получить массив значений как:Убедитесь, мой SQL не впрыскивается получать массив значений

['restaurant'] 
['restaurant', 'pharmacy'] 

Я хотел бы, какой подход предпринять, чтобы гарантировать, что, когда я использую это:

SELECT * FROM places WHERE type IN (array_joined_with_commas_and_quotes) 

Я не получаю инъекции.

Я пишу предложение без какой-либо библиотеки, и я работаю в Rails.

У меня нет активной записи, я делаю postgis-запрос на внешний сервер.

+0

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

+0

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

+0

Как описывает Крис Траверс. –

ответ

2

Как насчет использования функций ActiveRecord для построения запросов? Если вы используете рельсы, драгоценный камень все еще должен быть там.

Place.where(:type => ['foo', 'bar']).to_sql 
+0

Это хорошая идея, я собираюсь протестировать, хотя у меня нет локальной базы данных. FYI, я использую другой камень, чтобы сделать запрос POST на внешний сервер, который возвращает JSON. – juanpastas

2

У вас есть два основных подхода (используя для параметризации в этих примерах?).

Если это массив, то ваш ['restaurant', 'pharmacy'] становится '{"restaurant","pharmacy"}', а затем вы можете:

SELECT * FROM places WHERE type = ANY (?); 

Вы также можете

SELECT * FROM places WHERE type IN (? ....); 

Динамическая генерация числа параметров, как вы идете. Поскольку упомянутые вами звуковые сигналы могут быть активированы, вы можете автоматизировать это для вас. Дело в том, что эти методы отправляют данные отдельно от запроса, а это значит, что SQL не может быть введен в запрос.

+0

В активной записи, я думаю, я хотел бы сделать что-то вроде этого: 'Place.where ('type IN (?)', Array)', но я действительно не понимаю, как применить ваше решение. Вы имеете в виду, что метод, который делает запрос (я использую https://github.com/Vizzuality/cartodb-rb-client), должен ли я разрешать писать подготовленные заявления? заключается в том, что правильное название: подготовленное заявление? – juanpastas

+0

На самом деле есть пара вариантов. Если у вас хорошая поддержка массива Pg, '= any (?)' Является самым чистым. Если нет, вы можете легко реализовать поддержку массива, если у вас есть поддержка csv. Это в основном csv, окруженный '{}', и тогда вы можете использовать '= ANY' –