【问题标题】:How to escape while rendering a js.coffee file in response to an action如何在渲染 js.coffee 文件以响应操作时转义
【发布时间】:2013-07-31 03:30:38
【问题描述】:

我有一个响应 .js.coffee 文件的控制器操作,我的 Rails 3.2.12 版本应该支持该文件。问题是解析中的某些内容允许用户提供的数据导致 javascript 失败。我已经像这样简化了这个例子:

action.js.coffee 文件:

$('my_container').append("<%= j render(:partial => 'my_partial') %>")

my_partial.html.erb 文件只包含不应插入的一行:

"#{this should not be evaluated}"

实际渲染的 javascript

$('my_container').append("\"" + (this(should(!be(evaluated)))) + "\"\n\n");

哇!到底是怎么回事?我可以通过从文件名中删除 .coffee 来解决这个问题,但这似乎是 Rails 的一个错误?

【问题讨论】:

  • 为什么不插值呢? CS 在双引号中插入字符串,这看起来或多或少类似于 CS 代码。
  • 我简化了这个例子,实际上被插值的实际上是系统上用户提供的注释;他只是碰巧在笔记中使用了#{}。

标签: ruby-on-rails coffeescript


【解决方案1】:

我通过更改 js.coffee 文件中的双引号解决了这个问题,但我仍然不确定这是一个错误。希望这对其他人有帮助!

改变:

$('my_container').append("&lt;%= j render(:partial =&gt; 'my_partial') %&gt;")

$('my_container').append('<%= j render(:partial => 'my_partial') %>')

【讨论】:

  • 和我之前说的一样:双引号中的 CS 字符串会被插值。单引号字符串不是。
  • @DaveNewton:问题是j 助手理解JavaScript 但不理解CoffeeScript。我认为没有任何辅助解决方案不会以某种方式吸吮。唯一明智的做法 (IMO) 是在任何地方都使用单引号,除非您特别需要插值。
  • @muistooshort 正确,这就是问题所在。
  • 我已将所有双引号更改为单引号。真正的问题是这是否可以打开一些漏洞。在我的例子中,用户提供的内容有 #{} 暴露了插值。
猜你喜欢
  • 2014-04-26
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
  • 2016-04-13
相关资源
最近更新 更多