ActiveTK's Note

【PHP】Torを利用しているか判定するプログラム


作成日時 2023/08/28 18:17
最終更新 2023/08/28 18:36


  • まず初めに
  • DNSを用いた判定法
  • 公開されているIPアドレスを.htaccessで拒否する方法
  • まとめ

  • まず初めに

    Torは、高い匿名性を保ってインターネット(正確にはTCP/IP空間)を利用できるとても優秀なソフトウェアですが、一方でその匿名性を悪用したサイバー攻撃や荒らしなども多くみられます。

    本記事では、PHPでユーザーがTorを利用しているか判定するプログラムを二通りご紹介させて頂きます。


    DNSを用いた判定法

    ユーザーの出口ノードのIPアドレスがIPv4である場合、以下のようなコードでTorを経由しているか判定できます。

    ただし、Torの出口ノードの後に更にVPNを経由している場合には判定できないことに注意して下さい。

    <php
    
      // Torを経由しているか判定する関数(by ActiveTK.)
      function IsTor( string $ip ) : bool {
        return (
          gethostbyname( ReverseIPOctets( $ip ) . ".dnsel.torproject.org" ) == "127.0.0.2"
        );
      }
      // IPv4アドレスの順番を逆にする関数
      function ReverseIPOctets( string $inputip ) : string {
        $ipoc = explode(".", $inputip);
        return $ipoc[3] . "." . $ipoc[2] . "." . $ipoc[1] . "." . $ipoc[0];
      }
    
      if( IsTor( $_SERVER['REMOTE_ADDR'] ) )
        die( "当サイトでは、荒らし防止のためTorを経由したアクセスを禁止しております。" );
      else
        die( "当サイトでは、警察に摘発されるリスクを減らすため、Torを経由していないアクセスを禁止しております。" );
    
    

    公開されているIPアドレスを.htaccessで拒否する方法

    Apacheを利用しておりAllowOverride権限が与えられている場合には、.htaccessを用いてTorの出口ノードのIPアドレスを全て拒否することもできます。

    Torの出口ノードのIPアドレス一覧は、こちらで公開されているので、これを全てdenyします。

    # Torを拒否する設定
    order allow,deny
    allow from all
    deny from 176.10.99.200
    deny from 54.37.16.241
    (省略)
    deny from 72.167.47.69
    
    # 最後に改行を入れる(.htaccessのルール)
    
    

    まとめ

    本記事では、PHPでユーザーがTorを利用しているか判定し、アクセス拒否する方法を解説させて頂きました。

    ただし、Torを自らのプライバシーのために合法的に利用しているユーザーも存在しますので、全て強制的に拒否するのは良くないのかもしれません。