您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
webman-請求-獲取请求客户端端口、請求客戶端ip、请求客户端真实ip
发布时间:2022-01-17 23:16:57编辑:雪饮阅读()
获取请求客户端IP
$request->getRemoteIp();
获取请求客户端端口
$request->getRemotePort();
获取请求客户端真实IP
$request->getRealIp($safe_mode=true);
关于客户端真实ip获取
当项目使用代理(例如nginx)时,使用$request->getRemoteIp()得到的往往是代理服务器IP(类似127.0.0.1 192.168.x.x)并非客户端真实IP。这时候可以尝试使用$request->getRealIp()获得客户端真实IP。
$request->getRealIp();原理是:如果发现客户端IP是内网IP,则尝试从Client-Ip、X-Forwarded-For、X-Real-Ip、Client-Ip、Via HTTP头中获取真实IP。
如果$safe_mode为false,则不判断客户端IP是否为内网IP(不安全),直接尝试从以上HTTP头中读取客户端IP数据。如果HTTP头没有以上字段,则使用$request->getRemoteIp()的返回值作为结果返回。
由于HTTP头很容伪造,所以此方法获得的客户端IP并非100%可信,尤其是$safe_mode为false时。
透过代理获得客户端真实IP的最可靠的方法是,已知安全的代理服务器IP,并且明确知道携带真实IP是哪个HTTP头,如果$request->getRemoteIp()返回的IP确认为已知的安全的代理服务器,然后通过$request->header('携带真实IP的HTTP头')获取真实IP。
实例:
<?php
namespace app\controller;
use support\Request;
class User
{
public function hello(Request $request)
{
$arr["getRemoteIp"]=$request->getRemoteIp();
/*
* 是客户端发起方的端口,并不是到达服务器上对应服务端应用端口
如访问http://192.168.31.53:8787/user/hello,则获取到的并不上8787
* */
$arr["getRemotePort"]=$request->getRemotePort();
$arr["getRealIp"]=$request->getRealIp();
//$safe_mode为true防止内网伪造http头
$arr["getRealIp safe_mode true"]=$request->getRealIp($safe_mode=true);
$arr["getRealIp safe_mode true2"]=$request->getRealIp(true);
/*
* $safe_mode为false直接获取http头(尝试从Client-Ip、X-Forwarded-For、X-Real-Ip、Client-Ip、Via HTTP头中获取真实IP),
* 获取不到就是执行$request->getRemoteIp()获取
* */
$arr["getRealIp safe_mode false"]=$request->getRealIp(false);
//获取可信真实ip地址(根据策略,假定这里策略为非127.0.0.1)
if($arr["getRemoteIp"]!="127.0.0.1"){
$arr["post-Main-ip"]= $request->header('post-Main-ip');
}
else{
$arr["post-Main-ip"]="Untrustworthy";
}
/*
* 拓展:
* 个人理解:上面获取客户端端口,应该也是同样的道理
* */
return response(var_export($arr,true));
}
}
nginx反向代理配置:宝塔可以直接在某个站点配置文件一般如末尾加上,这里加在access_log之前,这里没有采用它自身的反向代理添加功能
location /http/
{
proxy_pass http://127.0.0.1:8787/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
# 这部分是利用http头透传真实客户端ip
#proxy_set_header X-Real-IP $remote_addr;
}
访问测试
直接访问:
可以考虑加上自定义header如post-Main-ip,值为客户端真实ip
http://192.168.31.53:8787/user/hello
通过代理访问:
http://www.cece1.com/http/user/hello
关键字词:webman,請求,客户端,端口,ip,真实ip