[英]Securing the token of a token based authentication system
我正在使用基於令牌的身份驗證來訪問我為站點設計的一些原始Web API。 登錄時,用戶名和密碼將發布到登錄API,並使用唯一的密鑰生成令牌,並將密鑰存儲在數據庫中。 在每個后續呼叫中,令牌與請求一起發送,並在服務器上使用密鑰進行驗證。
我正在使用一個Web應用程序來使用此API服務並向用戶提供前端。 該Web應用程序是使用HTML / Bootstrap / JQuery設計的,后端是用php編寫的。
我已經成功測試了我的應用程序,並且基於令牌的身份驗證有效。 但是,我有一個擔憂。 我發現僅使用瀏覽器地址欄上的url編碼即可直接顯示用戶ID和令牌。
http://hasconpanel.ckoysolutions.com/hasconpanel.php?inputs={%20%22username%22%20:%20%22Debopam%20Parua%22%20,%20%22uid%22%20:%20%2220170520193421DP%22%20,%20%22token%22%20:%20%22Sa2pHyooWPoI79vfvJzLlw7UO%252B2p5hOpBttkEq7LQ%252BjAGm9XEmxfhLAcnJoLbqrsXCp75%252BG1M7nEUoCgsDVbIQ%253D%253D%22%20,%20%22list_of_devices%22%20:%20[{%22device_code%22:%22b8:27:eb:f1:b3:0f%22,%22device_name%22:%22First-Pi%22}]%20}
現在,如果復制了該地址,或者假定使瀏覽器恢復了上一個會話,那么無論是誰嘗試訪問它,他們都會得到一個條目。 特別是在公用計算機中心的情況下,如果有人使用其憑據訪問我的Web應用程序,並且在殺死瀏覽器之前忘記注銷,則令牌系統似乎會嚴重失敗。 無論如何,是否有像加密令牌一樣保護令牌的安全? 還是因為瀏覽器/瀏覽器選項卡關閉或至少不在地址欄上顯示而導致應用程序不存儲參數? 我曾考慮過在每次請求時都制作一個新令牌,但是這會大大降低系統速度,因此我想避免使用它。
請提出解決此問題的方法。
提前致謝。
編輯:解釋系統現在如何工作:
api系統托管在共享服務器的主域中,而應用程序托管在子域中。 主域還托管一些Web服務,這些Web服務是從家里安裝的一些樹莓pis調用的。
它是這樣工作的,從主要網站進行登錄,成功登錄后,將通過帶有用戶ID,令牌和用戶可用設備列表的get調用來調用Web應用。 提供檢查以防止在沒有這三個參數的情況下訪問應用程序頁面。 在新負載下,用戶可以從下拉菜單中選擇設備。 現在,每個工作設備都可以運行三個獨立的系統。 因此,在選擇設備時,將再次對應用程序進行get調用,將所選設備作為參數與之前的三個參數一起添加。 這在地址欄上顯示令牌和uid。
基於令牌的身份驗證在網絡世界中非常標准。 具體細節各不相同,但是您要嘗試做的當然並不瘋狂。 但是,您的安全問題是有效的,並且有許多潛在的解決方案:
奇怪的是,瀏覽器地址欄中顯示了一個URL。 我希望客戶端應用程序專門通過ajax發出請求,這意味着地址欄中永遠不會有任何內容。 您可能需要詳細說明此應用程序的工作方式。 我懷疑您需要進行重構,以使您的應用程序URL都不會最終出現在地址欄中,而是僅通過AJAX請求進行操作。
HTTPS仍然是最重要的部分。 DNS查找后,您的整個交易將安全地傳輸,因此中間人不能竊取令牌。 這是確保安全的最重要步驟。 如果您不使用HTTPS,則最好將其廣播給全世界。 當然,如果您使用查詢參數中的令牌對URL進行非ajax請求,則該令牌將在瀏覽器的地址欄和歷史記錄中可見。 同樣,通過僅使用ajax請求來避免這種情況,並將cookie放在標題中。
將HTTPS與僅ajax請求一起使用后,令牌被盜的機會就會大大減少。 盡管如此,它仍然可能發生(尤其是通過XSS攻擊),因此請熟悉“縱深防御”的原理。 此外,您可以采取一些步驟來嘗試檢測出被盜的令牌並使該令牌無效。 像:
這些只是我腦海中的一些建議。 同樣,這是一個非常標准的問題,因此google將是您的朋友。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.