我尝试过很多方法,但所有这些方法都不适合我,我猜他们已经过时了,事情发生了变化。也许有人可以告诉我挖掘的方向?
答案 0 :(得分:2)
我是名为TorUtils的PHP库的作者,它提供了许多与Tor和继电器相关的类。
它提供的一个类是TorDNSEL
example ,它为您提供了一个简单的界面来查询Tor DNS退出列表,以查看远程IP是否是Tor中继访问您的网站。
用法很简单:
<?php
use Dapphp\TorUtils\TorDNSEL;
require_once 'src/TorDNSEL.php';
try {
$isTor = TorDNSEL::IpPort(
$_SERVER['SERVER_ADDR'],
$_SERVER['SERVER_PORT'],
$_SERVER['REMOTE_ADDR']
);
var_dump($isTor); // true or false
} catch (\Exception $ex) {
echo $ex->getMessage() . "\n"; // could be DNS time out, or other network issue
}
TorDNSEL
脚本不需要任何其他类,可以下载并用作独立脚本。它发出DNS请求,但直接构建它,因此您也不需要PHP可用的任何DNS功能或库。
或者,我使用ControlClient
类来维护非常新的退出列表。您可以使用它来构建自己的列表(您需要自己的Tor中继才能连接,或者您也可以使用目录权限来构建列表)。更简单,只需定期下载并检查导出here的退出列表。该列表每10分钟更新一次,因此请尽量不要每10分钟左右下载一次。
然后将其保存到您的网站,并根据列表中的内容检查客户端IP。
您可以从GitHub或composer require dapphp/torutils
下载源代码以安装到现有项目。
希望有所帮助,请告诉我是否可以进一步回答。
答案 1 :(得分:0)
check.torproject.org使用的方式是
对于每个访问网站的用户,我们检查他们的IP是否与已知的出口节点的IP匹配,并且其退出策略将允许在端口443(HTTPS)上访问该网站。如果是,那么我们可以很好地假设用户已通过Tor网络成功连接。
您可以在https://git.torproject.org/check.git找到它的来源。它是在MIT许可下。您可以在datastore.go中使用Exits.IsTor
来确定请求是否来自tor。你需要改变
var DefaultTarget = AddressPort{"38.229.72.22", 443}
到您服务器的IP地址和端口。如果你想使用他们的代码,你还需要一些用Go编写的接口。
如果您使用Cloudflare,它会为Tor使用2个字母的代码“T1”,您可以拥有Tor的自定义规则。
请注意,很难将来自Tor出口节点(不是通过Tor)的请求与来自Tor的请求区分开来。大多数地方都认为他们都来自Tor。
答案 2 :(得分:0)
Tor浏览器或未检查我当前正在使用的PHP代码:
<?php
function isTorRequest($num = ''){
if($num == null) { $num = 1; }
$ipServeur = $_SERVER['SERVER_ADDR'];
$ipUser = $_SERVER['REMOTE_ADDR'];
if(!is_dir(__DIR__.'/tmp')){
mkdir(__DIR__.'/tmp');
chmod(__DIR__.'/tmp/','0755');
tor_ips_update();
} elseif(match_ips(__DIR__.'/temp/torips.txt',$ipServeur)){
return true;
} elseif(match_ips(__DIR__.'/temp/torips.txt',$ipUser)) {
return true;
}else{
if($num == 2){
return false;
} else {
tor_ips_update();
isTorRequest($num+1);
}
}
}
function tor_ips_update(){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://check.torproject.org/torbulkexitlist");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
write_file(__DIR__.'/temp/torips.txt',0644, "w",$output);
}
function write_file($file,$permission=false,$action,$data){
$write = fopen($file, "w");
fwrite($write, $data);
if (!$permission == false) chmod($file,$permission); else chmod($file,0644);
fclose($write);
}
function match_ips($file,$ip){
$contents = file_get_contents($file);
$pattern = preg_quote($ip, '/');
$pattern = "/^.*$pattern.*\$/m";
if(preg_match_all($pattern, $contents, $matches)){
return true;
}else{
return false;
}
}
?>