代码之家  ›  专栏  ›  技术社区  ›  Robbie

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

  •  0
  • Robbie  · 技术社区  · 14 年前

    我对RubyonRails非常陌生,从来没有真正擅长写JavaScript,所以内置的助手就像天堂的一个小精灵。 不过,我最近了解到,使用helper方法会创建“突兀的javascript”,因此我正在进行一点重构,以使所有这些乱七八糟的代码脱离我的视线。我还使用原型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>
    

    我担心的是“编码组件”和“真实性标记”的存在是由Rails生成的。我假设这些是用来保证请求的有效性的。(确保请求来自当前活动会话?)

    如果是这样,我如何在application.js“safety”中实现这一点?似乎内置方法虽然突兀,但确实增加了一些有益的安全性。

    提前感谢所有回答者。

    1 回复  |  直到 13 年前
        1
  •  2
  •   jdeseno    14 年前

    Rails生成一个身份验证令牌以防止XSS攻击。见: ActionController::RequestForgeryProtection 你可以关掉它,但是,你是对的,使用它更安全。

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

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

    它很刺眼,但至少可以在application.js文件中自由使用auth_token变量。