Почему в Rails 3, <% = note.html_safe%> и <% = h note.html_safe%> дают тот же результат?

Такое ощущение, что html_safe добавляет абстракцию к классу String, которая требует понимания того, что происходит, например,

<%= '1 <b>2</b>' %>      # gives 1 &lt;b&gt;2&lt;/b&gt; in the HTML source code

<%= h '1 <b>2</b>' %>    # exactly the same as above

<%= '1 <b>2</b>'.html_safe %>      #  1 <b>2</b>  in HTML source code

<%= h '1 <b>2</b>'.html_safe %>    #  exactly the same as above

<%= h (h '1 <b>2</b>') %>  #  1 &lt;b&gt;2&lt;/b&gt;   wont' escape twice

Для строки 4, если мы говорим, хорошо, мы доверяем строке - она ​​безопасна, но почему мы не можем ее избежать? Кажется, что для выхода из него с помощью h строка должна быть небезопасной.

Итак, в строке 1, если строка не экранирована с помощью h , она будет автоматически экранирована . В строке 5 h не может дважды экранировать строку - другими словами, после < заменен на & lt; , он не может избежать его еще раз, чтобы & amp; lt; .

Так что же происходит? Сначала я подумал, что html_safe просто помечает строку флагом, говоря, что это безопасно. Тогда почему h не избегает этого? Кажется, что h и html_escape на самом деле взаимодействуют при использовании флага:

1) Если строка является html_safe, то h не ускользнет от нее.

2) Если строка не является html_safe, тогда, когда строка добавляется в выходной буфер, она будет автоматически экранирована h .

3) Если h уже экранировал строку, она помечена html_safe , и, следовательно, ее экранирование еще раз с помощью h не даст никакого эффекта. (как в Строке 5, и это поведение то же самое даже в Rails 2.3.10, но в Rails 2.3.5 h фактически может экранировать его дважды ... поэтому в Rails 2.3.5, h - это простой метод выхода, но где-то по пути к 2.3.10, h стал не таким простым. Но 2.3.10 не экранирует строку автоматически, но по какой-то причине, метод html_safe уже существует для 2.3.10 (с какой целью?))

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

11
задан andersoj 2 November 2010 в 17:36
поделиться