rack-attack middleware を使って IPアドレスでアクセスを制限したり、同一IPアドレスからの大量のリクエストを防ぐ術

こんにちは。味噌汁を飲んでいます、きたけーです。

世の中は脅威で満ちている。

特定のパスへのアクセスをIPアドレスで制限したり、同一IPアドレスからの大量のリクエストを防ぐには、kickstarter/rack-attack · GitHub というrack middlewareが便利です。

以下、使用例。

特定のパスへのアクセスをIPアドレスで制限する

例えば、管理者用ページへのアクセスをオフィスからに限定するには、こんなかんじ

Rack::Attack.blacklist('only allow from office') do |req|
  req.path.match(%r{^/admin}) && (req.ip != OFFICE_IP_ADDRESS)
end

同一IPアドレスからの大量のリクエストを防ぐ

例えば、「通報」を1分間に1回までに制限するには、こんなかんじ

Rack::Attack.throttle('reports limit', limit: 1, period: 60.seconds) do |req|
  req.ip if req.post? && req.path.match(%r{^/reports})
end