字符串在放入文本字​​段时被不适当地转义

时间:2013-10-05 00:20:45

标签: javascript ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 escaping

在我们的Rails 3.2.13应用程序中,我们在ERB视图之一中提供了此代码:

<script language="javascript">
function copy_address ()
{
    document.getElementById("account_firm_name").value = '<%= escape_javascript firm_name %>';
    document.getElementById("account_address_line_1").value = '<%= escape_javascript address %>';
    document.getElementById("account_city").value = '<%= escape_javascript city %>';
    document.getElementById("account_state_id").value = '<%= escape_javascript state_id.to_s %>';
    document.getElementById("account_zip_code").value = '<%= escape_javascript zip %>';
}
</script>

<%# snip %>

<%= form_tag %>
  <table>
    <tr class="two_columns">
      <td><label for="firm_name">Firm Name*</label></td>
      <td><%= text_field 'account', 'firm_name' %></td>
    </tr>
    <%# snip %>
  </table>
</form>

它是一个Rails表单和一个JS函数,它将一些已知值复制到表单中。

如果ERB注入的firm_nameaddresscityzip字符串中有任何特殊字符,则表示HTML转义不当。例如,如果firm_name = '&',则生成的HTML包含JS函数:

<script language="javascript">
function copy_address ()
{
    document.getElementById("account_firm_name").value = '&amp;';
    // snip

并执行该函数将字符串&amp;(不是&)插入到表单中的相应文本字段中。

是否有一种安全的方法可以阻止ERB转义字符串的值,或者在将字符串放入文本字​​段之前使用JavaScript来解除字符串的转义?

(到目前为止,我已尝试使用.html_saferaw Rails方法,但没有骰子。)

2 个答案:

答案 0 :(得分:0)

我在尝试动态设置页面的title元素时遇到了同样的问题。我最终决定要检查哪些字符,并在视图助手中执行gsub,如下所示:

在application_helper.rb

def title_sanitize(string)
    sanitize(string).gsub('&amp;', '&').html_safe
end

然后在你看来

document.getElementById("account_firm_name").value = '<%= title_sanitize(firm_name) %>';

答案 1 :(得分:0)

我意识到在视图的其他地方,我们有这个代码:

<% firm_name = h(@agency.name) %>
<% address = h(@agency.address) %>
<% city = h(@agency.city) %>
<% state_id = @agency.state_id %>
<% zip = h(@agency.zip_code) %>

如果您遇到同样的问题,请确保您没有任何代码预先转义您要使用的字符串。

我最终使用了这段代码:

function copy_address ()
{
    document.getElementById("account_firm_name").value = '<%= raw (escape_javascript @agency.name) %>';
    document.getElementById("account_address_line_1").value = '<%= raw (escape_javascript @agency.address) %>';
    document.getElementById("account_city").value = '<%= raw (escape_javascript @agency.city) %>';
    document.getElementById("account_state_id").value = '<%= raw (escape_javascript (@agency.state_id.to_s)) %>';
    document.getElementById("account_zip_code").value = '<%= raw (escape_javascript @agency.zip_code) %>';
}

直接使用@agency属性,然后才能运行h()