Torユーザーをブロックすることは可能でしょうか? ( https://www.torproject.org/ )
私が運営するサイトの性質上、複数のアカウントを停止し、特定の場所をブロックするためにできる限りのことをする必要があります。 Torはプロキシよりも悪い-悪夢...
Torは、出口IPアドレスのリストが既知で公開されているため、他のオープンプロキシよりもブロックがはるかに簡単です。 https://www.torproject.org/docs/faq-abuse.html.en#Bans で回答を読んで、ユーザーがサイトへのアクセスをブロックしたい場合は、使用できます https://www.torproject.org/projects/tordnsel.html.en または一括終了リストエクスポートツール。
一括終了リストエクスポートツールを使用する場合は、IPアドレスのリストが変更されるため、頻繁に新しいリストを取得し、古いブロックを期限切れにしてください。
(ab)usersとIPアドレスが同じではないため、Torのブロックは間違っています。 Torをブロックすることにより、正当なユーザーと、保守的な出口ポリシーで構成された無害な制限付きTor出口ノードもブロックします。
たとえば、SSH(ポート22)への攻撃を懸念する場合、Torのみをブロックしてもセキュリティはほとんど向上しません。あなたが本当に必要とするかもしれないのは、 http://denyhosts.sourceforge.net/ のような動的に同期されたブラックリストです。
DenyhostsはTor出口ノードを自動的にブロックします。これにより、Tor出口ノードの匿名ユーザーやオペレーターへの不必要なアクセスを拒否することなく、Torがポート22にアクセスできます。
The Tor Project は実際にここに独自のリストを提供します:
.NETでは、これは可能かつ簡単です。私は自分のサイトにそれを実装しました。
議論のために、サイトの外部IPアドレスが192.168.0.5であるとします。投稿時の実際のTOR IPアドレス:95.215.44.97
Imports System.Net
Imports System.Net.Sockets
Imports System.Web
Private Function IsTorExitNode(sIP As String) As Boolean
' Reverse your IP (97.44.215.95) then pass to the string, I have just created it as one for this example
Try
Dim strTor As String = "97.44.215.95.80.5.0.168.192.ip-port.exitlist.torproject.org"
Dim Host As IPHostEntry = Dns.GetHostEntry(strTor)
If Host.AddressList.Length = 0 Then
Return False
Else
If Host.AddressList(0).ToString() = "127.0.0.2" Then
Return True
Else
Return False
End If
End If
Catch ex As SocketException
Return False
End Try
End Function
逆IPアドレス:97.44.215.95
ポート:80
逆IPアドレス:(外部サイトのIPアドレス)
アドレスがTorExitNodeの場合、127.0.0.2を返します。
Global.asaxファイルで、Application_Startを使用してIPアドレスがtrueを返すかどうかを確認し、サイトからリダイレクトします。
If IsTorExitNode("97.44.215.95") = True Then Response.Redirect("http://www.google.co.uk")
今、彼らはあなたのサイトにヒットするとすぐに、そこからリダイレクトされます。
TORには IPアドレス のリストがありますが、それらは常に変更されるため、常にリアルタイムであるため、私の関数を使用することが最善の方法です。
TorDNSEL service を使用して、特定のIPアドレスがTor出口ノードであるかどうかに関するライブクエリを実行できます。特別に形成されたDNS要求を介してサービスを照会します。
以下に、検索を実行するサンプルPHPコードを示します。
function isTorExitNode() {
$serverPort = $_SERVER['SERVER_PORT'];
$remoteAddr = reverseIp(getClientIp());
$serverAddr = reverseIp($_SERVER['SERVER_ADDR']);
$placeholders = '%s.%s.%s.ip-port.exitlist.torproject.org';
$name = sprintf($placeholders, $remoteAddr, $serverPort, $serverAddr);
return ( gethostbyname($name) === '127.0.0.2' );
}
function getClientIp() {
if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
return $_SERVER['HTTP_CF_CONNECTING_IP'];
}
return $_SERVER['REMOTE_ADDR'];
}
function reverseIp($ip) {
$ipParts = explode('.', $ip);
return $ipParts[3] . '.' . $ipParts[2] . '.' .
$ipParts[1] . '.' . $ipParts[0];
}
if (!isTorExitNode()) {
// Do nothing
} else {
Die("Sorry, You cannot use TOR network!!!");
}
重要な注意事項:
この例は、IPv6ではなくIPv4アドレスのみをサポートします。
応答を得るには数秒かかる可能性があるため、サイトのレンダリングに遅延を導入することに注意してください。
ここ ( https://github.com/RD17/DeTor を参照)は、単純なRESTリクエストが行われたかどうかを判断するAPI TORネットワークからかどうか。
リクエストは:curl -X GET http://detor.ambar.cloud/
。
応答は:{ "sourceIp": "104.200.20.46", "destIp": "89.207.89.82", "destPort": "8080", "found": true }
ボーナスとして、サイトにバッジを追加して、ユーザーがTORから来ているかどうかを検出できます。
<img src="http://detor.ambar.cloud/badge" />
ファイアウォールのブロックリストではなく、コードとセキュリティが最高のアプリケーション防御であることは事実です。あなたが本当の真のユーザーを持つことがあなたにとって本質的な問題であるなら、あなたは two-factor authentication を使わなければなりません。ブロックリストは、今日ではまったく役に立ちません。
Torトラフィックの検出はかなり簡単です。これを行う主な方法は、 Tor exit node list を監視し、IPをリストと比較することです。
最近そのようなことをする必要があり、小さなRuby gemを構築して、出口ノードのリストを最新に保ち、出口ノードを検出する簡単な方法を提供しました。出口ノードの検出に使用できる実行可能ファイル。
Gemはオープンソースであり、次の場所にあります。 tor-guard
Gemのインストールは非常に簡単です。
$ gem install tor-guard
独自のRubyコードでライブラリを使用するには、次のようにします。
require 'tor-guard'
if TorGuard.exit_node?('108.56.199.13')
puts "Yep, it's an exit node!"
end
実行可能ファイルも使いやすいです。
$ tg 108.56.199.13 && echo "Yep, it's an exit node"
30分ごとに更新されるすべてのTorノードのリストを見つけました: https://www.dan.me.uk/tornodes
これには、Torの接続と参照に使用される出口、エントリ、およびブリッジノードを含める必要があります。
このPerlスクリプトを使用して、ダウンロードしたWebページからIPアドレスを収集します。
Perl -lne 'print $& if /(\d+\.){3}\d+/' downloadedwebpage.html > listofips.out
IPアドレスのリストが1行に1つずつ表示されます。 Perlスクリプトなしでこれを行うものを見つけようとしましたが、何時間も検索した後、見つけることができませんでした。
これがお役に立てば幸いです。
同じサイトでも良い情報が見つかりました: https://www.dan.me.uk/dnsbl
(これはPHP特定の質問のために書かれたもので、後で削除され、重複してここにリンクされました)。
免責事項:すべてのTorユーザーをブロックすることの影響について、ここでのベストアンサーで述べられているように考慮してください。すべてを包括的にブロックするのではなく、登録、支払い、コメントなどのブロック機能のみを検討してください。
-
2つの純粋なPHPソリューションです。最初はTorノードリストをダウンロードしてキャッシュし、ビジターIPをリストと比較します。2番目は Tor DNS Exit List プロジェクトを使用します訪問者がDNSルックアップを介してTorを使用しているかどうかを判断します。
次の一連の関数を使用して、10分間ダウンロードおよびキャッシュされる動的な list に対してIPをチェックすることにより、IPがTorネットワークに属しているかどうかを判断できます。このリストは自由に使用できますが、可能であれば10分間キャッシュしてください。
Torチェックを実施したい場合は、単に以下を使用できます。
$isTorUser = isTorUser($_SERVER['REMOTE_ADDR']);
if ($isTorUser) {
// blocking action
}
これは、別の関数ファイルに入れて、チェックを実行するときに含めることができるコードです。キャッシュファイルへのパスを変更するには、その一部を調整する必要がある場合があります。
<?php
function isTorUser($ip)
{
$list = getTorExitList();
if (arrayBinarySearch($ip, $list) !== false) {
return true;
} else {
return false;
}
}
function getTorExitList()
{
$path = __DIR__ . '/tor-list.cache';
if ( file_exists($path) && time() - filemtime($path) < 600 ) {
$list = include $path;
if ($list && is_array($list)) {
return $list;
}
}
$data = file('https://openinternet.io/tor/tor-node-list.txt');
if (!$data) {
return array();
}
$list = array();
foreach($data as $line) {
$line = trim($line);
if ($line == '' || $line[0] == '#') continue;
list($nick, $ip) = explode("\t", $line);
$list[] = $ip;
}
sort($list);
file_put_contents($path, sprintf("<?php return %s;", var_export($list, true)));
return $list;
}
/**
* Perform binary search of a sorted array.
* Credit: http://php.net/manual/en/function.array-search.php#39115
*
* Tested by VigilanTor for accuracy and efficiency
*
* @param string $needle String to search for
* @param array $haystack Array to search within
* @return boolean|number false if not found, or index if found
*/
function arrayBinarySearch($needle, $haystack)
{
$high = count($haystack);
$low = 0;
while ($high - $low > 1){
$probe = ($high + $low) / 2;
if ($haystack[$probe] < $needle){
$low = $probe;
} else{
$high = $probe;
}
}
if ($high == count($haystack) || $haystack[$high] != $needle) {
return false;
} else {
return $high;
}
}
DNS出口チェックは、リレーの出口ポリシーを考慮し、クライアントが接続しているサーバー上のIPとポートを調べ、そのような出口トラフィックが許可されている場合に一致を返すという点で、もう少し堅牢です。潜在的な低下は、DNSプロジェクトが一時的に停止している場合、処理が遅くなる前にDNS要求がハングする可能性があることです。
この例では、 TorUtils と呼ばれる、私が書いて保守しているライブラリーのクラスを使用します。
最初に、composer require dapphp/torutils
を使用してComposerでインストールし、アプリケーションに標準vendor/autoloader.php
コードを含める必要があります。
チェックのコード:$ isTor = false;
try {
// check for Tor using the remote (client IP), server IP, and server Port (e.g. 80, 443).
$isTor = TorDNSEL::IpPort(
$_SERVER['SERVER_ADDR'],
$_SERVER['SERVER_PORT'],
$_SERVER['REMOTE_ADDR']
);
} catch (\Exception $ex) {
// This would likely be a timeout, or possibly a malformed DNS response
//echo $ex->getMessage() . "\n";
}
if ($isTor) {
// blocking action
}
アプリケーションでPHPセッションを使用する場合、「isTorUser」応答をセッションに(ソースIPと一緒に)キャッシュすることを強くお勧めします。 $_SERVER['REMOTE_ADDR'] != $_SESSION['last_remote_addr']
)多くの重複したルックアップを実行しないように。非常に効率的にしようとしても、同じIPに対して何度も繰り返すのは無駄です。
はい、実際、これはすべてのWindowsマシンで実行するスクリプトです。上記の他の例と同様に、すべての出口ノードをブロックするのと同じくらい簡単ですが、それには少し手間がかかります。
Torプロジェクトが出口プロキシのリストを公開している可能性があります。
出口プロキシのリストは、スペース区切りテキスト形式で https://check.torproject.org/exit-addresses のプロジェクトから直接ダウンロードできます。
pythonスクリプトを作成し、それらからのすべてのパケットを拒否するすべての出口ノードにiptablesルールを追加しました。githubでスクリプトを見つけることができます: https://github.com/vab/torblock
Torプロジェクトが出口ノードのリストの公開を停止することを決定した場合、それらをブロックすることが可能になります。コードは、torネットワークに接続して出口ノードを検出するために記述する必要があります。