检查用户是否使用Tor请求站点的现代方法是什么? (PHP)

时间:2016-06-22 10:46:16

标签: php tor

我尝试过很多方法,但所有这些方法都不适合我,我猜他们已经过时了,事情发生了变化。也许有人可以告诉我挖掘的方向?

3 个答案:

答案 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;
  }
}
?>

实时URL https://reseller.neoistone.com/api/