Почему мой взгляд помечается как уязвимость XSS?
У меня есть show
маршрут, который отображает содержание моей статьи
контроллер:
def show
@article = Article.find(params[:id])
end
Посмотреть:
...
<li class="content"><%= @article.content.html_safe %></li>
...
При запуске Brakeman он помечает вышеперечисленное как потенциальную уязвимость межсайтового скриптинга (XSS)
Unescaped model attribute near line 34: Article.find(params[:article_id]).content
Я пытаюсь понять, что на самом деле XSS и что делает его уязвимым? Если кто-то ввел какой-либо вредоносный текст или ввод в params[:id]
поле в маршруте (например, /articles/BAD_INPUT
) затем Article.find()
не нашел бы статью и поднял ошибку
Единственный способ визуализации представления - это если Article
запись найдена, верно? Как еще пользователь может манипулировать этим?
Спасибо!
Изменить: я должен обязательно защитить от случая, когда статья не найдена и возникает ошибка, но я решил, что это скорее плохой дизайн, а не уязвимость безопасности
3 ответа
Brakeman предупреждает, потому что код берет информацию из базы данных и выводит ее в виде, не пропуская ее. По умолчанию Brakeman рассматривает значения из базы данных как потенциально опасные. В этом случае вы, вероятно, знаете, что содержание статьи предназначено для использования в формате HTML и безопасно для вывода без его выхода. Если вы не хотите предупреждать о XSS со значениями из базы данных, вы можете использовать --ignore-model-output
вариант.
(Проблема, на которую вы указали в своем ответе, на самом деле не связана. Ожидается, что Brakeman предупредит об использовании raw
/html_safe
с потенциально опасными значениями.)
Хорошо нашел ответ после некоторого копания.
Это, видимо, связано с html_safe
а также raw
(это просто псевдоним для html_safe
). Проблема специфична для Brakeman и изложена здесь
В этой ветке говорится, что проблема признана и решена, но она все еще не работает для меня, используя последнюю версию.
Я решил это следующим образом
контроллер:
def show
@article = Article.find(params[:id])
@article_content = view_context.raw(@article.content)
end
Посмотреть:
...
<li class="content"><%= @article_content %></li>
...
По сути, мы отмечаем содержание статьи как html_safe
(используя псевдоним raw()
) заранее, так что это не вызывает проблемы в представлении.
Грязнее, чем хотелось бы, но это работает
Если вы храните html в своей модели и используете Rails 4.2++, вы можете использовать sanitize
помощник ( документы).
Например, вы можете разрешить определенные теги (например, ссылки):
<%= sanitize @article.content, tags: %w(a), attributes: %w(href) %>
В документах есть много хороших примеров.
Вот еще одна статья, если вам нужна дополнительная информация.