EMLOG支持接收IPV6地址信息
mlog应用无法获取到IPv6地址的问题出现在 include/lib/common.php 文件中的 getIp() 函数。
function getIp()
{
$ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
// Check for Cloudflare
if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
$ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
} elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$list = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$ip = trim($list[0]);
}
if (!ip2long($ip)) { // 这里是问题所在
$ip = '';
}
return $ip;
}
问题根源 :第50行使用了 ip2long($ip) 来验证IP地址的有效性,但是 ip2long() 函数只支持IPv4地址,对于IPv6地址会返回 false ,导致IPv6地址被当作无效地址而被清空。
这个问题影响到多个功能模块:
- 评论系统(comment_model.php)
- 文章访问记录(log_controller.php)
- 用户登录记录(account.php)
- 点赞功能(like_model.php)
- 安装过程(install.php)
解决方法
需要修改 getIp() 函数,使其支持IPv6地址验证:
function getIp()
{
$ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
// Check for Cloudflare
if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
$ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
} elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$list = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$ip = trim($list[0]);
}
// 使用 filter_var 替代 ip2long,支持IPv4和IPv6
if (!filter_var($ip, FILTER_VALIDATE_IP)) {
$ip = '';
}
return $ip;
}
版权所有:刘小猪--博客
文章标题:EMLOG支持接收IPV6地址信息
文章链接:https://blog.liuxiaozhu.cn/?post=67
本站文章均为原创,未经授权请勿用于任何商业用途
文章标题:EMLOG支持接收IPV6地址信息
文章链接:https://blog.liuxiaozhu.cn/?post=67
本站文章均为原创,未经授权请勿用于任何商业用途
收到1条评论
666 23 天前
66666
回复