单击链接时的PHP跟踪

时间:2015-03-04 17:04:27

标签: php redirect

您好,并提前感谢您提出的任何建议。

我想要完成的任务:当用户点击链接时,我想添加自动增量ID,点击数据库的URL和时间戳,然后将它们发送到URL链接登录页面。

我遇到的问题:点击链接时,URL未添加到数据库,重定向也失败。

以下是我正在处理的代码:

ad_click_tracking.php

<?php


include ("admin/includes/connect.php");


mysql_select_db("$database") or die(mysql_error());

//Collecting the destination URL from the clicked link
$redirect = mysql_real_escape_string($_GET['page']);

//Insert destination URL and time stamp into MySQL

$page_insert = mysql_query("INSERT INTO ad_click_tracking (`url`, `date`) VALUES ('$redirect', now())") or die(mysql_error());

//Redirecting user to the clicked URL

header("Location: $redirect");

//Debugging to see if we collected the URL
echo "Redirect URL: $redirect";

?>

header.php (包含要跟踪的链接 - 第一个链接是内部第二个链接是外部的)

<a href="http://recyclingkansascity.com/ad_click_tracking.php?page="index.php" target="_blank"><img src="/images/header_banner/recycling_kansas_city_header.png" width="620px" height="340px" alt="Recycling Banner" title="Recycling Kansas City"></a></li>

<a href="http://recyclingkansascity.com/ad_click_tracking.php?page="http://paws4autism.org" target="_blank"><img src="/images/header_banner/funny_bunny_5k_autism_egg_hunt.png" width="620px" height="340px" alt="Paws 4 Autism" title="Paws 4 Autism Easter Event"></a></li>

当我点击内部或外部链接时,浏览器会将URL显示为recyclingkansascity.com/ad_click_tracking.php?page=然后当我检查数据库时,ID已自动递增并且插入了时间戳,但URL是空值。出于某种原因($ _GET ['page'])似乎没有抓住页面URL,我还没有弄清楚为什么。我阅读了相关的“类似问题”,但未能找到答案。

1 个答案:

答案 0 :(得分:0)

创建链接的更好方法是使用PHP代码:

$url = 'http://paws4autism.org';
echo '<a href="http://recyclingkansascity.com/ad_click_tracking.php?page='
       . htmlspecialchars(urlencode($url)) . '" target="_blank">...</a>';

这会将url作为查询字符串转义。如果不这样做,它可能会或可能不会工作,但这是正确的方法。例如,http://paws4autism.org将成为http%3A%2F%2Fpaws4autism.org。如果你想知道双重转义,这里有一点分解:

$url = 'http://paws4autism.org';
// escape query string when constructing url:
// (this would be necessary even if you weren't rendering it as a link in html)
$href = 'http://recyclingkansascity.com/ad_click_tracking.php?page=' . urlencode($url);
// escape for html rendering:
echo '<a href="' . htmlspecialchars($href) . '">...</a>';

在ad_click_tracking.php中,您应该在继续之前检查是否设置了$_GET['page']。此外,重定向到页面参数的MySQL转义版本也没有意义。所以,而不是:

$redirect = mysql_real_escape_string($_GET['page']);
// (...insert with $redirect...)
header("Location: $redirect");

我会这样做:

if (!isset($_GET['page'])) {
  // this is a little bit more informative than just dying
  header($_SERVER['SERVER_PROTOCOL'] . ' 400 Bad Request');
  die('No page specified');
}
$redirect = $_GET['page'];
$s_redirect = mysql_real_escape_string($redirect);
// (...insert with $s_redirect...)
header("Location: $redirect");

最后,PHP的普通mysql库并不是真的值得推荐使用。 Mysqli(使用几乎相同的语法)或PDO是首选。见这里:MySQL vs MySQLi when using PHP

哦,至于进行HTTP重定向的安全性,请参阅此页面(我建议阅读所有答案)。唯一真正的问题与网络钓鱼诈骗有关。您无法提供用户通常无法访问的文件。 php security for location header injection via $_GET