从 GOOGLE CHROME 访问网站时,访问者的信息未存储在数据库中

Posted

技术标签:

【中文标题】从 GOOGLE CHROME 访问网站时,访问者的信息未存储在数据库中【英文标题】:Visitor's information not being stored in database when the website is accessed from GOOGLE CHROME 【发布时间】:2019-11-13 03:37:03 【问题描述】:

请耐心等待,因为我会尽力解释这个场景。我的网站有包含访问者信息的数据库。我一直在使用本地主机和不同的浏览器(如 Firefox、IE 和 GoogleCrome)测试这个数据库和网站。数据库工作正常,因为我正在节省访问者的“时间”、“IP 地址”、“浏览器名称”和“国家”。现在我已经在域上托管了这个网站,数据库在 Firefox、IE 上运行良好..但是每当从 GoogleCrome 访问该网站时,数据库中都没有相应的条目。我正在使用 XAMPP SQL 数据库进行测试

这是代码

<?php
function get_browser_name($user_agent)

    if (strpos($user_agent, 'Opera') || strpos($user_agent, 'OPR/')) return 
'Opera Browser';
    elseif (strpos($user_agent, 'Edge')) return 'Edge';
    elseif (strpos($user_agent, 'Chrome')) return 'Google Chrome';
    elseif (strpos($user_agent, 'Safari')) return 'Safari';
    elseif (strpos($user_agent, 'Firefox')) return 'Firefox';
    elseif (strpos($user_agent, 'MSIE') || strpos($user_agent, 'Trident/7')) 
        return 'Internet Explorer';

    return 'Other';


$agent=get_browser_name($_SERVER['HTTP_USER_AGENT']);
$xml = simplexml_load_file("http://www.geoplugin.net/xml.gp? 
ip=".getRealIpAddr());
$user ='root';
$pass ='';
$db ='simplecounter';


$db = new mysqli('localhost', $user, $pass, $db) or die("unable to 
     connect");


$find_counts = mysqli_query($db,"SELECT * FROM user_count");
$ip=$_SERVER['REMOTE_ADDR'];
$date = new DateTime("now", new DateTimeZone($xml- 
>geoplugin_timezone) );
$timee= $date->format('Y-m-d H:i:s');

$sql = "INSERT INTO user_count 
                (browser_name, ip_address, visiting_time, country)
        VALUES ( '.$agent.', '.$ip.', '.$timee.', 
                '.$xml->geoplugin_countryName.')";
if ($db->query($sql) === TRUE) 
    echo "New record created successfully";
 else 
    echo "Error: " . $sql . "<br>" . $conn->error;



function getRealIpAddr()

    if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share 
       internet
    
        $ip=$_SERVER['HTTP_CLIENT_IP'];
    
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip 
       is pass from proxy
    
        $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    
    else
    
        $ip=$_SERVER['REMOTE_ADDR'];
    
        return $ip;
    
?>

无法找到问题的根本原因,任何帮助都会很棒。

【问题讨论】:

Offtopic:这个getRealIpAddr() 函数很糟糕,因为如果我发送 HTTP_CLIENT_IP 标头我可以覆盖我的真实 IP,如果是欺骗性的,我可以覆盖我的真实 IP 【参考方案1】:

Offtopic:这个 getRealIpAddr() 函数很糟糕,因为 if 是可欺骗的 如果我发送 HTTP_CLIENT_IP 标头,我可以覆盖我的真实 IP

这是一个很长的评论。但我建议您将getRealIpAddr() 函数替换为。

function getClientIPAddresses() 
   $ips = array();
    
   (isset($_SERVER['HTTP_CLIENT_IP'])) ? $ips["HTTP_CLIENT_IP"] = $_SERVER['HTTP_CLIENT_IP'] : null; 
   #... add the other headers cases as well. 

   (isset($_SERVER['REMOTE_ADDR'])) ? $ips["REMOTE_ADDR"] = $_SERVER['REMOTE_ADDR'] : null; 
    
   return $ips;

因为此函数将返回一个包含客户端使用的 IP 的数组。

请记住,X-Forwarded-For 标头可以使用 comma separated IP list,并且还有一个 RFC 7239 ( Forwarded HTTP Extension)。 所以正确实现需要更多的研究和代码。

【讨论】:

【参考方案2】:

我设法让你的代码在我的本地主机上运行,​​但我不得不用这个答案中的函数替换 getRealIpAddr 函数: https://***.com/a/13646735/11724378

还请注意,您将代码中的 $ip 变量重新声明为 $_SERVER['REMOTE_ADDR'],这也可能导致问题。还不如在加载xml之前声明一下,像这样:

$ip = getRealIpAddr();
$xml = simplexml_load_file("http://www.geoplugin.net/xml.gp?ip=" . $ip);

Google Chrome 已成功插入到我这边的表格中。检查您是否对该可变长度有任何限制:“Internet Explorer”是否正确保存?也许会弹出其他一些 SQL 错误?如果没有其他方法,请尝试 var_dumping 您的 sql 命令,并通过 PhpMyAdmin 进行试验。

【讨论】:

链接中的“getRealIpAddr”替换功能也可能被欺骗,同样糟糕。

以上是关于从 GOOGLE CHROME 访问网站时,访问者的信息未存储在数据库中的主要内容,如果未能解决你的问题,请参考以下文章

Google搜索从哪个网页进入?

如何在Chrome google浏览器中清除和管理Cookie

如何从我使用 Chrome DevTools 访问的任何网站中挑选颜色?

手动清除Google Chrome DNS缓存

从Chrome扩展程序访问Google文档

20171101晚google chrome 安全上网