为什么在渲染部分之前escape_javascript?

2022-08-30 04:44:55

我正在看这一集Railscast,想知道为什么这里需要打电话:escape_javascript

$("#reviews").append("<%= escape_javascript(render(:partial => @review)) %>");

用途是什么?escape_javascript

根据 Rails 文档

escape_javascript(javascript)

转义载体返回以及 JavaScript 段的单引号和双引号。

但这对我来说意义不大。


答案 1

如果将代码拆分为两部分,则更容易理解。

第一部分是带有erb的javascript。这意味着 将被替换为其内部的 ruby 代码返回的任何内容。该替换的结果必须是有效的javascript,否则当客户端尝试处理它时,它将引发错误。所以这是第一件事:你需要有效的javascript$("#reviews").append("<%= ... %>");<%= ... %>

要考虑的另一件事是,Ruby生成的任何内容都必须包含在带有双引号的javascript字符串中 - 请注意.这意味着生成的 javascript 将如下所示:<%= ... %>

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

现在,让我们检查一下 .有什么作用?它正在呈现部分 - 这意味着它可以呈现任何类型的代码 - html,css ...甚至更多的javascript!<%= ... %>render(:partial => @review)

那么,如果我们的部分包含一些简单的html,比如这个,会发生什么呢?

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

还记得你的javascript采用双引号字符串作为参数吗?如果我们简单地用该部分的代码替换,那么我们就有问题 - 紧接着有一个双引号!javascript 将无效:<%= ... %>href=

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

为了不发生这种情况,您希望转义这些特殊字符,以便您的字符串不会被剪切 - 您需要一些生成以下内容的东西:

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

这是什么做的。它确保返回的字符串不会“破坏”javascript。如果使用它,您将获得所需的输出:escape_javascript

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

问候!


答案 2

用户可能会发布恶意代码(恶意用户),如果不加执行,则可能会执行这些代码,从而允许用户控制您的应用程序。

试试这个:

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

不是很熟悉导轨的语法,但是如果您不转义,则会显示警报框,我不认为这是预期的行为。variable