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) %>';