编 写:袁 亮
时 间:2014-05-20
说 明:关于ip的那些事
一、ip传递过程
1、【真实客户端】 ==> [多级代理服务器] ==> [CDN加速] ==> [前端代理nginx|squid] ==> 【apache】==> 【PHP】
2、中文括号的是必然会经过的,英文括号是可能经过的
3、标准的ip传递是REMOTE_ADDR和HTTP_X_FORWARDED_FOR,前一个跟当前服务连接的真实ip,后一个是请求到前一个ip之前,经过了哪些代理
4、REMOTE_ADDR是不可伪造的,HTTP_X_FORWARDED_FOR是可以任意修改的
5、按标准,每传递到下一层,都会将上一层的实际ip地址加入到HTTP_X_FORWARDED_FOR中,继续传递
6、对每一层来说,只有上一层的时间地址是可信的(REMOTE_ADDR),HTTP_X_FORWARDED_FOR均有风险
7、真实情况中,到了cdn或者前端代理之后,ip传递都是可信的(我们自己可控制),之前的都有篡改的危险
二、各服务的真实ip传递情况
1、CDN 快网的cdn会将用户的实际地址或者代理服务器地址传递到后面的服务中
$_SERVER["HTTP_USER_IP"] 【不用快网的时候可伪造】
$_SERVER["HTTP_FW_ADDR"] 【不用快网的时候可伪造】
测试了一个新的cdn测试,没有传递真实ip过来
2、nginx代理的情况下,可以使用x_real_ip来获取真实ip(有cdn的时候,该值获取的是cdn的ip地址)
$_SERVER["HTTP_X_REAL_IP"] 【不用nginx的时候可伪造】
3、$_SERVER["HTTP_CLIENT_IP"] :代理服务器发送的客户端真实ip【可伪造】
三、现在使用的获取ip函数
a、如果有HTTP_CLIENT_IP,则该ip为用户ip(可被伪造)
b、如果有HTTP_X_FORWARDED_FOR,则将HTTP_CLIENT_IP也加入到HTTP_X_FORWARDED_FOR,判断HTTP_X_FORWARDED_FOR中的ip是否是内网的,取第一个非内网的ip为客户端真实ip
c、经过以上两步还没有取到ip的话,则根据REMOTE_ADDR取用户的ip
ps:该函数的问题在于,前面两个的ip都是可以被任意伪造改写,从而导致获取不到用户的真实ip情况
四、附:(线上使用的获取ip函数)
function getIp(){//获取IP函数
$ip = false;
if(!empty($_SERVER["HTTP_CLIENT_IP"])){
$ip = $_SERVER["HTTP_CLIENT_IP"];
}
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
if ($ip) {
array_unshift($ips, $ip);
$ip = FALSE;
}
for ($i = 0; $i < count($ips); $i++) {
if (!preg_match("/^(10|172\.16|192\.168)\./", $ips[$i])) { // 判断是否内网的IP
$ip = $ips[$i];
break;
}
}
}
return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);
}
标签: ip
如何查看自己的内外网ip以及服务器ip
编 写:袁 亮 时 间:2015-07-17 说 明:如何查看自己的内外网ip以及服务器ip 一、查看自己的ip 1、内网ip 1.1 打开cmd命令行模式 1.2 输入ipconfig 找到ipv4地址以及默认网关 1.3 想要查看更详细的网络配置,比如mac地址等,输入ipconfig /all 2、外网地址 2.1 直接打开百度,输入ip,即可看到自己当前的ip以及归属地 2.2 也可以上tool.ci123.com 查看 二、查看linux服务器地址 1、命令行模式,直接输入ifconfig 2、线上服务器有时候会执行不了,因为账号没权限 3、每块网卡都会有相应的一段输出,看下说明即可
http协议基础:内网、外网
编 写:袁 亮
时 间:2015-07-17
说 明:http协议基础:内网、外网
一、前言:
1、适合于计算机网络基本没学的同学
2、了解为主
二、什么是内网ip,什么是外网ip
1、广域网(WAN):
Internet,这是一个世界通用的网络,这边可识别的ip就是我们常说的外网ip
我们平时上的网络都是这个
家里连接宽带等,其实就是连接到Internet上
2、局域网(LAN):
找了几台计算机,我们互相能识别,那么我们就组成了一个局域网
我们互相之间能识别,但是其他人并不知道我们是谁是谁
一般需要通过一台能连接到Internet的设备去上网,比如我们公司的内部网络,对其他人来说,我们公司的这些电脑都是同一个人
3、为什么需要内网ip
ipv4的ip地址,只能描述256*256*256*256台独立设备,而现在不够用了,因此需要内网ip
三、简单说明
1、外网地址
1.1 相当于绝对地址,比如中国,江苏,南京大学
1.2 跟任何人说这个地址,都是唯一指向同一个
1.3 外网ip,分3类:
A类地址:0-127.***.***.***
B类地址:128-191.***.***.***
C类地址:192-223.***.***.***
2、内网地址
2.1 是一个相当地址,比如说4院3专业2班17号
2.2 在不同的情况下,代表的是不同的
2.3 因此不要出现在公司这边,直接连机房那边的局域网地址,完全是牛头不对马嘴
2.4 内网地址分类,针对外网地址,每一类外网,都有其对应的内网地址格式:
A类:10.***.***.***
B类:172.16.***.***
C类:192.168.***.***
四、内网中,也可以再嵌套内网
1、我们公司,外网地址为:218.94.95.52
2、内网192.168.0.***
3、其中某台路由器的内网ip为192.168.0.8
可以再设置一个内网,192.168.8.***的内网,可以连接256台各设备
五、程序获取ip地址
function getIp(){//获取IP函数
$ip = false;
if(!empty($_SERVER["HTTP_CLIENT_IP"])){
$ip = $_SERVER["HTTP_CLIENT_IP"];
}
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
if ($ip) {
array_unshift($ips, $ip);
$ip = FALSE;
}
for ($i = 0; $i < count($ips); $i++) {
if (!preg_match("/^(10|172\.16|192\.168)\./", $ips[$i])) { // 判断是否内网的IP
$ip = $ips[$i];
break;
}
}
}
return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);
}