2012-12-09 57 views
3

目前我開發一個REST APIServer和SSL API安全

我的API訪問只是我的服務器和我的客戶端服務器(B2B,企業對企業)之間。例如:myserverapi.com(我的REST API服務器)和myclientserver.com(我的客戶端服務器訪問我的API)*沒有第三個連接/應用

我們正在實施api_key(當然它是必須的)和域名所以客戶具體的域名,他將訪問API,所以我的服務器API將只接受)

for myserverapi.com,如何只接收來自myclientserver.com的連接?僅使用$_SERVER['REMOTE_ADDR']?夠了嗎 ?但從幾個地方閱讀後,我不能使用它,因爲如果它在代理或負載平衡器農場下,IP可能是錯誤的。什麼是解決方案?

以及如何安裝SSL證書?我必須更改我的代碼嗎?或者只是購買並安裝在服務器端,自動我的api將是安全的?

是openssl-verify函數只有安全的方式才能真正知道訪問是從特定的服務器或不是? http://php.net/manual/en/function.openssl-verify.php這是否意味着我必須更改我的代碼來加密和解密數據,如在此鏈接http://3stepsbeyond.co.uk/2010/12/openssl-and-php-tutorial-part-two/

所以基本上我只是想確保myserverapi.com只能從myclientserver.com訪問。 myclientserver.com只接受來自myserverapi.com的數據。怎麼做 ?

我希望有人給我一個很好的解釋。

謝謝

+0

「足夠」是一個難題;對一些人來說,可能。在某些情況下,可能。傳達政府機密,沒有。保護可能傳播的商業祕密,沒有。有效地忽略freeloaders,沒有。安全需要付出一定的代價,並且必須針對運輸,權限,訪問等進行評估。因此,這取決於誠實地評估所涉及的問題,需求或預期的要求,以及是否有足夠的資金和時間來解決問題。計劃相應。 –

回答

0

對於SSL證書,您不必更改您的代碼。您可能,但是,要檢查的服務器端口並拋出一個異常,如果不是SSL:

if ($_SERVER['SERVER_PORT'] != 443) { 
    header('405 Method Not Allowed'); 
    exit(); 
} 

當然,你可以完成使用Apache類似的限制,只需不在端口服完80

對於IP限制,$_SERVER['REMOTE_ADDR']應該在大多數情況下工作。不幸的是,我不認爲有代理方式。但是,API密鑰應該足以滿足大多數安全要求。

1

有一系列你可以做的事情。最不可知的代碼是HTTPS客戶端證書。如果你不關心用戶究竟是誰,而只是想確保這是一個允許的用戶,讓apache來處理。這只是配置文件中的幾行內容,您不必觸摸代碼。

您的第二個選擇是ACL,即使在路徑級別,您也可以在Apache內再次處理這些ACL。當然,在操作系統級別,您也可以將它們應用於IP和端口。這同樣適用於服務器/服務器之前或之前的防火牆。

如果您不想處理管理證書或IP /端口防火牆和ACL,則可以實施2段Oauth。客戶端可以使用庫,因爲它們幾乎已經以任何語言存在,並且服務器的代碼不是太複雜。

0

回答遲了一點,但爲了檢查remote_addr是否可能通過代理髮送請求,您可以檢查是否設置了 X-forwarded-for標頭,並使用該標頭(如果存在)。

http://en.wikipedia.org/wiki/X-Forwarded-For