如何使用PHP检测代理

时间:2019-07-17 11:30:14

标签: php proxy ip ip-address vpn

有时人们使用代理来掩盖其真实IP地址。我不要这个我想限制该用户访问我的网站。

我已经用PHP建立了一个网站。

3 个答案:

答案 0 :(得分:1)

在外围(Web服务器访问控制)而不是前门(PHP)进行大多数哨兵工作更加安全有效。

检查HTTP标头:如果您使用的是PHP,我认为还可以编辑.htaccess,最好在此进行阻止:

# block proxy servers from site access
RewriteEngine on
RewriteCond %{HTTP:VIA}                 !^$ [OR]
RewriteCond %{HTTP:FORWARDED}           !^$ [OR]
RewriteCond %{HTTP:USERAGENT_VIA}       !^$ [OR]
RewriteCond %{HTTP:X_FORWARDED_FOR}     !^$ [OR]
RewriteCond %{HTTP:PROXY_CONNECTION}    !^$ [OR]
RewriteCond %{HTTP:XPROXY_CONNECTION}   !^$ [OR]
RewriteCond %{HTTP:HTTP_PC_REMOTE_ADDR} !^$ [OR]
RewriteCond %{HTTP:HTTP_CLIENT_IP}      !^$
RewriteRule ^(.*)$ - [F]

以上来自https://perishablepress.com/press/2008/04/20/how-to-block-proxy-servers-via-htaccess/),您可以根据需要扩展其他标头检查。 N.B.如果您使用的是托管服务提供商,则网络服务器前可能还有其他(例如反向代理)服务器。例如NGINX服务器可能会在“ HTTP_X_REAL_IP”中提供访问者IP,但没有设置标准,因此它可能会在您阻止的标头之一中提供您的非代理访问者IP。您可以使用this (my) article中的PHP代码进行检查。

匿名代理:检查标头不会阻止您最不希望使用匿名代理访问网站的标头。

如其他答案所述,您可以使用PHP根据端口号进行检查,但是对a similar answer的评论说,由于某些AV软件包(而不是您的客户端)在客户端设备上运行缓慢,误报和恶意软件警报,因此不切实际站点立即提供预期的响应,您将站点“端口扫描”到客户端计算机。

如果使用免费的Cloudflare,则可以阻止标识为“ T1”的已知TOR(暗网VPN)出口节点。

我偶然发现我的主机提供的服务器包括IP地理位置。如果您的Apache或Litespeed服务器正在使用具有最新Maxmind数据的mod_geoip,则GEOIP_COUNTRY_CODE ==“ A1”表示已知的匿名代理。另外,当我一年前检查Operas free VPN时,始终将其标识为“ EU”,无论在浏览器中选择了哪个洲。 Maxmind对某些已知为欧洲但未识别到一个国家的IP地址使用“ EU”,因此将导致误报。

htaccess:

# block TOR if using Cloudflare
RewriteEngine on
RewriteCond %{HTTP:CF-IPCountry} ^(T1)$
RewriteRule .* - [F]

#if you server sets GEOIP_COUNTRY_CODE
GeoIPEnable On
# checks for Anonymous Proxy and Opera VPN
SetEnvIf GEOIP_COUNTRY_CODE A1 isProxy
SetEnvIf GEOIP_COUNTRY_CODE EU isProxy
Allow from all  
Deny from env=isProxy

或PHP:

// if server mod_geoip installed
if ( !empty( $_SERVER['GEOIP_COUNTRY_CODE'] == 'A1') die('Proxy not allowed');
// or if using Cloudflare
if ( !empty($_SERVER["HTTP_CF_IPCOUNTRY"] && $_SERVER["HTTP_CF_IPCOUNTRY"] == 'T1') die('Tor not allowed');

如果您的服务器没有mod_geoip,但是您已经在使用“ Maxmind for PHP”来查找国家/地区代码,则可以将脚本IP修改为国家/地区代码,如果代码为“ A1”,则将死掉。

答案 1 :(得分:0)

您可以使用“ HTTP头

阻止代理
   function shapeSpace_block_proxy_visits() {

     $headers = array('CLIENT_IP','FORWARDED','FORWARDED_FOR','FORWARDED_FOR_IP','VIA','X_FORWARDED','X_FORWARDED_FOR','HTTP_CLIENT_IP','HTTP_FORWARDED','HTTP_FORWARDED_FOR','HTTP_FORWARDED_FOR_IP','HTTP_PROXY_CONNECTION','HTTP_VIA','HTTP_X_FORWARDED','HTTP_X_FORWARDED_FOR');

      foreach ($headers as $header){
         if (isset($_SERVER[$header])) {
             die('Proxy access not allowed.');
         }
      }
   }

答案 2 :(得分:0)

2种实现方法。这些技术适用于任何支持PHP的网站,包括WordPress,Drupal,Joomla以及许多其他

1)通过端口扫描阻止代理访问

function blockproxyvisits() {

$ports = array(80,81,553,554,1080,3128,4480,6588,8000,8080);

foreach ($ports as $port) {
    if (@fsockopen($_SERVER['REMOTE_ADDR'], $port, $errno, $errstr, 5)) {
        die('Proxy access not allowed.');
    }
} }

2)通过HTTP标头阻止代理访问

function blockproxy_visits() {

$headers = array('CLIENT_IP','FORWARDED','FORWARDED_FOR','FORWARDED_FOR_IP','VIA','X_FORWARDED','X_FORWARDED_FOR','HTTP_CLIENT_IP','HTTP_FORWARDED','HTTP_FORWARDED_FOR','HTTP_FORWARDED_FOR_IP','HTTP_PROXY_CONNECTION','HTTP_VIA','HTTP_X_FORWARDED','HTTP_X_FORWARDED_FOR');

foreach ($headers as $header){
    if (isset($_SERVER[$header])) {
        die('Proxy access not allowed.');
    }
} }

这里的缺点是,扫描开放的端口比简单地检查HTTP标头需要更多的时间

相关问题