从 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 访问网站时,访问者的信息未存储在数据库中的主要内容,如果未能解决你的问题,请参考以下文章
如何在Chrome google浏览器中清除和管理Cookie