PHPAttackMiddleware
This feature requires Paraxial.io for Ruby version 1.3.0 or higher.
Most Ruby on Rails applications do not have routes ending in .php, so if an IP does this, that is a strong signal they are malicious and should be banned. Consider the following middleware:
module Paraxial
class PHPAttackMiddleware
VALID_LENGTHS = [:hour, :day, :week, :infinity]
def initialize(app, length: :hour)
@app = app
if VALID_LENGTHS.include?(length)
@ban_length = length
else
puts "[Paraxial] PHPAttackMiddleware invalid ban length: #{length}, using hour"
@ban_length = :hour
end
end
def call(env)
request = ActionDispatch::Request.new(env)
if request.path.downcase.end_with?('.php')
Paraxial.ban_ip_msg(request.remote_ip, @ban_length, "Sent request ending in .php")
# Return a 404 response if the request path ends with '.php'
[404, { 'Content-Type' => 'text/plain' }, ['Not Found']]
else
# Pass the request to the next middleware or the application
@app.call(env)
end
end
end
This is the source code for the Paraxial::PHPAttackMiddleware. Example usage:
config/application.rb
module SampleApp
class Application < Rails::Application
# Initialize configuration defaults for originally generated Rails version.
config.load_defaults 7.0
Dir[Rails.root.join('lib', 'middleware', '*.{rb}')].each { |file| require file }
# IpFilterMiddleware is defined in your application
# on a paid plan, it contains Paraxial.record(request, status)
# Putting it first allows you to see the banned requests in the
# Paraxial.io backend
config.middleware.use IpFilterMiddleware
config.middleware.use Paraxial::PHPAttackMiddleware, length: :week
end
end
With the above configuration, any IP that sends a request ending in .php will be banned. Below is an example of a ban notification from the Paraxial.io Slack App:

If you would like to implement your own middleware logic for banning an IP address, use the function:
Paraxial.ban_ip_msg(ip, ban_length, message)
With the following arguments:
ip - string, same format as `request.remote_ip` above
ban_length - atom, options are :hour, :day, :week, and :infinity
message - string, the reason the IP was banned