Я взял это из другого поста здесь: 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, вы должны увидеть кавычки вокруг этой строки.
, если вы используете заполнители и подготовленные заявления. ИСПОЛЬЗУЙТЕ, что нет риска для инъекций. и нет, просто потому, что введенные данные находятся в 'where', ничего не значит. Начать чтение: http://bobby-tables.com) –
Там, где предложение - это именно вектор для атаки. Но когда вы его параметризируете, уязвимость уходит. –
Как его параметризовать? – ineedahero