防御緩存穿透攻擊的方法有以下這些:
如果后端數據源不存在數據,則在緩存中緩存一個空值:這種方案局限性很大,通常用來應對正常業務請求,而不能防御外部攻擊。因為只要攻擊者構造的攻擊請求是不重復的,那么這個緩存就不會起到作用。
借助布隆過濾器:布隆過濾器由一個長度為m的位數組(bit array)與k個哈希函數組成的數據結構。當一個元素加入集”~“合時,通過k個哈希函數將這個元素映射成這個位數組中的k個位置,把它們置為1。檢索時,我們只要看這些位置是不是都是1,如果都是1,則可以大致認為這個元素存在(有一定的錯誤率),如果這些位置中至少有一個0,那么這個元素一定不存在。所以,通過布隆過濾器檢測不存在的元素,就不需要到下層數據源進行查詢了,如此就解決了緩存穿透攻擊問題。
對參數格式做過濾:攻擊者需要構造請求來請求系統中不存在的數據來執行攻擊,最直接的防御思路就是我們能不能對參數格式做些過濾,密碼學可以很方便地達到這個效果,可以使用MAC消息認證碼,平時使用多以HMAC為主進行,也可以使用對稱加密方式進行過濾一般使用AC為主,也可以使用AEAD對稱加密或者非對稱加密方式來實現過濾。使用此方案可以把彌補布隆過濾器的缺點。但同時也存在著一些缺點對于已經生成的URL,如果原始數據被刪除,那么這個URL的請求會被放過去。
增加時間隨機值:可以在原有的失效時間基礎上增加一個隨機值,比如1-5分鐘隨機,這樣每一個緩存的過期時間的重復率就會降低,就很難引發集體失效的事件。
使用互斥鎖:業界比較常用的做法,是使用mutex。簡單地來說,就是在緩存失效的時候(判斷拿出來的值為空),不是立即去load db,而是先使用緩存工具的某些帶成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一個mutex key,當操作返回成功時,再進行load db的操作并回設緩存;否則,就重試整個get緩存的方法。
回答所涉及的環境:聯想天逸510S、Windows 10。
防御緩存穿透攻擊的方法有以下這些:
如果后端數據源不存在數據,則在緩存中緩存一個空值:這種方案局限性很大,通常用來應對正常業務請求,而不能防御外部攻擊。因為只要攻擊者構造的攻擊請求是不重復的,那么這個緩存就不會起到作用。
借助布隆過濾器:布隆過濾器由一個長度為m的位數組(bit array)與k個哈希函數組成的數據結構。當一個元素加入集”~“合時,通過k個哈希函數將這個元素映射成這個位數組中的k個位置,把它們置為1。檢索時,我們只要看這些位置是不是都是1,如果都是1,則可以大致認為這個元素存在(有一定的錯誤率),如果這些位置中至少有一個0,那么這個元素一定不存在。所以,通過布隆過濾器檢測不存在的元素,就不需要到下層數據源進行查詢了,如此就解決了緩存穿透攻擊問題。
對參數格式做過濾:攻擊者需要構造請求來請求系統中不存在的數據來執行攻擊,最直接的防御思路就是我們能不能對參數格式做些過濾,密碼學可以很方便地達到這個效果,可以使用MAC消息認證碼,平時使用多以HMAC為主進行,也可以使用對稱加密方式進行過濾一般使用AC為主,也可以使用AEAD對稱加密或者非對稱加密方式來實現過濾。使用此方案可以把彌補布隆過濾器的缺點。但同時也存在著一些缺點對于已經生成的URL,如果原始數據被刪除,那么這個URL的請求會被放過去。
增加時間隨機值:可以在原有的失效時間基礎上增加一個隨機值,比如1-5分鐘隨機,這樣每一個緩存的過期時間的重復率就會降低,就很難引發集體失效的事件。
使用互斥鎖:業界比較常用的做法,是使用mutex。簡單地來說,就是在緩存失效的時候(判斷拿出來的值為空),不是立即去load db,而是先使用緩存工具的某些帶成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一個mutex key,當操作返回成功時,再進行load db的操作并回設緩存;否則,就重試整個get緩存的方法。
回答所涉及的環境:聯想天逸510S、Windows 10。