Есть ли опасность при вызове флеш-сообщений html_safe? - PullRequest
3 голосов
/ 24 мая 2010

Я хочу флэш-сообщение, которое выглядит примерно так:

"Эта ссылка для подтверждения недействительна или устарела. Нажмите здесь, чтобы создать новую ссылку."

Где «нажмите здесь» - это, конечно, ссылка на другое действие в приложении, где можно создать новую ссылку для подтверждения. Два недостатка: во-первых, поскольку link_to не определено в контроллере, где устанавливается флэш-сообщение, я должен поместить ссылку html в себя. Ничего страшного, но немного грязно.

Номер два: для того, чтобы ссылка действительно отображалась на странице, я должен html_safe использовать функцию флеш-отображения в представлении, поэтому теперь она выглядит (используя Haml):

- flash.each do |name, message|
  = content_tag :div, message.html_safe

Это заставляет меня задуматься. Все остальное, что я использовал в html_safe, - это HTML, который я сам написал в помощниках и еще много чего, но содержимое флэш-хэша хранится в файле cookie на стороне клиента и может быть изменено. Я обдумал это и не понимаю, как это может привести к атаке XSS, но в любом случае я не очень хорошо понимаю XSS.

Итак, два вопроса: 1. Есть ли какая-либо опасность в html_safe всегда - все содержимое флэш-памяти, как это? 2. Тот факт, что это решение настолько грязное (нарушение MVC с помощью HTML в контроллере, всегда html_safe-все содержимое флэш-памяти), заставляет меня думать, что я ошибаюсь. Есть ли более элегантный способ Rails-ish сделать это?

Я использую Rails 3.0.0.beta3.

Ответы [ 2 ]

1 голос
/ 24 мая 2010

Я не хотел искушать судьбу, html_safe-все флеш-сообщения повсеместно, поэтому я решил просто перенаправить неудачные попытки подтверждения ссылки непосредственно на URL, к которому я бы все равно связал их. Думаю, это более простое и элегантное решение.

0 голосов
/ 24 мая 2010

Зависит от того, насколько вы уверены, откуда исходит содержание сообщения.Если есть вероятность, что какой-либо пользователь сможет манипулировать этим сообщением, то вам не следует делать это!

Я бы не стал этого делать в любом случае.Потому что может случиться так, что теперь вы знаете, что каждая строка безопасна, но чем вы поменяете один контроллер и добавите сообщение, которое может содержать ввод данных пользователем, у вас появится возможная уязвимость.

Iустановит любое сообщение html_safe, когда оно будет добавлено к flash, и вы точно знаете, что оно безопасно.

Например

class SomeController < ApplicationController def some_action flash[:info] = 'Some <em>safe</em> text!'.html_safe flash[:unsecure] = User.find(1).signature #//evil code end end

И, на ваш взгляд, вы можете сделать это так:

<del> - flash.each do |name, message| = content_tag :div, message </del>

Таким образомвы убедитесь, что если вы добавите новое флэш-сообщение, которое не является безопасным, оно будет по ошибке сделано безопасным при просмотре.

В этом случае печатается сообщение flash[:info]так как html_safe и flash[:unsecure] будут экранированы, то пользовательский злой javascript код не будет выполнен.

Если вы знаете, что в сообщении нет никакого нефильтрованного пользовательского вводадолжно быть безопасно использовать html_safe во флеш-сообщениях.

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