2016-02-17 1 views
2

У меня есть show маршрут, который отображает содержимое моей статьиПочему мой взгляд помечен как уязвимость XSS?

Контроллер:

def show 
    @article = Article.find(params[:id]) 
end 

Вид:

... 
<li class="content"><%= @article.content.html_safe %></li> 
... 

При запуске кондуктор, он помечает выше как потенциальная уязвимость межсайтового сценария (XSS)

Unescaped model attribute near line 34: Article.find(params[:article_id]).content 

Я пытаюсь выяснить, что такое XSS и что делает это уязвимым? Если кто-то впрыскивают некоторый вредоносный текст или ввод в params[:id] поле в маршруте (например, /articles/BAD_INPUT), то Article.find() не нашел бы статью и вызвать ошибку

Единственный способ вид визуализирует, если действительный Article запись найдена, право ? Как еще можно манипулировать этим пользователем?

Спасибо!

Edit: я должен определенно защитить Agains случае, когда какая-либо статья не найдена, и возникают ошибку, но я понял, что больше похоже на плохой дизайне, а не уязвимости

ответ

2

кондуктор предупреждает, потому что код принимает информацию из базы данных и вывода его в целях, не избежать этого. По умолчанию Brakeman рассматривает значения из базы данных как потенциально опасные. В этом случае вы, вероятно, знаете, что контент статьи предназначен для HTML и безопасен для вывода без его выхода. Если вы не хотите предупреждать о XSS со значениями из базы данных, вы можете использовать опцию --ignore-model-output.

(Вопрос, который вы связали в своем ответе, на самом деле не связан.Кондуктор, как ожидается, предупредить об использовании raw/html_safe с потенциально опасными значениями.)

+0

Спасибо! Из любопытства, почему значения из БД неотвратимо ненадежны? Я ожидаю, что входные данные, такие как 'params', будут поступать прямо от пользователей и форм, чтобы быть ненадежными, но, по-видимому, чаще, чем данные, которые попали в БД, были проверены и теперь только что восстановлены, не так ли? – user2490003

+1

@ user2490003: Причина в том, что в базе данных может храниться исходный пользовательский ввод. Отличным примером является Stack Overflow - в базе данных будут теги '

2

Ok нашел ответ после того, как некоторые копания.

По-видимому, это связано с html_safe и raw (что является просто псевдонимом для html_safe). Эта проблема относится к Brakeman и изложена here

В этой статье говорится, что проблема подтверждена и решена, но она по-прежнему не работает для меня с использованием последней версии.

Я решил его следующим образом

Контроллер:

def show 
    @article = Article.find(params[:id]) 
    @article_content = view_context.raw(@article.content) 
end 

Вид:

... 
<li class="content"><%= @article_content %></li> 
... 

По существу мы маркирование содержание статьи в качестве html_safe (используя псевдоним raw()), поэтому он не вызывает проблемы в e.

Мессье, чем хотелось бы, но это работает

1

Если вы храните HTML на вашей модели, и вы на Rails 4.2 ++, вы могли бы рассмотреть вопрос об использовании sanitize помощника (docs).

Например, вы можете разрешить конкретные теги (например, ссылки):

<%= sanitize @article.content, tags: %w(a), attributes: %w(href) %> 

docs есть много хороших примеров.

Вот another write-up, если вы хотите получить дополнительную информацию.