Python 反爬篇之 ID 混淆
爬蟲與反爬是一對相生相克的死對頭,道高一丈魔高一尺。作為爬蟲的一方,如果知道了某個站點的數(shù)據(jù)自增ID,那么就能輕而易舉把整個站點都爬下來。是不是有點聳人聽聞,你去看很多大站例如油管、P站等,他們都不會輕易把業(yè)務(wù)的自增ID暴露出來,而是用一種可逆的hash字符串替代。

最常用的ID混淆就是Hashids。Hashids是一個小型的開放源代碼庫,可以將數(shù)字生成很短的、唯一的、非順序的字符ID。
例如可以數(shù)字347轉(zhuǎn)換為 “yr8” 字符串,你還可以將字符串ID進(jìn)行解碼恢復(fù)成數(shù)字。

下面就來看看咋使用的
安裝
pip install hashids怎么使用
首選初始化一個 hashids 實例
from hashids import Hashids
hashids = Hashids()編碼(加密)
>>> id = hashids.encode(1)
>>> id
'jR'
>>> hashids.encode(123)
'Mj3'
>>> hashids.encode(1234)
'1lj'
>>> hashids.encode(12345)
'j0gW'
>>> hashids.encode(123454)
'v27AV'生成的字符ID長度與和數(shù)值大小有關(guān)。
解碼(解密)
>>> num = hashids.decode('jR')
>>> num
(1,)
>>> hashids.decode("Mj3")
(123,)
>>> hashids.decode("1lj")
(1234,)
>>> hashids.decode("j0gW")
(12345,)
>>> hashids.decode("v27AV")
(123454,)解碼后返回時一個元組。
如果你解碼一個隨機的字符串ID,不一定能恢復(fù)成數(shù)字,此時會返回空元組。
>>> hashids.decode("werwer")
()因為hashid可逆,所以別人拿到字符串后也能根據(jù)字符串ID反推出數(shù)字,因此,為了避免別人猜出原始數(shù)字ID,我們在編碼的時候可以指定鹽值。理論上,只要鹽值不被泄露,被破解的難度就加大了很多。
指定鹽值
初始化 hashids時候,可以指定鹽值
>>> hashids = Hashids(salt="XXXX")
>>> hashids.encode(123)
'1LY'
>>> hashids.decode("1LY")
(123,)同樣的數(shù)字使用不同的鹽值編碼得到的字符串是不同的,別人就無法猜出原始ID是多少了。
限制hash長度
默認(rèn)情況下,數(shù)字越小,編碼生成的字符串也比較短,為了將不同大小的數(shù)值轉(zhuǎn)換為統(tǒng)一長度的字符串,在初始化hashids的時候,可以指定hash的最小長度
>>> hashids = Hashids(salt="XXXX", min_length=10)
>>> hashids.encode(123)
'PyNd1LYK3G'限制hash的字符種類
如果你不希望hash中有大寫字母,那么可以在初始化的時候,指定hash字符串的范圍,例如我們可以指定為所有的小寫字母
>>> hashids = Hashids(alphabet="abcdefghigklmopkrst")
>>> hashids.encode(123)
'ggdo'需要注意的時候,alphabet至少要指定16個以上的不同字符。
hashids 簡單卻實用,是避免業(yè)務(wù)ID外露辦法之一。
- EOF -
回復(fù)關(guān)鍵字“簡明python ”,立即獲取入門必備書籍《簡明python教程》電子版
回復(fù)關(guān)鍵字“爬蟲”,立即獲取爬蟲學(xué)習(xí)資料
python入門與進(jìn)階 每天與你一起成長 推薦閱讀
