honeypot

Catch bad guys when they stick their hands in the honey.

rails 3 best

uses rack... it might work on late versions of rails 2

honeypot models

honeypots (aka requestables like User, Vote, etc.) should define #actor

class User < ActiveRecord::Base
has_many :votes
include Honeypot
def actor; self; end
end

class Vote < ActiveRecord::Base
belongs_to :user
include Honeypot
def actor; user; end
end

usage in controllers

when somebody touches a honeypot, make sure to log it:

class UsersController < ApplicationController
def create
  # [...]
  @user.log_action_dispatch_request(request)
  # [...]
end
end

class VotesController < ApplicationController
def create
  # [...]
  @vote.log_action_dispatch_request(request)
  # [...]
end
end

and be creative...

class SessionController < ApplicationController
# notice when a User logs in
def create
  # [...]
  current_user.log_action_dispatch_request(request)
  # [...]
end
end

migration

create_table "remote_hosts" do |t|
t.string   "ip_address"
t.string   "hostname"
t.datetime "created_at"
t.datetime "updated_at"
t.float    "latitude"
t.float    "longitude"
t.string   "city"
t.string   "country_code"
t.string   "state_name"
end
add_index "remote_hosts", ["ip_address"], :name => "index_remote_hosts_on_ip_address"
create_table "remote_requests" do |t|
t.integer  "requestable_id"
t.string   "requestable_type"
t.integer  "remote_host_id"
t.integer  "hits"
t.string   "last_http_referer"
t.string   "last_request_uri"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "remote_requests", ["remote_host_id"], :name => "index_remote_requests_on_remote_host_id"
add_index "remote_requests", ["requestable_type", "requestable_id"], :name => "index_remote_requests_on_requestable"

Acknowledgements

in production use at http://brighterplanet.com

Copyright (c) 2010 Seamus Abshere. See LICENSE for details.