确认点击来自自己的网站

时间:2011-01-21 18:49:51

标签: php

我的网站上有一个go.php文件,用于跟踪某些链接的点击次数,我只想计算在我的网站上发出的点击次数,而不是其他复制该链接的网站上的点击次数(site.com/go。 PHP?ID =)。我试过这段代码

if($_SERVER[HTTP_REFERER] && !preg_match("/site\.com/", $_SERVER[HTTP_REFERER])) {
    header("Location: http:// www .site.com");
    die();
}

但无法正常工作,其他网站的点击次数也会计算在内。有没有办法只计算我网站上的点击次数?


编辑:我格式化了代码,但我将http://www附近的空格留下了。 -gore

4 个答案:

答案 0 :(得分:2)

$_SERVER[HTTP_REFERER]不值得考虑,因为不能保证它会被用户发送。它的价值也可能会被修改。

您可以使用使用唯一令牌的相当常见的技术:

//some-file.php:
$uniqueToken = substr(sha1(uniqid()), 0, 8); // 8-characters long unique token, eg "2fac223a"
$_SESSION['token'] = $uniqueToken;

// ...

<a href="go.php?id=123&amp;token=<?php echo $uniqueToken ?>">Click here</a>

//go.php:
if (!isset($_GET['token']) || $_SESSION['token'] !== $_GET['token']) {
    // invalid request
    exit;
}

// ...

答案 1 :(得分:1)

$_SERVER['HTTP_REFERER']变量,最好是可选的,甚至是用户可设置的,因此不是严重的信息来源。你以前在另一个页面上设置了一个cookie(你可能想要使用浏览器端的cookie,而不是服务器端$_SESSION,它可以在默认的30分钟内到期)然后检查该信息会告诉你是否他们在登陆“go.php”页面之前访问了网站上的其他页面。

答案 2 :(得分:1)

我认为你在这里找到了正确的想法。在我看来,使用正则表达式可能会有点痛苦,所以也许这会更简单:

<?php

//make sure to use !== rather than != with strpos
if(strpos($_SERVER['HTTP_REFERER'], 'site.com') !== false){
    //if you're here, you've got a match for site.com
}

?>

我希望这有用。

答案 3 :(得分:1)

如果您想尝试与$ _SERVER ['HTTP_REFERER']不同的路由或设置cookie /会话,您可以在登录页面上编写一个脚本,该脚本将检查Apache访问日志以查看请求的IP地址是否只是之前正在访问您的一个链接页面...这应该可以正常工作,即使他们已关闭cookie或尝试伪造推荐人,并且没有可见的网址令牌