<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python 反爬篇之 ID 混淆

          共 1857字,需瀏覽 4分鐘

           ·

          2021-03-18 18:30

          爬蟲與反爬是一對相生相克的死對頭,道高一丈魔高一尺。作為爬蟲的一方,如果知道了某個站點的數(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)階
          每天與你一起成長

          推薦閱讀

          瀏覽 57
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  豆花国产在线 | 亚洲色丁香 | 中文字幕久久人妻被中出一区精品 | 少妇太爽一区二区三区 | 亚洲日韩理论 |