0

在我们的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功能拷贝一些已知值转化为形式。

如果有在firm_nameaddresscity,或zip字符串任何特殊字符由ERB注入,它们过于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的方法试过,但没有骰子。)

+1

如何打印出一个JSON编码的对象,然后在JavaScript中使用它? – elclanrs

+0

你可以在控制器中使用'sanitize',那么你不必在视图中使用'escape_javascript' –

+0

@n_i_c_k:我最近添加了'escape_javascript'试图让它工作。没有这些调用的行为是相同的。 – Kevin

回答

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()运行之前。

0

我试图动态地设置一个网页的标题元素时遇到了同样的问题。最后我决定,我想检查哪些字符,只是做了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) %>';