getenv(php7.0以上版本不不能使用的问题)

本文介绍了在PHP7及以上版本中getenv函数可能遇到的问题,并详细讲解了不同类型的代理服务器(包括透明、匿名、欺骗性和高匿名)如何影响REMOTE_ADDR、HTTP_VIA和HTTP_X_FORWARDED_FOR等变量的设置,帮助理解如何在不同代理环境下获取真实IP。

php文档地址

The function 'getenv' does not work if your Server API is ASAPI (IIS).

So, try to don't use getenv('REMOTE_ADDR'), but $_SERVER["REMOTE_ADDR"].

博客查找的问题

解决方式

版本升级容易出现此问题

1,使用php7<=以下版本
2,通过$_SERVER[]替换使用

扩展:

function getIP() { 
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
$realip = $_SERVER['HTTP_X_FORWARDED_FOR']; 
} elseif (isset($_SERVER['HTTP_CLIENT_IP'])) { 
$realip = $_SERVER['HTTP_CLIENT_IP']; 
} else { 
$realip = $_SERVER['REMOTE_ADDR']; 
} 
return $realip; 
} 
一、没有使用代理服务器的情况:

REMOTE_ADDR = 您的 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示

二、使用透明代理服务器的情况:Transparent Proxies

REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 您的真实 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。

三、使用普通匿名代理服务器的情况:Anonymous Proxies

REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 代理服务器 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。

四、使用欺骗性代理服务器的情况:Distorting Proxies

REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 随机的 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。

五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)

REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。

扩展地址

`getenv` 函数用于获得环境变量名对应的值 [^1][^2]。`getenv` 是线程安全的,主要原因在于它在访问和操作环境变量时使用了全局数据结构。 在多线程环境中,多个线程可能会同时调用 `getenv` 函数去访问或修改环境变量。由于环境变量通常存储在一个全局的数据结构中,当一个线程正在读取环境变量时,另一个线程可能正在修改这个全局数据结构,这就可能导致数据一致的问题,例如读取到完整或错误的数据。 另外,`getenv` 函数在实现时可能没有使用适当的同步机制(如互斥锁)来保护对全局数据结构的访问。这使得多个线程可以同时对环境变量进行读写操作,从而破坏了数据的完整性和一致性。 以下是一个简单的示例代码,展示在多线程环境中使用 `getenv` 可能出现的问题: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> // 线程函数 void *thread_function(void *arg) { char *value = getenv("TEST_VARIABLE"); if (value != NULL) { printf("Thread: TEST_VARIABLE = %s\n", value); } else { printf("Thread: TEST_VARIABLE not found\n"); } return NULL; } int main() { pthread_t thread; // 设置环境变量 setenv("TEST_VARIABLE", "test_value", 1); // 创建线程 if (pthread_create(&thread, NULL, thread_function, NULL) != 0) { perror("pthread_create"); return 1; } // 主线程修改环境变量 setenv("TEST_VARIABLE", "new_value", 1); // 等待线程结束 if (pthread_join(thread, NULL) != 0) { perror("pthread_join"); return 1; } return 0; } ``` 在这个示例中,主线程和子线程可能会同时访问和修改 `TEST_VARIABLE` 环境变量,由于没有同步机制,子线程可能读取到一致的数据。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值