通过IP检测用户的首次访问

Posted

技术标签:

【中文标题】通过IP检测用户的首次访问【英文标题】:Detect user's first time visit by IP 【发布时间】:2014-08-28 09:38:42 【问题描述】:

您将如何检测用户的 IP 地址是否是第一次访问 php 中的页面?

我已经尝试过这段代码,但它使用了 cookie,如果我删除浏览器中的 cookie,这显然不再有效......

if (!isset($_COOKIE['firsttime']))
    setcookie("firsttime", "no", time()+3600 ); /* 1 hour */
    echo "<script type='text/javascript'>alert('YES');</script>";
    exit();
 else
    echo "<script type='text/javascript'>alert('NO');</script>";
    exit();

如何通过IP检测?

【问题讨论】:

你的意思是如何从客户端获取IP地址? 很多人都有动态 ip 分配,所以虽然可以删除 cookie,但它可能更可靠 我需要通过用户客户端 ip 检测第一次访问,而不是通过 cookie。如果这不更可靠也没问题 :) 请帮助 IP != 人,你没有用这种方法检测到任何东西 【参考方案1】:

$_SERVER['REMOTE_ADDR']; 将为您提供用户当前 IP 地址,前提是他们没有被代理。

但由于 isp 分发动态 IP 地址,我不能指望这是跟踪用户首次访问的可靠方法

【讨论】:

我在哪里可以把它放在我的代码中?可以发个例子吗? 你把它放在哪里取决于你想用它做什么。 &lt;?php $clientIp = $_SERVER['REMOTE_ADDR']; echo $clientIp; 如果我想像我的示例一样获得“YES”警报和“NOT”警报怎么办?我已经尝试过,但它不起作用...请帮助我是新手 :) 好吧,您需要将每个访问者的 IP 地址存储到数据库中,并在后续访问时比较它们,这将保证一个单独的问题完全 不幸的是我没有数据库:(还有其他方法吗?【参考方案2】:

您通常可以通过从$_SERVER['REMOTE_ADDR'] 获取访问者的 IP 地址(如 @andrew 所述)。

在某些情况下,由于代理等原因,这可能无法按预期工作... (look here),但总的来说,它会为您提供所需的内容。

获得 IP 地址后,您可以将其保存到数据库中,然后在每次有人访问时查找它,以查找现有记录。没有结果意味着它是一个新 IP。

但是,这不是确定访问者是否已经访问过您的网站的好方法。

最可靠的方法(虽然不完美)是使用 cookie。当访问者访问您的网站时,设置一个 cookie...这仍然是跟踪/标记访问者的最佳方式。

您可能有兴趣尝试使用browser fingerprinting,尽管它不是很可靠,因为即使对浏览器配置进行微小的更改也会改变指纹。除非您准备编写复杂的算法来检测细微变化并计算当前指纹与数据库中的指纹匹配的“概率”,否则我建议您坚持使用 cookies

【讨论】:

【参考方案3】:

没有完美的方法可以做到这一点,因为即使是 IP 地址也可以更改。如果用户有Dynamic IP Address,地址可以经常变化。

无论哪种方式,使用用户的IP Address,您都必须将地址存储在服务器上的某个位置。如果您设置了数据库,例如mysql,您可以将IP Address 存储在一个表中。

请参阅PHP 手册中的MySQLi documentation page。

一旦熟悉了MySQL,就可以编写类似这样的代码:

$mysqli = new mysqli("example.com", "user", "password", "database");
if (!$mysqli->connect_errno) 
    //You should validate the IP Address
    $ip = $_SERVER['REMOTE_ADDR'];
    $res = $mysqli->query("SELECT IPAddress FROM tbIP WHERE IPAddress='$ip' LIMIT 1")
    if($res !== false)
        if($res->num_rows > 0)
            //Found
            echo "<script type='text/javascript'>alert('YES');</script>";
         else 
            //Not found
            echo "<script type='text/javascript'>alert('NO');</script>";

            //Here you will probably want to INSERT a new record into the Database
            //tracking the current user.
        
    

再次,我建议您阅读MySQL

如果您无权访问数据库并且已删除 cookies,则可以改为将 IP Addresses 写入文件(将 MySQL 调用替换为从文件中读取的调用。这不是通常是一个不错的选择,但是如果你别无选择,你就没有太多选择了。

【讨论】:

以上是关于通过IP检测用户的首次访问的主要内容,如果未能解决你的问题,请参考以下文章

如何检测远程服务器的 IP?

检测iOS应用程序的首次启动[重复]

在 iCloud 环境中检测应用程序 (IOS/OSX) 的首次运行

远程桌面登录时候提示:检测到首次从该ip登录,请再次确认是不是登录,如何取消?

Windows/C#通过操作系统(不是IP地址)检测用户的半球?

通过 cookie 检测多个帐户