在我们的 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_name
则address
它们city
会zip
被不适当的 HTML 转义。例如,如果firm_name = '&'
,则生成的 HTML 包含 JS 函数:
<script language="javascript">
function copy_address ()
{
document.getElementById("account_firm_name").value = '&';
// snip
并执行该函数将字符串&
(不是&
)插入到表单中的相应文本字段中。
有没有一种安全的方法来防止 ERB 转义字符串的值,或者在将字符串放入文本字段之前使用 JavaScript 取消转义字符串?
(到目前为止,我已经尝试使用.html_safe
and raw
Rails 方法,但没有骰子。)