2016-10-28 3 views
0

Я пытаюсь понять SQL Injection. Похоже, люди могут стать довольно творческими. Который заставляет меня задаваться вопросом о моих основанных на поиске рельсах webapp, которые я делаю.Rails SQL Injection: насколько уязвим этот код?

Предположим, что я только что ввел информацию, введенную пользователем, в инструкцию «где» моего SQL-запроса. Сколько ущерба может быть нанесено моей базе данных, разрешив это?

def self.search(search) 
    if search 
    includes(:hobbies, :addresses).where(search) 
    else 
    self.all 
    end 

Так что, независимо от того, что пользователь вводит в панель поиска на домашней странице, получает прямо в это выражение «где».

Пример действительного «поиск» будет:

"hobby LIKE ? OR (gender LIKE ? AND hobby LIKE ?)", "golf", "male", "polo" 

ли тот факт, что она ограничена контексту «где» предоставить заявление любого рода защиту? Могут ли они каким-то образом выполнить удаление или создать операции?

EDIT:

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

+0

, если вы используете заполнители и подготовленные заявления. ИСПОЛЬЗУЙТЕ, что нет риска для инъекций. и нет, просто потому, что введенные данные находятся в 'where', ничего не значит. Начать чтение: http://bobby-tables.com) –

+0

Там, где предложение - это именно вектор для атаки. Но когда вы его параметризируете, уязвимость уходит. –

+0

Как его параметризовать? – ineedahero

ответ

0

Я взял это из другого поста здесь: Best way to go about sanitizing user input in rails

TL; DR Что касается пользовательского ввода и запросов: Убедитесь в том, чтобы всегда использовать активные методы записи запроса (например, как .гд), и избежать передач параметров, используя строку интерполяция; передавать их как значения параметров хэша или в качестве параметризованных операторов.

Что касается рендеринга потенциально опасного генерируемого пользователем содержимого html/javascript: с Rails 3 текст html/javascript автоматически экранируется автоматически, поэтому он отображается как обычный текст на странице, а не интерпретируется как html/javascript, поэтому вы не нужно явно дезинфицировать (или использовать <% = h (maybe_unsafe_user_generated_content)%>

Если я правильно вас понимаю, вам не нужно беспокоиться о дезинфекции данных таким образом, если вы используете активную например,:

Допустим, что наша карта параметров выглядит так, в результате чего злоумышленник вводит следующие строка в поле user_name:

: user_name => "(выберите user_name от пользователей ограничения 1)" Плохой путь (не делать этого):

Users.where ("имя_пользователя = # {Params [: идентификатор} ") # строка интерполяции плохо здесь Результирующий запрос будет выглядеть следующим образом:.

вЫБРАТЬ users * FROM users WHERE (user_name = (выберите user_name от пользователей ограничения 1)) Прямая строка интерполяции таким образом, поместит буквальное содержимое значения параметра с ключом: user_name в запрос без дезинфекции. Как вы, вероятно, знаете, вход вредоносного пользователя рассматривается как простой «ol SQL», и опасность довольно ясна.

Хороший способ (это сделать):

Пользователи.где (ID: Титулы [: идентификатор]) Параметры # хэш ИЛИ

Users.where (, PARAMS "ID =?" [: ID]) # параметризованных заявление Результирующий запрос будет выглядеть следующим образом:

SELECT users. * FROM users WHERE user_name = '(выберите user_name из ограничения пользователя 1)' Итак, как вы можете видеть, Rails на самом деле санирует его для вас, если вы передаете параметр в качестве хэша или параметра метода (в зависимости от того, какой метод запроса вы используете).

Случай для дезинфекции данных о создании новых записей модели на самом деле не применяется, поскольку новые или создаваемые методы ожидают хеш значений. Даже если вы пытаетесь внедрить небезопасный код SQL в хеш, значения хэша обрабатываются как простые строки, например:

User.create (: user_name => "bobby tables); Результаты в запросе:

INSERT INTO users (user_name) VALUES ('bobby tables); drop table users; ') Итак, в той же ситуации, что и выше.

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

Редактировать Что касается экранирования html и javascript, то короткая версия заключается в том, что ERB «экранирует» ваше строковое содержимое для вас, так что оно рассматривается как обычный текст. Вы можете обработать его как html, если вы действительно этого хотите, выполнив your_string_content.html_safe.

Однако, просто делать что-то вроде <% = your_string_content%> совершенно безопасно. Содержимое рассматривается как строка на странице. На самом деле, если вы изучите DOM с помощью инструментов разработчика Chrome или Firebug, вы должны увидеть кавычки вокруг этой строки.

Смежные вопросы