2016-10-31 1 views
0

Я сделал someposts о переводе ввода пользователя из окна поиска в операторе Parameterized ActiveRecord, который может быть уязвим для SQL-инъекции, но я думаю, что у меня может быть решение.Rails: все еще запутано в SQL Injection

Вот как работает поиск. Пользователь вводит что-то вроде этого в поле поиска:

name="hello" AND NOT address.town="Villa" 

Внутренне, я преобразовать его в:

query = ["name LIKE ? AND address.town NOT LIKE ?", "hello", "villa"] 

для:

if search 
    query = convert_search_to_query search 
    begin 
    includes(:address).where(query) 
    # rescue Exception ... 
... 
... 

Вот моя идея: просто проверить USER- введенные атрибуты («name», «address.town» в этом случае), чтобы убедиться, что это точное совпадение для допустимого списка пользовательских атрибутов.

Если я должен был сделать это, я думаю, что не было бы возможности SQL Injection, поскольку я использую параметризованные операторы (с «?») Для обработки единственной части ввода пользователя, которую я не могу проверить - значения, которые он вводил для каждого атрибута.

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

также:

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

+2

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

+0

Будет ли это работать, когда пользователь может ввести динамическое число запросов? – ineedahero

+1

ActiveRecord работает везде, где работает SQL. Прочтите его документацию. Это делает жизнь намного проще, чем использование SQL и необходимость беспокоиться об инъекции. –

ответ

1

ActiveRecord предотвратит любые атаки SQL-инъекций, AS LONG AS вы используете параметризованную форму. Как правило, параметр ALL должен быть параметром.

В вашем примере вы упоминаете преобразования запроса пользователя в:

where(["name LIKE ? AND address.town NOT LIKE ?", "hello", "villa"])

В этом случае ActiveRecord защитит hello и villa от SQL инъекции, но это будет НЕ защитить name LIKE ? AND address.town NOT LIKE ?. ActiveRecord предполагает, что name LIKE ? AND address.town NOT LIKE ? генерируется разработчиком (жестко закодированным) или приложением, в любом случае он предполагает, что он безопасен для выполнения.

Итак, если какая-либо часть name LIKE ? AND address.town NOT LIKE ? исходит от пользователя, ваше приложение может быть уязвимо к атакам SQL-инъекций.

Правильный способ сделать это - использовать парсер для полного разложения пользовательского запроса, а затем повторно сгенерировать его как безопасный запрос. Использование Regex для соответствия и замены может быть наивным, если вы не являетесь мастером в Regex и безопасности.

+0

Я пытаюсь Regex, и я далеко от мастера XD – ineedahero