get - php怎麼判斷是來自什麼地方的請求

來源:互聯網
上載者:User
比如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.

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.