比如A網站向B網站發起GET請求,我怎麼判斷這個請求是不是A網站來的?
目前我知道的有$_SERVER['HTTP_REFERER']
但是$_SERVER['HTTP_REFERER']是可以偽造的,請求更好的解決方案
回複內容:
比如A網站向B網站發起GET請求,我怎麼判斷這個請求是不是A網站來的?
目前我知道的有$_SERVER['HTTP_REFERER']
但是$_SERVER['HTTP_REFERER']是可以偽造的,請求更好的解決方案
如果只有 B 站在自己的控制範圍內 ... 那麼沒有更好的辦法 ...
HTTP_REFERER 是 HTTP 協議裡面唯一用來標識使用者來源的欄位 ...
不過如果 A 站也在你的控制範圍內 ... 你可以做一個協議來確認這個請求真的來自 A 站 ...
比如在每個 A 站給 B 站的請求上傳遞兩個參數 ... 一個叫做 t 一個叫做 f ...
如果你收到的 $_GET['f'] 等於 md5( $_GET['t'] . 'secret_key' ) 的話就視為合法 ...
繼續按照原來的邏輯處理這個請求 ... 否則直接將之丟棄掉 ...
如果不想加入兩個參數 ... 也可以用一些 A 站可以擷取的內容來作為 t 參與計算 ...
這是比較穩妥的兩個網站之間標記身份的方法 ... 俗稱指紋或者簽名 ...
上面描述的一次鹽化散列演算法是比較簡單的 ...
如果你需要安全性更高的傳遞 ... 也可以使用 RSA 一類更高強度的演算法 ...
另外還有一種方法 ... 也需要 A 站在你的控制範圍內 ...
比如目標連結是 http://B.ext/somelink ... 需要轉換成 http://A.ext/go/somelink ...
然後在 A 站的幕後處理這樣連結的時候給 B 站的某個限定來源 IP 的地址發一條訊息 ...
訊息內容就是使用者的 IP 瀏覽器和欲訪問的地址 ...
然後 B 站如果緊跟著接到了這樣的訪問就視為是合法的 ... 否則丟棄 ...
恩恩基本就是這樣啦 ...
在服務端目前是沒有更好的方法了,因為HTTP頭部就那麼點內容,很簡單,只有這個欄位是用來標記連結來源的。
A站發送和B站接收時:
1,先用一個字串作為密鑰$key = 'alsfjewoi212';分別放到A站與B站。
2,再把A站要GET的資料$data與密鑰相連並將md5值賦給$x = md5($data.$key);
3,將$x與$data同時get到B站。
4,B站接收時判斷:
if($_GET['x']!== md5($_GET['data'].$key)) exit();
done.