机架中间件前置(1);对所有ajax / json请求

时间:2013-07-23 07:19:24

标签: javascript ruby rack middleware

我想做一些类似Google / Facebook在这篇文章中所做的事情: Why does Google prepend while(1); to their JSON responses?

使用rails应用中的Rack中间件,将while(1);添加到脚本和json帖子的开头。通过这种方式,我们可以返回执行ajax GET请求(可能会或可能不会在响应中嵌入authenticityity_token或敏感数据)。

我们还有一个不需要使用它的API,所以我想一些匹配中间件没有启动的URL。

有人能指出我正确的方向这个代码可能是什么样子?谢谢!

1 个答案:

答案 0 :(得分:2)

我认为,有很多问题融入其中。

中间件本身会看起来像(没有检查过,但感觉还是正确的),如下所示:

class AntiHijackingMiddleware
 def call(env)
    status, headers, body = @app.call(env) # save initial state

    if env["HTTP_X_REQUESTED_WITH"] == "XMLHttpRequest" && headers['Content-type'].to_s.include?("application/json")
        body = "while(1);"+body
        headers['Content-Length'] = Rack::Utils.bytesize(body.to_s).to_s
    end

    [status, headers, body]
 end
end

您可以在env["REQUEST_URI"]上添加其他条件以进行网址匹配。

将它添加到Rails的中间件堆栈是样板。