有时人们使用代理来掩盖其真实IP地址。我不要这个我想限制该用户访问我的网站。
我已经用PHP建立了一个网站。
答案 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标头需要更多的时间