2016-10-15 18 views
0

我正在考慮我的python web應用程序的安全實現。 例如,我有用戶和配置文件。提高拋出:SecurityException() - 每個用戶都可以通過在/資料/ USER_ID檢查修改對象的用戶安全性

發送POST在每次請求我可以獲取會話USER_ID並與profile.user_id比較,如果它們不相同的編輯他的個人資料。

但我也可以做另一種更常見的方式: 生成的每個配置文件

secret = hash(profile_data+secret_key) 

和渲染AUTH。用戶鏈接是這樣的:

/profile/4?key=secret 

所以想法是基於可編輯對象數據生成密鑰並在服務器端檢查此密鑰。如果用戶不知道密鑰,則無法獲取編輯其他配置文件的鏈接,因此無法修改它們。

這種保護方法如何調用? 與基於會話的user_id檢查比較有任何問題嗎? ?

+0

如果您希望允許用戶修改其他用戶的配置文件,祕密方法可能奏效,請注意您應該瞭解一些安全攻擊以及如何防範它們(例如計時攻擊)。另一個問題是用戶體驗,如果用戶編輯他的個人資料,從而修改他的密鑰,所有先前的URL將失效,這將是很麻煩的。 此外,我不知道這是否僅僅是因爲它是一個例子,但要小心內置'哈希'函數,這是不criptographically安全。 –

+0

鏈接invalidaion的問題可以通過僅生成散列僅對持久數據(如ID)...所以散列(id + secret)來解決,它是否不太安全,然後生成可變數據? – Evg

+0

我只是沒有看到專業人士,你會得到更醜陋的URL,並且萬一祕密泄露,你必須更新所有用戶的URL。 –

回答

2

/資料/ 4鍵=祕密

實際問題:

  • 它通常是一個壞主意,把一個祕密的URL。網址易於通過日誌,歷史記錄,推薦人等輕易泄漏。最好把祕密放在cookie或POST數據中。
  • 您通常會包含在簽名數據的時間限制,所以令牌不是永遠有效
  • 您通常會包括某種標誌/計數器/狀態的用戶信息和簽名的數據,從而使用戶可以更新某些東西(例如更改密碼)以使先前發佈的令牌無效
  • 您還必須確保已簽名數據的生命週期不能超過令牌的生命週期,例如,您不能刪除用戶4和創建一個新用戶4,其令牌仍然有效
  • 您使用的散列將是使用服務器端密鑰的HMAC

出於性能或操作方面的原因,已簽名的身份驗證令牌通常用作數據庫支持的會話存儲的替代方案。當然可以使用簽名令牌安全地進行會話,但是如果您已經將存儲會話用於其他目的,無論如何,您都沒有太多收穫。