Rails翻译性能影响<%= raw t(vs.<%= t(

时间:2015-10-07 14:04:11

标签: ruby-on-rails ruby performance security rails-i18n

我正在使用rails-i18n Ruby on Rails构建一个多语言应用程序。 我必须翻译的大部分内容(和数据库条目)都是纯文本,尽管它的一部分有一些嵌入式HTML。

我在考虑使用<%= raw t('translation_key') %>而不是直接<%= t('translation_key') %>来考虑将来可能包含html的更改。

如果我在整个网站中采用<%= raw t('translation_key') %>,那么在谈到

时我是否会受到任何(负面)影响
  1. 网站效果
  2. 网站安全

3 个答案:

答案 0 :(得分:2)

您只需将_html附加到标记键以处理翻译标记中的HTML:

en:
  key_one: test text
  key_one_html: <p>test text</p>

然后标准代码将起作用:

<%= t('key_one_html') %>

答案 1 :(得分:1)

效果方面:

性能影响应该可以忽略不计。调用raw将参数复制到一个新字符串(确切地说是ActiveSupport::SafeBuffer),并将其html_safe标志设置为true。另一方面,不再对该字符串执行HTML转义。

安全方面:

在任何地方使用raw都有更多的实质性缺点。

您说您的翻译是从数据库中读取的。用户可以编辑这些翻译吗?如果是的话......

  • 您冒着HTML注入的风险:恶意用户只能输入<script>标记。
  • 所有您的翻译从现在开始必须是HTML安全的。这意味着您必须手动转义所有翻译,即您必须替换&lt;,&gt;和&amp ;.

<强>备选方案:

如果您需要在翻译中加入HTML,还有其他选择:

  • 谨慎使用_html后缀 以防止自动转义
  • 使用本地化视图和部分内容,即index.en.html_footer.de-DE.html来翻译视图的较大部分。

要简化数据库条目的翻译,请尝试

<强>结论:

在任何地方使用raw都会导致很多问题。为自己省去很多麻烦,只需“根据需要”使用它。

答案 2 :(得分:0)

您还可以将globalize gem用于更大的text / html内容部分。

https://github.com/globalize/globalize/blob/master/README.md

如果您担心性能,它还支持急切加载。