Такое ощущение, что html_safe
добавляет абстракцию к классу String, которая требует понимания того, что происходит, например,
<%= '1 <b>2</b>' %> # gives 1 <b>2</b> 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 <b>2</b> 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-атаку таким образом, поэтому понимаем, как это точные работы могут быть весьма важны. Вышесказанное является лишь предположением о том, как именно это работает.