2009-09-18 91 views
0

是否安全創建一個反向鏈接:

$backLink = htmlentities($_SERVER['HTTP_REFERER']); 

,或是否有更好的解決辦法?

回答

5

更簡單的方法可能是做這樣的事情:

<a href="javascript:history.back()">Go back</a> 

不依賴於瀏覽器填充Referer標頭,而是不完全一樣的東西按下瀏覽器「返回」按鈕。

這可以被認爲是更好的,因爲它實際上去在瀏覽器的歷史回到,而不是在向前方向將以前的頁面,瀏覽器歷史記錄。它的行爲與您期望的後退按鈕一樣。

+2

但是,請注意,您應該首先使用javascript添加此鏈接,否則鏈接將無法執行其他任何操作,而無法阻止Joe Surfer。 – 2009-09-18 09:57:16

+0

這是真的。建議優雅的降解。 – 2009-09-18 10:07:59

2

只要你檢查它的存在,這是相當安全的。在某些瀏覽器中,它可以被關閉,但我不確定它對瀏覽器來說是強制性的。但基線是,你不能指望它存在。 (RFC2616沒有說referer頭文件必須存在。)

如果你確實需要反向導航,也許你可以改用session變量來保存前一個(當前是真的,但只是在顯示back-鏈接)頁面訪問。

0

鑑於:

  • 的參照標頭是可選
  • 某些安全軟件將改寫Referer標頭(如到XXXX:XXXXXXXX或廣告對於產品)
  • 鏈接到引薦會,最多,複製後退按鈕的內置功能
  • 用戶通常會希望標記爲「後退」的鏈接按順序將其帶到前一頁,而不是前一頁中的前一頁

不,它不安全。危險並不大,但好處很小。

0

它會在某些情況下工作。但是,您應該知道,HTTP referer標頭不保證。不能依賴用戶代理(瀏覽器,搜索引擎等)發送任何內容,無論是否正確。另外,如果用戶直接瀏覽頁面,則不會出現引用標題。一些互聯網安全軟件產品甚至爲了「安全」原因剝離HTTP引用者。

如果你想使用這個解決方案,一定要有一個回退的地方,例如不顯示反向鏈接,或者鏈接到一個默認的起始頁面或者其他東西(這取決於這種情況將用於)。

另一種解決方案可能是使用JavaScript導航到「history.back」。這將使用瀏覽器的後退/歷史功能返回到用戶所在的上一頁。

0

我認爲Facebook使用類似的技術來重定向用戶。

它們使用名爲'from'的GET變量。

0

您必須小心使用htmlentities,因爲它會破壞非ASCII編碼。例如,

echo(htmlentities("Привет, друг!")); //Contains russian letters 

顯示爲

Ï ð&egrave; â å;, ä ð&oacute;&atilde ;!

這當然是不正確的。

每個瀏覽器都會根據需要在URL中發送非ASCI字符。 Unicode中的Mozilla,系統當前字符集中的IE(俄羅斯的Windows-1251)。

所以,用htmlspecialchars替換htmlentities可能會有用。