2012-12-04 99 views
0

我是一名初學者Web開發人員,對我開發的API的安全性有些懷疑。這是一種簡單的網絡服務,需要認證才能訪問/修改數據。身份驗證安全問題

我想知道什麼是通過HTTP驗證用戶的最佳做法。

目前我的程序是這樣的:

用戶通過它需要用戶名和密碼的API請求(POST)認證。響應包含有關用戶的信息以及將來用於進一步請求的TOKEN。

我的擔憂:我不知道auth請求是否應該POST。這聽起來更像是一個GET,因爲POST應該創建一些東西(至少這是Ruby on Rails中的約定)。然後,即使使用POST或GET,信息傳輸過程中的信息仍「可見」。我聽到了關於HTTPS的一些信息 - 這是如何解決問題的?

令牌在用戶創建時生成 - 並且保持時間相同。這不好嗎?應該在「註銷」後再次生成令牌嗎?我已經看到API使用API​​_KEY沿着令牌進行身份驗證。這是如何運作的?

我有一些GET請求來檢索關於某事的信息。通過這個請求,我將從認證請求中檢索到的令牌作爲參數傳遞。這個可以嗎?我的意思是這個令牌是敏感信息。

我在哪裏可以找到關於我的這些問題(書,文章,W/E)的更多信息?

回答

1

HTTPs會加密您網站的所有流量,因此會隱藏任何獲取和發佈請求。它需要你購買一個HTTPS證書(這很便宜),並獲得一個非共享的IP到主機上(不那麼便宜)。 (如果有人談論自簽名證書 - 好吧,這是可能的,但如果外部人士想要與您的服務對話,我們不會建議)。

擁有持久的登錄令牌可能很糟糕,這取決於您想要什麼樣的不可否認性。如果有人可以在2年前登錄,並繼續使用令牌,您怎麼知道它仍然是原始請求者?令牌應該過期並有重新請求的方式。

API密鑰通常用於在帶外交換的共享密鑰(通常通過從主機的網站獲取)。使用自定義身份驗證方案和標頭,並且必須對每個請求進行計算和檢查。這不需要HTTPS - 共享密鑰用於生成身份驗證標頭,但不隨它一起發送,因此祕密不會隨每個請求一起傳送。當然,你需要編寫這些代碼,並找出你想要的過程。我通常會避免這種情況,除非您知道自己在做什麼 - 您需要對請求進行規範化表示,簽名,然後將其用作標題。這並不複雜,但也不簡單。

+0

你知道一本好書嗎?涵蓋了這些問題? –

1

GET的問題更多的是物理安全而不是網絡安全 - 我知道我經常在工作中或在他人的公司的家中登錄網站 - 我當然不希望將我的憑據附加到URL中一個查詢字符串。

使用HTTPS(SSL)可以保護您的postdata,因爲信息在通過線路發送之前被加密。加密算法使用一些非常聰明的數學方法來生成其解密令牌,以確保它不容易受到中間人攻擊。

+1

作爲一個補充HTTPS是爲了傳輸安全,但查詢參數可以記錄在可以說的Apache HTTPD日誌,如果你不會把日誌作爲敏感數據,你可能會受到傷害:) – fatfredyy