Torからのアクセスだったらブロックする

Torからのアクセスなのかは、TorノードのIPアドレスが各所で公開されているのでここと突き合わせを行うとよいと思います。

アクセス回数に制限があるサイトがいくつかありますが、 http://hqpeak.com/torexitlist/free/?format=json などがあります。

WEBアプリケーションに組み込む場合は、アクセス毎にアプリケーションプロセスがネットワークへ問い合わせにいくとプロセスが不足してしまうことが予測できるので、
IPアドレスのリストを予め保持しておくといいと思います。
ちなみにrubygemsにあるgemの大半がネットワーク問い合わせ型でした。

ということでIPアドレスのリストをActiveRecordを使って取得&検索を行うgemを作りました。
https://github.com/jiikko/activerecord_tor_node

使い方について。
Gemfile に追加からのbundle install で まずtor_nodesテーブルを作成します

class CreateTorNode < ActiveRecord::Migration
  def change
    create_table :tor_nodes do |t|
      t.string :ip, limit: 191
    end
    add_index :tor_nodes, :ip, unique: true
  end

TorNode.fetch_tor_nodes_ip! でIPアドレスのリストを更新します。 controller の filter で下記メソッドを書きます。

  def block_if_from_tor_node!
    if from_tor_node?
      redirect_to(home_root_path, notice: 'tor からは送信できません')
      return false
    end
  end

  def from_tor_node?
    TorNode.exists?(ip: remoteaddr)
  end

以上。