2014-05-24 40 views
2

我已經實現在一個項目我工作的安全系統,如下所示(請告訴我,如果事情是在圖中不清楚,其簡單雖然)處置未使用的安全令牌的最佳方法?

chart

這是工作完全一樣應該,但如果有人提出請求的,並且一旦令牌已在客戶端收到中止它,然後激活令牌仍然會在數據庫中,可以被黑客惡意利用。

雖然我刪除數據庫中verifyToken步驟令牌,但如果令牌還沒有達到它,它仍然是可用的。如果請求在令牌發佈後被中止,那麼你們認爲將會丟棄令牌的方法是什麼?

而且,即使客戶端獲得訪問令牌後,他只能讓一個請求令牌標記無效之前。但是,即使一個請求可能是非常危險的。

UPDATE:我的令牌機制如下:

發送令牌:

1)生成2級隨機的令牌:TOKEN1和token2。

2)生成這樣的哈希:TOKEN1 +用戶ID + SALT

3)存放在DATABSE的所有數據。

4)發送TOKEN1,token2,和新的散列(ⅰ稱之爲id_hash)

驗證令牌:

1)接收TOKEN1和token2。

2)如果token2不從數據庫匹配,返回FALSE。

3)從會話獲取用戶ID。

4)哈希它按以下順序:TOKEN1(收到)+用戶ID(會話)+ SALT

5)驗證新驗證的散列與所接收的id_hash。

6)如果匹配,返回true,否則返回FALSE。

這樣,用戶只能訪問/更改與其用戶ID相關的數據,而不能訪問其他用戶的ID。 你們覺得這足夠嗎?或者這種方法有缺陷嗎?

我在apache2 webserver上使用PHP和MySQL。

+0

唯一標記可以請求多少次? – fortune

+0

@fortune考慮到令牌在verifyToken步驟中被刪除,我會說他們只能使用一次。 –

+0

順便說一下,處置 - 不處理 – CreativeMind

回答

0

當發送令牌存儲在客戶端的隨機字符串作爲鹽使用(當然不是鹽隨機檢查)

作爲一個會話中應該發生的所有請求與請求一起發送這個隨機字符串確認您正在與正確的客戶端通話(在第一階段發送 - 請求令牌,然後在驗證時驗證此令牌)。

這顯然不會阻止任何人攔截消息,但如果他們得到未使用的標記,沒有隨機字符串作爲第二個測試將是沒用的。

此外,添加一個時間戳到您的標記 - 如果他們未被驗證說10秒內被創建使他們無效。

+0

我明白了。雖然,我已經這樣做了。但要發送字符串以及請求,我們必須將其包含在表單中。這不會讓攻擊者看到嗎? 如果正確的客戶端是他/她自己的攻擊者呢?然後他可以在任何地方使用該令牌,只要他知道該令牌是什麼... –

+0

是的,但您的問題不是關於如何確保連接不受攔截 - 應該使用SSL證書完成。以上內容確保了令牌的有效性 - 通過cron作業每小時/每夜清除所有令牌,因爲它們應該是短暫的。 –

+0

我確實有SSL證書,並且所有連接都已加密。另外,請參閱更新的問題。我確實有一個cron作業,它會刪除所有已停用10分鐘的令牌。 –

0

那麼這是我的方式來做到這一點。

我會在每3分鐘後重新驗證並重新生成令牌。

並且在處理該令牌所做的任何請求之前,我會檢查它是否有效。

這會自動驗證舊的令牌。

方式二:

TimeStamp:使用時間戳檢查令牌的有效性。如果該標記在最後3分鐘內沒有進行任何活動,則使該托克無效。爲此,您需要一個cron job以使該腳本每​​隔特定時間間隔運行一次。

希望它能幫助你。

+0

我明白了。但是,如果我在頁面加載時發送令牌,並且在用戶發出請求之前它會一直保留在那裏呢?如果用戶沒有提出任何請求,比如5分鐘,那麼他/她的代幣將會過期,他/她會看到一個錯誤? –

+0

@abhishek你可以使用'Ajax'保持連接的活動狀態,所以即使用戶沒有提出請求,你也可以在腳本中創建它。 –

+0

不會保持連接活着是一個更大的缺陷?就好像攻擊者獲得訪問權限一樣,他可以惡意使用該連接嗎? –

相關問題