Php 获取数据库中网站的访问者详细信息,但多次保存相同的ip地址

Php 获取数据库中网站的访问者详细信息,但多次保存相同的ip地址,php,mysql,Php,Mysql,这是为了创建数据库 CREATE TABLE `xxx`.`track`(`id_stat` smallint(6) unsigned NOT NULL auto_increment, `v_ip` varchar(15) collate utf8_unicode_ci NOT NULL, `v_time` datetime NOT NULL default '0000-00-00 00:00

这是为了创建数据库

CREATE TABLE `xxx`.`track`(`id_stat` smallint(6) unsigned NOT NULL auto_increment,
                          `v_ip` varchar(15) collate utf8_unicode_ci NOT NULL,
                          `v_time` datetime NOT NULL default '0000-00-00 00:00:00',
                          `v_ref` varchar(200) collate utf8_unicode_ci NOT NULL,
                          `v_agent` varchar(100) collate utf8_unicode_ci NOT NULL,
                          `v_url` varchar(100) collate utf8_unicode_ci NOT NULL,
                           PRIMARY KEY (`id_stat`)
               ) ENGINE = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;
这是php代码,但不起作用。请告诉我我在这里犯了什么错误

<?php
$stsip = $_SERVER['REMOTE_ADDR'];
$stagent = $_SERVER['HTTP_USER_AGENT'];
$sturl = $_SERVER['REQUEST_URL'];
$stref = $_SERVER['HTTP_REFERER'];
$stuser="abc";
$stpass = "thanks";
$sthost="localhost";

$stdb= "visitorsrecord";

$sttable="track";
$handle = mysql_connect("$sthost",$stuser,$stpass) or die("Connection Failure to Database");
mysql_select_db($stdb,$handle) or die ($stdb."Database not found.".$stuser);
mysql_query("insert into $sttable(v_time, v_ip, v_agent, v_url, v_ref) values(NOW(), '".$stsip."', '".$stagent."','".$sturl."', '".$stref."')");
mysql_close($handle);

?>
(我在这里提供一个部分答案,重点是这段代码中的SQL注入漏洞)

第一部分是在浏览器中重置用户代理字符串。Firefox中有相关插件,此外,您还可以访问
about:config
查看内部设置,并在此处手动编辑。尝试重置浏览器,使用户代理字符串为
My browser'
(注意不匹配的引号)

然后运行上面的代码。您将有效地执行这部分SQL:
值(现在(),“1.2.3.4”,“我的浏览器”,“url”,“引用者”)
。仔细看它-请尝试它太-无与伦比的引号已被注入。事实上,推荐人也可以很容易地伪装成这样,也许URL字段也是如此

此示例只会导致数据库错误。根据您配置live server的方式,这可能会导致屏幕上出现错误,从而向攻击者提供有用的信息

幸运的是,这个数据库库不可能在同一个查询中运行多个SQL命令。这样可以避免最具破坏性的注射,其工作原理如下:

referer=
我的浏览器','','';从轨道上删除--

如果图书馆允许,在这种情况下会发生什么?好的,它将完成现有的查询,直到第一个分号,然后尽职尽责地删除它刚刚插入的表中的所有内容。最后的
--
注释将实际查询的其余部分修改为注释

但是,绝对不建议依赖于库无法做到这一点。可能导致错误已经够糟糕的了,但攻击者可能会注入并运行MySQL函数,这可能不安全。对于用于实现安全功能(如登录)的表,它们可能会注入自己的管理员帐户等

这里最快的解决方案是转义您的输入,因此不可能这样做。尝试对所有输入执行此操作:

$stagent = mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']);
这将格式化特殊字符,特别是撇号,以便将它们视为字符串的一部分,而不是分隔符。在所有服务器变量上执行此操作,即使您认为它们不需要它——最糟糕的情况是它什么也不做

最后,这种转义和连接方法主要是为了保护您,但在安全方面,参数化被认为是非常安全的。不幸的是,这个库不支持它,而且由于它已经被弃用(并且在PHP7中被删除),所以当您有机会时,它值得迁移到PDO/mysql或MySQLi


进一步阅读:

首先检查您的数据库。表是否已创建?是的,它已成功创建。感谢回复您可以不使用MySQL而是使用mysqli开始。您应该已经收到了大量的折旧通知,所以您得到了什么实际错误(查看php错误日志)数据库已成功地使用表创建,但当我尝试使用localhost时,我收到了错误消息,数据库未找到。但存在带有表的数据库。谢谢你的回复。