2013-02-13 12 views
8

私の質問は単純なiveです。リファラーのドメイン名を介してPHPスクリプトへのアクセスを許可するために使用されていますが、私は完全なURLに一致するリファラーだけにアクセスを許可します。だから、PHP特定の参照URLへのアクセスを許可する/ページのみ

<?php 
if (isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] != 'domain.com') 
{ 
echo "Eexcuting code here"; 
} else { 
echo('Hot Linking Not Permitted'); 
// display some message/image/video 
exit; 
} 
?> 

リファラURLは、それをブロックする場合http://www.domain.com/page.htmlはその後、他のアクセスを許可し一致した場合。

+0

これは安全ではありません。私が望むなら、あなたのページに簡単にアクセスすることができました。 – Peon

+2

それでは、私たちには何が必要ですか? – str

+0

これらのグローバルはブラウザによって送信されます。誰もがそれらを修正することができます。 –

答えて

20

リファラーデータを簡単に偽装することができないため、安全ではありません。しかし、まだあなたのニーズに合っていれば、$_SERVER['HTTP_REFERER']にはドメインだけでなく、完全なリファラーURLが含まれているので、あなたのコードですでにうまくいきます。

<?php 
// This is to check if the request is coming from a specific domain 
$ref = $_SERVER['HTTP_REFERER']; 
$refData = parse_url($ref); 

if($refData['host'] !== 'domain.com') { 
    // Output string and stop execution 
    die("Hotlinking not permitted"); 
} 

echo "Executing code here"; 
?> 

注それはあなたが望むかどうHTTP_REFERERをチェックする前に設定されているかどうかをチェックすれば、人々はどのリファラなしでスクリプトになるだろうということ:それはそのように働くことができないので、実際に、あなたの現在のコードは、いくつかの調整を必要としますまったく設定されていないので、どのような場合でもチェックしてください。特定のURLを確認する方がはるかに簡単です:

<?php 
// This is to check if the request is coming from a specific URL 
$ref = $_SERVER['HTTP_REFERER']; 

if($ref !== 'http://domain.com/page.html') { 
    die("Hotlinking not permitted"); 
} 

echo "Executing code here"; 
?> 
+0

大変感謝しています。とても有難い。 – C0nw0nk

+0

また、URLの末尾にあるクエリ文字列の一致として機能しますか? "page.html?123" – C0nw0nk

+0

はい、それも同様です。 – Gargron

6

保護しようとしていることは何ですか?

(他の人が指摘しているように)偽装できるので、HTTP_REFERERを信用するべきではありません。また、ファイアウォールやセキュリティソフトウェアの中には、refererを書き換えたり削除したりするものがありますが、すべてのブラウザが適切に報告するわけではありません。

機密データの場合は、個人的に私はページ間でハッシュを渡します。

関連する問題