一尘不染

使用Rails 3.2.11和RSpec发布原始JSON数据

json

为了确保我的应用程序不容易受到此漏洞的攻击,我试图在RSpec中创建一个控制器测试来对其进行介绍。为了做到这一点,我需要能够发布原始的JSON,但是我似乎还没有找到实现此目的的方法。在进行一些研究时,我确定至少曾经有一种使用RAW_POST_DATA标头的方法,但这似乎不再起作用:

it "should not be exploitable by using an integer token value" do
  request.env["CONTENT_TYPE"] = "application/json"
  request.env["RAW_POST_DATA"]  = { token: 0 }.to_json
  post :reset_password
end

当我查看params哈希值时,完全没有设置令牌,而只包含{ "controller" => "user", "action" => "reset_password" }。在所有情况下,尝试使用XML或什至仅使用常规发布数据时,我都得到相同的结果,似乎没有设置时间。

我知道最近的Rails漏洞改变了参数散列的方式,但是还有通过RSpec发布原始数据的方法吗?我可以直接使用Rack::Test::Methods吗?


阅读 203

收藏
2020-07-27

共1个答案

一尘不染

据我所知,在控制器规格内不再可以发送原始POST数据。但是,可以在请求规范中轻松完成此操作:

describe "Example", :type => :request do
  params = { token: 0 }
  post "/user/reset_password", params.to_json, { 'CONTENT_TYPE' => 'application/json', 'ACCEPT' => 'application/json' }
  #=> params contains { "controller" => "user", "action" => "reset_password", "token" => 0 }
end
2020-07-27