Torユーザーをブロックすることは可能でしょうか?(https://www.torproject.org/)
私が運営しているサイトの性質上、複数のアカウントを停止し、特定の場所をブロックするためにできる限りのことをする必要があります。Torはプロキシよりも悪いです-完全な悪夢...
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)ユーザーとIPアドレスが同じではないため、Torをブロックするのは間違っています。Torをブロックすることで、保守的な出口ポリシーで構成された正当なユーザーと無害な制限付きTor出口ノードもブロックします。
たとえば、SSH(ポート22)への攻撃が心配な場合、Torのみをブロックしてもセキュリティはほとんど向上しません。本当に必要なのは、Torとの関係を無視して犯罪者を追跡するhttp://denyhosts.sourceforge.net/のような動的に同期されたブラックリストです。
Denyhostsは、Torがポート22にアクセスできるようにするTor出口ノードを自動的にブロックします。匿名のユーザーや、犯罪者にSSHサービスを攻撃させないTor出口ノードのオペレーターへのアクセスを不必要に拒否することはありません。
Torプロジェクトは実際にここに独自のリストを提供しています:
.NETでは、それは可能でシンプルです。私は自分のサイトにそれを実装しました。
議論のために、サイトの外部IPアドレスが192.168.0.5であるとします。投稿時の実際のTORIPアドレス: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サービスを使用して、特定の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アドレスのみをサポートしています。
応答が得られるまでに数秒かかる場合があるため、サイトのレンダリングに遅延が生じることに注意してください。
事実、アプリケーションの最善の防御は、ファイアウォールのブロックリストではなく、コードとセキュリティです。真のユーザーを確保することが重要な場合は、2要素認証を使用する必要があります。現在、ブロックリストはまったく役に立たない。
(これは、後で削除され、重複としてここにリンクされたPHP固有の質問のために書かれました)。
免責事項:ここでのベストアンサーで提起されたように、すべてのTorユーザーをブロックすることの影響を考慮してください。登録、支払い、コメントなどの機能のみをブロックすることを検討してください。すべてを包括的にブロックすることは検討しないでください。
-
これが2つの純粋なPHPソリューションです。最初にTorノードリストをダウンロードしてキャッシュし、訪問者のIPをリストと比較します。2つ目は、Tor DNS Exit Listプロジェクトを使用して、訪問者がDNSルックアップを介してTorを使用しているかどうかを判断します。
次の一連の関数を使用して、IPがダウンロードされて10分間キャッシュされる動的出口リストと照合することにより、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://www2.openinternet.io/tor/tor-exit-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を使用してインストールし、アプリケーションcomposer require dapphp/torutils
に標準vendor/autoloader.php
コードを含める必要があります。
チェックのコード:$ isTor = false;
try {
// check for Tor using the remote (client IP)
if (TorDNSEL::isTor($_SERVER['REMOTE_ADDR'])) {
// do something special for Tor users
} else {
// not using Tor, educate them! :-D
}
} catch (\Exception $ex) {
// This would likely be a timeout, or possibly a malformed DNS response
error_log("Tor DNSEL query failed: " . $ex->getMessage());
}
if ($isTor) {
// blocking action
}
アプリケーションでPHPセッションを使用する場合は、「isTorUser」応答を(ソースIPとともに)セッションにキャッシュし、最初にチェックを実行するか、IPが変更されたときにのみチェックを実行することを強くお勧めします(たとえば$_SERVER['REMOTE_ADDR'] != $_SESSION['last_remote_addr']
、重複したルックアップを多く実行しないようにします)。それらは非常に効率的にしようとしますが、同じIPに対して何度も繰り返すのは無駄です。
ここ(https://github.com/RD17/DeTorを参照)は、リクエストがTORネットワークから行われたかどうかを判断するための単純なRESTAPIです。
リクエストは次のとおり
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" />
30分ごとに更新されるすべてのTorノードのリストを見つけました:https ://www.dan.me.uk/tornodes
これには、Torを介して接続および参照するために使用される出口、エントリ、およびブリッジノードを含める必要があります。
このPerlスクリプトを使用して、ダウンロードしたWebページからIPアドレスを収集します。
perl -lne 'print $& if /(\d+\.){3}\d+/' downloadedwebpage.html > listofips.out
1行に1つずつ、IPアドレスのリストが表示されます。私はPerlスクリプトなしでこれを行う何かを見つけようとしましたが、何時間も検索した後、私はそれを見つけることができませんでした。
これがお役に立てば幸いです。
また、同じサイトでいくつかの良い情報を見つけました: https ://www.dan.me.uk/dnsbl
Torトラフィックの検出はかなり簡単です。これを行う主な方法は、 Tor出口ノードリストを監視し、IPをリストと比較することです。
私は最近そのようなことをする必要があり、出口ノードのリストを最新に保ち、出口ノードを検出する簡単な方法を提供するために小さなRubygemを構築しました。また、出口ノードの検出に使用できる小さな実行可能ファイルも作成しました。
宝石はオープンソースであり、ここで見つけることができます: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"
TorDNSELは非推奨になり、2020年4月に新しいシステムに置き換えられたため[1]、このスレッドの回答のほとんどは古くなっています。
少し口論した後、新しいチェッカーを使用するこのコードを思いつきました。これは、IPオクテットを逆にして、新しいチェッカーのURLを作成し、DNS要求を実行して、最初の回答が「127.0.0.2」IPであるかどうかをチェックします。この場合、ユーザーはTorから来たと見なされ、そうでない場合はfalseを返します。
function IsTorExitPoint(){
$dns_record = dns_get_record(ReverseIPOctets($_SERVER['REMOTE_ADDR']).".dnsel.torproject.org.");
if ($dns_record && $dns_record[0] && $dns_record[0]["ip"] == "127.0.0.2") {
return true;
} else {
return false;
}
}
function ReverseIPOctets($inputip){
$ipoc = explode(".",$inputip);
return $ipoc[3].".".$ipoc[2].".".$ipoc[1].".".$ipoc[0];
}
[1] https://lists.torproject.org/pipermail/tor-project/2020-March/002759.html
PD:stackoverflowへの回答を投稿してからしばらく経ちましたので、ご容赦ください。可能であれば改善にご協力ください。
Torプロジェクトが出口プロキシのリストを公開しているために可能です。
出口プロキシのリストは、 https://check.torproject.org/exit-addressesのプロジェクトからスペース区切りのテキスト形式で直接ダウンロードできます。
出口ノードからのすべてのパケットを拒否するすべての出口ノードにiptablesルールを追加するPythonスクリプトを作成しました。スクリプトはここでgithubにあります:https ://github.com/vab/torblock
Torプロジェクトが出口ノードのリストの公開を停止することを決定した場合、それらをブロックすることが可能になります。Torネットワークに接続し、出口ノードを検出するには、コードを記述する必要があります。
はい。実際、ここにすべてのWindowsマシンでそれを実行するスクリプトがあります。上記の他の人と同様に、すべての出口ノードをブロックするのと同じくらい簡単ですが、それは少し手間がかかります。
私はすでにtorノードとtor出口ノードのリストをキュレートしており、これらは1時間ごとに更新されます。https://github.com/SecOps-Institute/Tor-IP-Addressesを参照してください
1時間ごとにgitpullを実行して、最新のリストを取得できます。
なんらかの理由で、ここで別の答えを見つけることができませんでした。現時点では(20 Shevat 5781(Creationから))、この特定のリンクがあります。
https://check.torproject.org/torbulkexitlist
Torをダウンロードし、IPアドレスの検索Webサイトを開いて、そのIPアドレスに移動します(たまたまhttp://195.176.3.20/に移動します。移動すると、リストも表示されます)、そしてそれにナビゲートする....