Почему мой взгляд помечается как уязвимость 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) %>

В документах есть много хороших примеров.

Вот еще одна статья, если вам нужна дополнительная информация.

Другие вопросы по тегам