chu*_*boy 4 ruby security ruby-on-rails
我正在创建一个API服务,允许人们向API调用提供图像的URL,然后服务下载要处理的图像.
我如何确保有人不会给我一个像5MB图像的URL?有没有办法限制请求?
这就是我到目前为止所掌握的一切.
req = Net::HTTP::Get.new(url.path)
res = Net::HTTP.start(url.host, url.port) { |http|
http.request(req)
}
Run Code Online (Sandbox Code Playgroud)
谢谢,康拉德
不幸的是,cwninja给了你一个只能用于意外攻击的答案.一个聪明的攻击者将毫无困难地击败那张支票.不应该使用他的方法有两个主要原因.首先,没有什么能保证HEAD响应中的信息与相应的GET响应相匹配.一个正常运行的服务器肯定会这样做,但恶意行为者不必遵循规范.攻击者可以简单地发送一个HEAD响应,该响应表明它的内容长度小于你的阈值,但随后在GET响应中提供了一个巨大的文件.但这甚至没有涵盖服务器使用Transfer-Encoding:chunked标头集发回响应的可能性.一个分块的反应很可能永远不会结束.即使您的HTTP客户端强制执行超时,一些人将您的服务器指向永无止境的响应可能会执行轻微的资源耗尽攻击.
要正确执行此操作,您需要使用一个HTTP库,它允许您在收到字节时对其进行计数,如果超过阈值则中止.我可能会推荐Curb而不是Net :: HTTP.(甚至可以使用Net :: HTTP执行此操作吗?)如果使用on_body和/或on_progress回调,则可以计算传入的字节数并在收到过大的文件时中止响应.显然,正如cwninja已经指出的那样,如果你收到的Content-Length标题大于你的阈值,你也想要中止它.Curb也明显快于Net :: HTTP.
归档时间: |
|
查看次数: |
1668 次 |
最近记录: |