如何在不使用Rails帮助程序的情况下实现“安全”的定期执行程序?

时间:2010-05-08 19:09:32

标签: javascript ruby-on-rails prototypejs

我是Ruby on Rails的新手,并且在编写JavaScript方面从来没有那么大,所以内置的助手就像是天堂般的小天使。 但是我最近才知道使用辅助方法创建了“突兀的javascript”,所以我正在进行一些重构,以便从我的视图中获取所有这些混乱的代码。我也在使用Prototype API来弄清楚所有这些函数的作用。

现在,我有:

<%= periodically_call_remote(:url => {:action => "tablerefresh", :id => 1 }, :frequency => '5', :complete => "load('26', 'table1', request.responseText)")%>

产生:

<script type="text/javascript"> 
    //<![CDATA[
    new PeriodicalExecuter(function() {new Ajax.Request('/qrpsdrail/grids/tablerefresh/1', {asynchronous:true, evalScripts:true, onComplete:function(request){load('26', 'table1', request.responseText)}, parameters:'authenticity_token=' + encodeURIComponent('dfG7wWyVYEpelfdZvBWk7MlhzZoK7VvtT/HDi3w7gPM=')})}, 5)
    //]]>
</script>

我担心的是“encodeURIComponent”和“authenticity_token”的存在是由Rails生成的。我假设这些用于确保请求的有效性。 (确保请求来自当前活动的会话?)

如果是这种情况,我怎样才能在application.js'安全'中实现这一点?看起来内置的方法虽然突兀,但确实增加了一些有益的安全性。

提前感谢所有回答的人。

1 个答案:

答案 0 :(得分:2)

Rails生成身份验证令牌以防止XSS攻击。请参阅:ActionController::RequestForgeryProtection您可以将其关闭,但是您使用它会更安全。

最简单的解决方法是将身份验证令牌放在页面顶部:

<% javascript_tag do %>
<%= "var AUTH_TOKEN=encodeURIComponent(#{form_authenticity_token.inspect});" %>
<% end %>

这是突兀的,但至少你可以在application.js文件中自由使用AUTH_TOKEN变量。