Почему escape_javascript перед рендерингом частичного?

Вместо проверки просто выполните действие (веб-запрос, почту, ftp и т. д.) и будьте готовы к сбою запроса, что вам нужно сделать в любом случае, даже если ваш чек был успешным.

Рассмотрим следующее:

1 - check, and it is OK
2 - start to perform action 
3 - network goes down
4 - action fails
5 - lot of good your check did

Если сеть не работает, ваше действие завершится так же быстро, как пинг и т. д.

1 - start to perform action
2 - if the net is down(or goes down) the action will fail
119
задан 25 October 2009 в 05:45
поделиться

3 ответа

Потому что вы не хотите, чтобы пользователи публиковали JavaScript, который на самом деле выполняет браузер?

-2
ответ дан 24 November 2019 в 01:45
поделиться

Это легче понять, если разделить код на две части.

Первая часть $ ("# reviews"). Append ("<% = ...% > "); - это javascript с erb. Это означает, что <% = ...%> будет заменен тем, что возвращает код рубина внутри него. Результатом этой замены должен быть действующий javascript, иначе он выдаст ошибку, когда клиент попытается обработать его. Итак, первое: вам нужен действительный javascript .

Еще одна вещь, которую следует принять во внимание, это то, что все, что сгенерирует Ruby, должно содержаться внутри строки javascript с двойными кавычками - обратите внимание на двойные кавычки вокруг <% = ...%> . Это означает, что сгенерированный javascript будет выглядеть так:

$("#reviews").append("...");

Теперь давайте ' s исследуйте рубиновую часть внутри <% = ...%> . Что делает render (: partial => @review) ? Это частичный рендеринг - что означает, что он может рендерить любой код - html, css ... или даже больше javascript!

Итак, что произойдет, если наш партиал будет содержать какой-нибудь простой html, как этот?

<a href="/mycontroller/myaction">Action!</a> 

Помните, что ваш javascript использовал строку в двойных кавычках в качестве параметра? Если мы просто заменим <% = ...%> на код этого партиала, то у нас возникнет проблема - сразу после href = стоит двойная кавычка! Javascript не будет действительным:

// Without escaping, you get a broken javascript string at href
$("#reviews").append("<a href="/mycontroller/myaction">Action!</a>");

Чтобы этого не произошло, вы хотите экранировать эти специальные символы, чтобы ваша строка не обрезалась - вместо этого вам нужно что-то, что генерирует это:

<a href=\"/mycontroller/myaction\">Action!</a>

Это то, что делает escape_javascript . Это гарантирует, что возвращенная строка не «сломает» javascript. Если вы воспользуетесь им, то получите желаемый результат:

$("#reviews").append("<a href=\"/mycontroller/myaction\">Action!</a>")

С уважением!

359
ответ дан 24 November 2019 в 01:45
поделиться

пользователи могут публиковать вредоносные код (злонамеренные пользователи), который, если его не экранировать, потенциально может быть запущен, позволяя пользователям управлять вашим приложением.

попробуйте следующее:

<% variable = '"); alert("hi there' %>
$("#reviews").append("<%= variable %>");

не совсем знаком с синтаксисом rails, но если вы не избежите переменной , тогда появится окно предупреждения, и я не думаю, что это предполагаемое поведение.

8
ответ дан 24 November 2019 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: