2013-11-03 14 views
5

使用PHP,你怎麼安全驗證API調用跨域,用以下標準:PHP驅動的API如何驗證真正的客戶端(引用者)跨域(知道頭可以被欺騙)?

  1. 必須從給定的domain.com/page被稱爲(沒有其他域)
  2. 必須有一個給定的鍵

一些背景:請回答前仔細閱讀...

我的web應用程序將通過如下所示的調用在客戶端的網站上顯示一個javascript小部件。所以我們正在談論一個腳本的跨域身份驗證,但僅限於真正的客戶端和一個給定的URL!

目前,Widget可以被CLIENT的網站包含,只需一行javascript。

例client-website.com/page/with/my-widget現在

<head> 
... 
<script src="//ws.my-webappserver.com/little-widget/?key=api_key"></script> 
... 
</head> 

,在現實中,這並不直接調用JavaScript,但我的遠程服務器上的PHP腳本,它坐落在前面實際的JavaScript爲了做一些驗證的目的。

上述呼叫背後的PHP腳本做到這一點首先:

  1. 檢查該API密鑰($ _REQUEST [「鑰匙」])數據庫中的匹配用戶的記錄。
  2. 針對數據庫***中的記錄檢查引用者的URL($ _SERVER ['HTTP_REFERER'])。

這被簡化,但在本質上服務器看起來就像

if ($_SERVER['HTTP_REFERER'] !== "http://client-website.com/page/with/my-widget") 
    && $_REQUEST["Key"] == "the_long_api_key") { 
    header("Content-type: application/x-javascript"); 
    echo file_get_contents($thewidgetJS_in_secret_location_on_server); 
} else { 
    //pretend to be a 404 page not found or some funky thing like that 
} 

***窗口小部件只允許某些網站上的運行/頁

現在,這裏的問題:

  1. 關鍵是在客戶端,所以任何人都可以查看源代碼並獲得密鑰
  2. 引薦可以(通過捲曲)例如

還有一點障礙被欺騙: 我不能告訴客戶堅持一個PHP腳本中的關鍵他們的服務器上,因爲他們可以運行任何服務器邊語!

那麼,如何讓我的網絡服務安全,並只能通過給定的域/頁面訪問?

任何幫助將非常感謝!

ps:小部件會上傳一種下拉框 - 所以安全性很關鍵!

+1

我已經在這之前聽說了很多。它歸結到你需要要麼驗證每一個用戶自己的,或相信其他網站的身份驗證和大力監測不良行爲(這是你在做什麼)。你可以做更多的JS打破業餘捲曲腳本,但除非你想確保每個請求的工作,幾乎沒有什麼可以做。 – dandavis

回答

-1

ID建議使用白名單的方式對這個問題,我不完全肯定這將解決這個問題,但是我已經用於支付處理,這就需要你白名單服務器-IPS類似的技術。