2011-01-21 10 views
2

私のウェブサイトには特定のリンクのクリックを追跡するgo.phpというファイルがあります。私は自分のウェブサイトで行われたクリックだけをカウントしたいリンク(site.com/go.php?id=)。このコードで試してみましたが、正しく動作していない、他のサイトからのクリック数が数えられます。自分のウェブサイトで行われたクリックだけをカウントする方法はありますか?クリック数が自分のウェブサイトから来ていることを確認してください


EDIT:私はコードをフォーマットしますが、私はhttp://www近くのスペースを残しました。 -gore

+0

クリック数はどのようにカウントしていますか? – MacAnthony

+0

配列にアクセスするときには、常に引用符を使用する必要があります。アプリケーションヘッダに 'error_reporting(0)'を追加し、いくつの問題があるかを見てみましょう。 '$ _ARRAY ['key']' ''や '' ''。 – RobertPitt

答えて

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; 
} 

// ... 
+0

はい、これは今うまくいけばうまくいけば、それは最高の解決策であることがわかります。 –

1

$_SERVER['HTTP_REFERER']変数は、最高の状態で任意であり、さらにはユーザが設定可能、およびその情報の深刻な供給源ではありません。以前は別のページにCookieを設定していました(ブラウザ側のCookieを使用することもできますが、サーバーサイドでは$_SESSIONがデフォルトの30分で期限切れになることはありません)。その情報を確認すると、サイト上で 'go.php'ページに着陸する前に

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 
} 

?> 

私は役に立つと思います。

1

$ _SERVER ['HTTP_REFERER']以外の別のルートを試したり、cookie/sessionを設定する場合は、リンク先ページにスクリプトを書いて、Apacheのアクセスログをチェックして、要求元のIPアドレスがあなたのリンク先ページにアクセスしたばかりです...これは、Cookieを無効にしたり、リファラーを偽造しようとしても表示されません。表示されるURLトークンはありません。

関連する問題