Очистка пользовательского ввода с помощью Ruby on Rails - PullRequest
4 голосов
/ 21 мая 2010

Я пишу очень простое приложение CRUD, которое берет пользовательские истории и сохраняет их в базе данных, чтобы другой коллега по кодированию мог организовать их для проекта, над которым мы оба работаем. Однако я столкнулся с проблемой дезинфекции ввода пользователя перед его сохранением в базе данных. Я не могу вызвать функцию sanitize () из модели Story, чтобы удалить все html / scripting. Это требует от меня сделать следующее:

def sanitize_inputs
  self.name =  ActionController::Base.helpers.sanitize(self.name) unless self.name.nil?
  self.story = ActionController::Base.helpers.sanitize(self.story) unless self.story.nil?
end

Я хочу проверить, что пользовательский ввод был очищен, и я не уверен в двух вещах: 1) Когда должна проводиться проверка ввода пользователя? До того, как данные будут сохранены, становится достаточно очевидным, но я думаю, должен ли я обрабатывать эти вещи в контроллере, перед проверкой или в какой-то другой неочевидной области, прежде чем проверять, что пользовательский ввод не имеет тегов script / html? 2) Как написать модульный тест для этой модели, как проверить, что сценарий / html удален, кроме сравнения «Это пример вредоносного кода» с выходом sanitize (example)?

Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 21 мая 2010

Существует два подхода к устранению уязвимостей XSS:

A. Для фильтрации содержимого перед его сохранением в БД (что вы пытаетесь сделать). Вот 2 плагина, которые делают это для вас.

xss_terminate

act_as_sanitiled

B. Для фильтрации содержимого при его отображении (Rails 3 делает это по умолчанию). Вы можете использовать функцию h или rails_xss .

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

2 голосов
/ 21 мая 2010

Я думаю, что общее мнение о дезинфекции - нет. Сохраните ввод, как пользователь ввел его, и используйте помощник sanitize при выводе. (например, <%=h @author.filthy_nasty_data %>)

Тем не менее, вы всегда можете использовать strip_tags помощник, как указано в этот ответ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...