2013-03-27 103 views
2

我編輯了我的問題,並使其簡單,因爲我認爲它的含糊。所以 我簡化了。 我想使用API​​存儲在瀏覽器中使用cookie來驗證用戶。當然cookie在每次登錄時都會隨機更改。最好的方式來分享Cookie與API來驗證用戶

信息知識:使用自定義API和PHP在後臺

和JavaScript Tempojs作爲模板引擎前端。

編輯:

我的算法是這樣的: 數據庫只有一個,其在每一個被登錄,試圖增加其每次登錄變化領域。

當用戶使用php登錄。會話和cookie的產生和用於連接到API一個cookie將被

hash of (username + login attempt+ salt)= xxxxxxxyyyyyyxxxxxx 

現在阿比知道cookie的值應該是什麼,所以它驗證用戶是正確的,無論何時。現在用戶註銷響應數據cookie過期並且api無法再進行身份驗證。 我將用於獲取用戶數據我將張貼

Cookie通過xmlhttprequest到api服務器,它位於不同的子域,並將數據加載到web應用程序中。

這是我的計劃,如果有人認爲這種方法是脆弱的或不安全的。請讓我知道。 是跨域請求我將使用

標題(「訪問控制允許來源:*」) 或 標題(「訪問控制允許來源:‘www.website.com’」 )

但是,如果你有替代品。請描述我可以使用jsonp,但我不想,也可能我也必須上傳文件數據。

+0

vaque問題,什麼樣的語言,什麼樣的api。你可以發佈一些代碼嗎? – Codebeat 2013-03-27 23:47:09

+0

@Erwinus我認爲這個問題很清楚。讓我解釋。我有我的網站api服務器,只有當通過get或post發送祕密散列時纔會響應。 生成的祕密散列。只有API可以驗證它的正確與否。 出於安全原因,散列值每次在用戶登錄時都會更改,並且存儲在cookie中。 你會怎樣將這個散列值發送到api服務器以進行思想js的通信,因爲在api的登錄請求之後只能從客戶端完成多次,以便接收json數據。 – Abhishek 2013-03-28 08:03:44

+0

就像我之前說的,沒有代碼我們無法幫助你!我明白你想要做什麼,但不清楚你如何實現它,也許你的實現是錯誤的。 – Codebeat 2013-03-28 21:30:57

回答

3

您提出的解決方案聽起來不錯。但是,有幾件事情你應該確定:

  • 確保哈希中的鹽足夠長(我只是使用32個字符來保證安全,儘管這有點多) 。
  • 確保鹽真的是散列函數中的最後一個組件。如果不是,攻擊者有可能在某些情況下創建自己的Cookie(here's how)。
  • 當你做散列時使用分隔符。例如,如果有用戶foo,並且還有另一個用戶foo1,則在沒有使用分隔符時會發生這種情況:foo第11次登錄時,其Cookie是hash("foo11"+salt),並且當foo1第一次登錄時,他的cookie也是hash("foo11"+salt)。這會很糟糕,所以請改用hash(user+"|"+login_attempt+"|"+salt)之類的東西。
  • 我想你的API服務器也必須發送Access-Control-Allow-Credentials: true標題。

哦,還要記住,當用戶從計算機A登錄然後從計算機B登錄時,他從計算機A的會話將不再有效。

+1

+1爲偉大的答案。是的,鹽(及其長度)是整個事件中最重要的部分,因爲這是隨機性出現的地方,因此攻擊者不能製作自己的Cookie。打電話給定界符;-)爲什麼鹽需要最後?既然無論如何都是哈希,那麼重要嗎?攻擊者能夠創建自己的Cookie是什麼情況?我現在要說你的話,但我很好奇。 – 2013-04-02 16:16:41

+1

@Freedom_Ben:我明確地提到了分隔符,因爲我在實際系統中看到了一個漏洞,因爲它沒有使用分隔符。 :D關於元素的順序:看看http://en.wikipedia.org/wiki/Length_extension_attack,看看如果你在最後的位置沒有祕密會發生什麼。 – thejh 2013-04-02 18:06:41

+0

感謝您的鏈接!這是一個我從未聽說過的迷人和模糊的攻擊。做得好。 – 2013-04-02 18:15:55

相關問題