【问题标题】:string interpolation for double-quoted attribute value in erberb中双引号属性值的字符串插值
【发布时间】:2015-03-23 22:49:07
【问题描述】:

如何编写双引号属性转义的 erb 表达式并获得正确的转义行为?

例如,我想要一些会输出的东西:

value="Hello World"

如果should_print_value 为真,并假设myvalue = Hello World

编辑:注意:myvalue 可能包含恶意内容

方法 1

如果我尝试类似

<%= "value=\"#{myvalue}\"" if should_print_value %>

erb 将转义双引号,导致 value=&amp;quotHello 和另一个名为 World&amp;quot="" 的属性

方法 2

我想出的最简单的解决方案是:

<% if should_print_value %>
  value="<%= myvalue %>"
<% end %>

但我仍然很好奇是否可以使用方法 1 的 &lt;%= "value=.... %&gt; 语法。

【问题讨论】:

  • 试试"value=\"#{myvalue}\"".html_safe。你想达到什么目的?可能有更简单的方法。
  • 忘记说明了,myvalue是不可信的,可能包含恶意XSS内容,所以.html_safe是不能接受的
  • 回答您的问题,我只是尝试有条件地将 value 属性添加到 erb 模板中的 HTML 元素(以及其他条件属性)。在我的例子中,它是一个文本输入标签。

标签: ruby-on-rails templates erb template-engine


【解决方案1】:

正如@BroiSatse 指出的那样,要么使用:

<%= "value=\"#{myvalue}\"".html_safe if should_print_value %>

或者,我更喜欢在视图中:

<%= raw "value=\"#{myvalue}\"" if should_print_value %>

这会将内容标记为安全,但您需要注意myvalue 不是恶意的。您可以使用CGI.escape 之类的方法来正确格式化可能存在安全风险的特殊字符。

【讨论】:

  • 没错,我忘了指出myvalue 可能是恶意的。我宁愿不使用.html_saferaw,因为许多人在此代码上进行协作,并且使用其中任何一个都会引发危险信号
  • 如果你只是用CGI.escape 转义你的myvalue,你可以使用raw.html_safe 没有任何问题;)
  • 这实际上是唯一的内联解决方案,否则在打印出来时引号将始终被转义。 ruby-doc.org/stdlib-1.9.3/libdoc/cgi/rdoc/…
【解决方案2】:

如果您致力于内联解决方案,&lt;input ...value="&lt;%= myvalue if should_print_value %&gt;"&gt; 应插入正确转义的myvalue 或空字符串(有效地告诉输入为空),具体取决于should_print_value。我可能会选择您的方法 2,因为我觉得它更清晰一些。

【讨论】:

    猜你喜欢
    • 2011-06-11
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 2014-09-18
    • 2023-02-01
    相关资源
    最近更新 更多