这几天在研究客户端IP的问题,正好翻到Thinkphp的get_client_ip函数,该函数位于Thinkphp/Common/extend.php文件中,具体如下:
function get_client_ip(){
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
$ip = getenv("HTTP_CLIENT_IP");
else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
$ip = getenv("REMOTE_ADDR");
else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
$ip = $_SERVER['REMOTE_ADDR'];
else
$ip = "unknown";
return($ip);
}
学过基本编程的朋友都知道,该函数首先从HTTP包附带的参数进行IP地址判断,最后才对IP包的参数进行检测。而HTTP包通常都是可以自由改变的,比如使用curl工具。这样一来,这个函数就变得非常危险了,很容易使系统存在SQL注入。
相对而言,REMOTE_ADDR的信息相对安全。因为一般而言,REMOTE_ADDR的值无法修改,设置它值的是服务器,如果不存在代理的情况下,获得的是用户的IP地址,如果存在代理的情况下,获得的是最后一个代理服务器的Ip地址。
小结:
1、get_client_ip函数不安全。笔者使用百度、谷歌等搜索引擎对国内相关获取客户端IP的函数进行检索,发现国内绝大多数开发人员均采纳类似的方法进行判断。
2、没有绝对完美的获得客户端IP地址的方法,但本人建议还是直接从REMOTE_ADDR中获取较为安全,毕竟代理服务器不好找,即使能够找到也不会很多的