為什麼資料庫ID不能作為URL中的識別符號

2022-02-25 16:09:22 字數 1110 閱讀 1918

最近公司在進行**的seo優化,將所有主要頁面的url統一更改為新的格式,其中重要的一項改變是將所有url的識別符號統一為id,例如過去我們的乙個使用者的公共頁面url是這樣的

而更新後的格式則變成

在看到設計文件(design doc)的同時,我本能就對這個這樣的url形式產生了一絲疑慮,但又說不上為什麼。

我們的使用者資訊是存在mysql資料庫的表單中,user_id是乙個整數型別的主鍵(primary key),同時也是自增(auto increment)字段。

從安全角度來說,使用user_id來作為識別符號的url設計並沒有什麼問題,但是這樣會有別的問題,什麼樣的問題呢?

暴露商業資料!

暴露的資料1:總體使用者數量

有心人如果想要知道公司現在的總體使用者數量,那麼很簡單,只需要註冊乙個新使用者,然後檢視自己的公共主頁,這樣新使用者的user_id就會暴露出來,而這個user_id就約等於**現在的總體使用者數量(有一部分被刪除的使用者除外)

暴露的資料2:使用者增速

如果說暴露總量還不是最危險的,使用者增速則是更加重大的資訊暴露。有心人知道url中的user_id規律之後,可以通過做很簡單的實驗

1. 建立乙個新使用者,檢視url中的使用者id。

2. 隔一段時間之後(一周/月),再建立乙個新使用者,檢視url中的使用者id。

二者相減(1005000-1000000)就可以輕易得到這段時間內的使用者增長量。甚至可以在外部用很小的代價獲得非常精確的使用者增長曲線。

而這樣的資料,對於大部分公司來說,都是非常核心的資料,尤其在公司未上市之前,應該盡量避免此類資料外流。

這樣的情況十分普遍,因為在學習web開發的初級教程中,幾乎都會將資料庫主鍵id用來作為url識別符號,這樣從url解析主鍵到後台服務使用主鍵查詢資料庫,可以非常簡潔直觀。但是在實際的生產環境中,這樣的做法往往並不可取。

那麼有什麼樣的方法可以避免使用資料庫id呢?

1. 使用uuid —— uuid是亂序的字串,所以無法用來**資料,我們可以用多種方法來設計uuid。如果你使用了mongodb等nosql的儲存,那麼恭喜你獲得了天然的uuid,每乙個objectid都是你可以使用的uuid。如果你的資料依然離不開關聯式資料庫,那麼可以考慮在資料庫中擴增欄位來生成uuid並儲存,同時提供基於uuid的查詢介面。

a 為什麼不能作為左值

下面引用在部落格上看到的乙個易於理解的回答 首先說左值和右值的定義 變數和文字常量都有儲存區,並且有相關的型別。區別在於變數是可定址的 addressable 對於每乙個變數都有兩個值與其相聯 1 它的資料值,儲存在某個記憶體位址中。有時這個值也被稱為物件的右值 rvalue,讀做are value...

資料庫 為什麼選擇B 樹作為資料庫索引結構?

首先,來談談b樹。為什麼要使用b樹?我們需要明白以下兩個事實 事實1 不同容量的儲存器,訪問速度差異懸殊。以磁碟和記憶體為例,訪問磁碟的時間大概是ms級的,訪問記憶體的時間大概是ns級的。有個形象的比喻,若一次記憶體訪問需要1秒,則一次外存訪問需要1天。所以,現在的儲存系統,都是分級組織的。最常用的...

i 為什麼不能作為左值?

1 首先說左值和右值的定義 變數和文字常量都有儲存區,並且有相關的型別。區別在於變數是可定址的 addressable 對於每乙個變數都有兩個值與其相聯 1 它的資料值,儲存在某個記憶體位址中。有時這個值也被稱為物件的右值 rvalue,讀做are value 我們也可認為右值的意思是被讀取的值 r...