2012-06-13 51 views
3

我正在絞盡腦汁,爲什麼這是行不通的。限制訪問如果不是來自某些引用者PHP

我想實現的目標是限制訪問我自己的網站上的頁面,只有來自某個網​​站,例如Facebook。

由於鏈接將發佈在1個或更多Facebook頁面和/或我的個人檔案中,因此希望腳本在來自Facebook和/或任何其他發佈的「頁面」時執行。

舉例來說,如果我後我的鏈接www.facebook.com/This_is_my_PAGE或貼在我的個人資料www.facebook.com/freds_personal_profile或有人分享我在Facebook上的鏈接,希望頁只能訪問來自Facebook域名的用戶。

我在搜索解決方案時發現了下面的腳本,但它回顯了我的錯誤消息,而不是重定向到有問題的鏈接。

$target_site = 'https://www.facebook.com/'; 
if (isset($_SERVER['HTTP_REFERER']) && preg_match("/$target_site/",$_SERVER['HTTP_REFERER'])) { 
// do something with people from facebook.com 
} 

else { 
// do something else with everyone else 

echo "Sorry, viewable to Facebook fans only."; 

} 
+2

也許你應該在錯誤信息中回顯'$ _SERVER ['HTTP_REFERER']'的內容。這會給你一個提示。 – jasonlfunk

+0

HTTP_REFEER不是強制性標題,它可能不會被瀏覽器設置。 – Zefiryn

回答

5

首先,你的代碼是有缺陷的,因爲:

  • 如果用戶不使用Facebook的「安全版」(HTTP而不是HTTPS)?
  • 如果用戶來自facebook.com而不是www.facebook.com會怎麼樣?
  • 如果惡意用戶欺騙用戶來自像http://example.com/evilpage.php?https://www.facebook.com/這樣的網站,該怎麼辦?

它不工作的主要原因是因爲你的正則表達式是完全無效的。相反,它應該是沿着線:

preg_match("/".preg_quote($target_site,"/")."/i",$_SERVER['HTTP_REFERER']); 

documentation on preg_quote()

從所有這一切

除此之外,還有在檢查引薦沒有安全。它可以被改變,它可以被完全阻止。它不應該依賴。

+0

我從另外一個類似的問題上拿出了這個問題,認爲它會持有水。這是一個公認的答案。 –

+2

被接受的答案意味着提問的人發現它是正確的。這並不意味着它是最好的答案,也不意味着它是完全正確的,只是它在提問者看來幫助最大。 –

+0

True Kolink。如果下次有,我會更加警惕。 –

1

Facebook的掛接外部鏈接到http協議,不https。改變你的目標網站,這一點:

$target_site = 'http://www.facebook.com/'; 

您可以通過右鍵單擊張貼在Facebook上的鏈接,並將其複製到剪貼板(然後將其粘貼)證實了這一點。你會看到它看起來像這樣:

`http://www.facebook.com/l.php?u=...` 

無論你是實際上httpshttp瀏覽就屬於這種情況。

+0

我嘗試了Ben感謝,即使使用http和https,它仍然顯示我的錯誤消息。這是我沒有得到的。 –

+0

弗雷德,我也注意到你的正則表達式完全被破壞了。請參閱@ Kilink的答案。 –

+0

我正在處理他的代碼,出於某種原因得到500錯誤。 –

相關問題