В конечном счете решение сводится, более ли полезно иметь дело с ошибками прикладного уровня как эта обработка исключений использования, или с помощью Вашего собственного прокрученного домом механизма как возврат кодов статусов. Я не думаю, что существует твердое правило, о котором лучше, но я рассмотрел бы:
Руководство по безопасности Ruby on Rails довольно подробно описывает специфические для Rails проблемы, которые вы должны учитывать при разработке безопасности для своего веб-сайта.
Метод h
по-прежнему позволяет избежать всего HTML внутри строки. Вы должны использовать этот метод везде, где вы выводите контент.
<%=h @recipe.description %>
Это поведение будет изменено в Rails 3. Там весь вывод будет экранирован по умолчанию, и вам нужно будет явно указать, чтобы не экранировать его. Между тем, если вы часто забываете использовать этот метод h
, вы можете попробовать плагин Safe ERB .
Метод sanitize - это хороший способ выборочно удалить определенные теги из содержимого. Например, если вы хотите разрешить пользователю выделять полужирным шрифтом и курсивом их вывод вместе с добавлением ссылок, вы можете сделать это.
<%= sanitize @recipe.description, :tags => %w[b i a], :attributes => %w[href] %>
Как упомянул Оливер, дополнительную информацию можно найти в Руководстве по безопасности .
Что касается лучших практик, я бы порекомендовал следующее:
Всегда используйте помощники формы rails (form_for и т. Д.), Если вы пишете свою собственную форму, вы открываете себя для атак CSRF.
Хотя использование функции h () будет экранировать текст, когда он записывается на страницу, вы все равно получите эксплойты XSS, сохраненные в вашей базе данных. Использование XSS_terminate подключаемого модуля разделяет ввод по мере его сохранения.
Не забывайте, что ваше приложение работает в стеке других приложений (Rails, Apache, MySQL, ваша ОС по своему выбору), каждое из которых имеет свои собственные проблемы безопасности.
Метод очистки Rails довольно хорош, но он не гарантирует правильной формы и, скорее всего, подвергнется атаке из-за базы установки. Лучше использовать либо html5lib (действительно лучший, если не самый быстрый или самый рубиновый), либо Sanitize или Loofah