主頁 > 企業開發 > 爬蟲與反爬蟲技術簡介

爬蟲與反爬蟲技術簡介

2022-09-21 10:15:31 企業開發

vivo 互聯網安全團隊- Xie Peng

互聯網的大資料時代的來臨,網路爬蟲也成了互聯網中一個重要行業,它是一種自動獲取網頁資料資訊的爬蟲程式,是網站搜索引擎的重要組成部分,通過爬蟲,可以獲取自己想要的相關資料資訊,讓爬蟲協助自己的作業,進而降低成本,提高業務成功率和提高業務效率,

本文一方面從爬蟲與反反爬的角度來說明如何高效的對網路上的公開資料進行爬取,另一方面也會介紹反爬蟲的技術手段,為防止外部爬蟲大批量的采集資料的程序對服務器造成超負載方面提供些許建議,

爬蟲指的是按照一定規則自動抓取萬維網資訊的程式,本次主要會從爬蟲的技術原理與實作,反爬蟲與反反爬蟲兩個方面進行簡單的介紹,介紹的案例均只是用于安全研究和學習,并不會進行大量爬蟲或者應用于商業,

一、爬蟲的技術原理與實作

1.1 爬蟲的定義

爬蟲分為通用爬蟲和聚焦爬蟲兩大類,前者的目標是在保持一定內容質量的情況下爬取盡可能多的站點,比如百度這樣的搜索引擎就是這種型別的爬蟲,如圖1是通用搜索引擎的基礎架構:

  1. 首先在互聯網中選出一部分網頁,以這些網頁的鏈接地址作為種子URL;

  2. 將這些種子URL放入待抓取的URL佇列中,爬蟲從待抓取的URL佇列依次讀取;

  3. 將URL通過DNS決議,把鏈接地址轉換為網站服務器對應的IP地址;

  4. 網頁下載器通過網站服務器對網頁進行下載,下載的網頁為網頁檔案形式;

  5. 對網頁檔案中的URL進行抽取,并過濾掉已經抓取的URL;

  6. 對未進行抓取的URL繼續回圈抓取,直至待抓取URL佇列為空,

圖片圖1.通用搜索引擎的基礎架構

 

爬蟲通常從一個或多個 URL 開始,在爬取的程序中不斷將新的并且符合要求的 URL 放入待爬佇列,直到滿足程式的停止條件,

而我們日常見到的爬蟲基本為后者,目標是在爬取少量站點的情況下盡可能保持精準的內容質量,典型的比如圖2搶票軟體所示,就是利用爬蟲來登錄售票網路并爬取資訊,從而輔助商業,

圖片 圖2.搶票軟體

 

了解了爬蟲的定義后,那么應該如何撰寫爬蟲程式來爬取我們想要的資料呢,我們可以先了解下目前常用的爬蟲框架,因為它可以將一些常見爬蟲功能的實作代碼寫好,然后留下一些介面,在做不同的爬蟲專案時,我們只需要根據實際情況,手寫少量需要變動的代碼部分,并按照需要呼叫這些介面,即可以實作一個爬蟲專案,

 

1.2 爬蟲框架介紹

常用的搜索引擎爬蟲框架如圖3所示,首先Nutch是專門為搜索引擎設計的爬蟲,不適合用于精確爬蟲,Pyspider和Scrapy都是python語言撰寫的爬蟲框架,都支持分布式爬蟲,另外Pyspider由于其可視化的操作界面,相比Scrapy全命令列的操作對用戶更加友好,但是功能不如Scrapy強大,

 圖片

圖3.爬蟲框架對比

1.3 爬蟲的簡單示例

除了使用爬蟲框架來進行爬蟲,也可以從頭開始來撰寫爬蟲程式,步驟如圖4所示:

圖片

圖4.爬蟲的基本原理

 

接下來通過一個簡單的例子來實際演示上述的步驟,我們要爬取的是某應用市場的榜單,以這個作為例子,是因為這個網站沒有任何的反爬蟲手段,我們通過上面的步驟可以輕松爬取到內容,

圖片

 

圖片 圖5.網頁與其對應的源代碼

 

網頁與其對應的源代碼如圖5所示,對于網頁上的資料,假定我們想要爬取排行榜上每個app的名稱以及其分類,

我們首先分析網頁源代碼,發現可以直接在網頁源代碼中搜索到“抖音”等app的名稱,接著看到app名稱、app類別等都是在一個<li>標簽里,所以我們只需要請求網頁地址,拿到回傳的網頁源代碼,然后對網頁源代碼進行正則匹配,提取出想要的資料,保存下來即可,如圖6所示,

#獲取網頁原始碼
def get_one_page(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:
           return response.text
        return None
    except RequestException:
      return None
 
#正則匹配提取目標資訊并形成字典
def parse_one_page(html):
    pattern = re.compile('<li>.*?data-src="https://www.cnblogs.com/vivotech/p/(.*?)".*?<h5>.*?det.*?>(.*?)</a>.*?p.*?<a.*?>(.*?)</a>.*?</li>',re.S)
    items = re.findall(pattern, html)
    j = 1
    for item in items[:-1]:
        yield {'index': str(j),
            'name': item[1],
            'class':item[2]
        }
        j = j+1
 
#結果寫入txt
def write_to_file(content):
    with open(r'test.txt', 'a', encoding='utf-8') as f:
        f.write(json.dumps(content, ensure_ascii=False)+'\n')

 

圖片

圖6.爬蟲的代碼以及結果

 

二、反爬蟲相關技術

在了解具體的反爬蟲措施之前,我們先介紹下反爬蟲的定義和意義,限制爬蟲程式訪問服務器資源和獲取資料的行為稱為反爬蟲,爬蟲程式的訪問速率和目的與正常用戶的訪問速率和目的是不同的,大部分爬蟲會無節制地對目標應用進行爬取,這給目標應用的服務器帶來巨大的壓力,爬蟲程式發出的網路請求被運營者稱為“垃圾流量”,開發者為了保證服務器的正常運轉或降低服務器的壓力與運營成本,不得不使出各種各樣的技術手段來限制爬蟲對服務器資源的訪問,

所以為什么要做反爬蟲,答案是顯然的,爬蟲流量會提升服務器的負載,過大的爬蟲流量會影響到服務的正常運轉,從而造成收入損失,另一方面,一些核心資料的外泄,會使資料擁有者失去競爭力,

常見的反爬蟲手段,如圖7所示,主要包含文本混淆、頁面動態渲染、驗證碼校驗、請求簽名校驗、大資料風控、js混淆和蜜罐等,其中文本混淆包含css偏移、圖片偽裝文本、自定義字體等,而風控策略的制定則往往是從引數校驗、行為頻率和模式例外等方面出發的,

 

圖片

圖7.常見的反爬蟲手段

2.1 CSS偏移反爬蟲

在搭建網頁的時候,需要用CSS來控制各類字符的位置,也正是如此,可以利用CSS來將瀏覽器中顯示的文字,在HTML中以亂序的方式存盤,從而來限制爬蟲,CSS偏移反爬蟲,就是一種利用CSS樣式將亂序的文字排版成人類正常閱讀順序的反爬蟲手段,這個概念不是很好理解,我們可以通過對比兩段文字來加深對這個概念的理解:

  • HTML 文本中的文字:我的學號是 1308205,我在北京大學讀書,

  • 瀏覽器顯示的文字:我的學號是 1380205,我在北京大學讀書,

以上兩段文字中瀏覽器顯示的應該是正確的資訊,如果我們按之前提到的爬蟲步驟,分析網頁后正則提取資訊,會發現學號是錯的,

接著看圖8所示的例子,如果我們想爬取該網頁上的機票資訊,首先需要分析網頁,紅框所示的價格467對應的是中國民航的從石家莊到上海的機票,但是分析網頁源代碼發現代碼中有 3 對 b 標簽,第 1 對 b 標簽中包含 3 對 i 標簽,i 標簽中的數字都是 7,也就是說第 1 對 b 標簽的顯示結果應該是 777,而第 2 對 b 標簽中的數字是 6,第 3 對 b 標簽中的數字是 4,這樣的話我們會無法直接通過正則匹配得到正確的機票價格,

圖片

圖8.CSS 偏移反爬蟲例子

2.2 圖片偽裝反爬蟲

圖片偽裝反爬蟲,它的本質就是用圖片替換了原來的內容,從而讓爬蟲程式無法正常獲取,如圖9所示,這種反爬蟲的原理十分簡單,就是將本應是普通文本內容的部分在前端頁面中用圖片來進行替換,遇到這種案例可以直接用ocr識別圖片中的文字就可以繞過,而且因為是用圖片替換文本顯示,所以圖片本身會相對比較清晰,沒有很多噪聲干擾,ocr識別的結果會很準確,

圖片

圖9. 圖片偽裝反爬蟲例子

2.3 自定義字體反爬蟲

在 CSS3 時代,開發者可以使用@font-face為網頁指定字體,開發者可將心儀的字體檔案放在 Web 服務器上,并在 CSS 樣式中使用它,用戶使用瀏覽器訪問 Web 應用時,對應的字體會被瀏覽器下載到用戶的計算機上,但是我們在使用爬蟲程式時,由于沒有相應的字體映射關系,直接爬取就會無法得到有效資料,

如圖10所示,該網頁中每個店鋪的評價數、人均、口味、環境等資訊均是亂碼字符,爬蟲無法直接讀取到內容,

 

圖片

圖10. 自定義字體反爬蟲例子

2.4 頁面動態渲染反爬蟲

網頁按渲染方式的不同,大體可以分為客戶端和服務端渲染,

  • 服務端渲染,頁面的結果是由服務器渲染后回傳的,有效資訊包含在請求的 HTML 頁面里面,通過查看網頁源代碼可以直接查看到資料等資訊;

  • 客戶端渲染,頁面的主要內容由 JavaScript 渲染而成,真實的資料是通過 Ajax 介面等形式獲取的,通過查看網頁源代碼,無有效資料資訊,

客戶端渲染和服務器端渲染的最重要的區別就是究竟是誰來完成html檔案的完整拼接,如果是在服務器端完成的,然后回傳給客戶端,就是服務器端渲染,而如果是前端做了更多的作業完成了html的拼接,則就是客戶端渲染,

圖片 圖片

圖11.客戶端渲染例子

2.5 驗證碼反爬蟲

幾乎所有的應用程式在涉及到用戶資訊安全的操作時,都會彈出驗證碼讓用戶進行識別,以確保該操作為人類行為,而不是大規模運行的機器,那為什么會出現驗證碼呢?在大多數情形下是因為網站的訪問頻率過高或者行為例外,或者是為了直接限制某些自動化行為,歸類如下:

  1. 很多情況下,比如登錄和注冊,這些驗證碼幾乎是必現的,它的目的就是為了限制惡意注冊、惡意爆破等行為,這也算反爬的一種手段,

  2. 一些網站遇到訪問頻率過高的行為的時候,可能會直接彈出一個登錄視窗,要求我們登錄才能繼續訪問,此時的驗證碼就直接和登錄表單系結在一起了,這就算檢測到例外之后利用強制登錄的方式進行反爬,

  3. 一些較為常規的網站如果遇到訪問頻率稍高的情形的時候,會主動彈出一個驗證碼讓用戶識別并提交,驗證當前訪問網站的是不是真實的人,用來限制一些機器的行為,實作反爬蟲,

常見的驗證碼形式包括圖形驗證碼、行為驗證碼、短信、掃碼驗證碼等,如圖12所示,對于能否成功通過驗證碼,除了能夠準確的根據驗證碼的要求完成相應的點擊、選擇、輸入等,通過驗證碼風控也至關重要;比如對于滑塊驗證碼,驗證碼風控可能會針對滑動軌跡進行檢測,如果檢測出軌跡非人為,就會判定為高風險,導致無法成功通過,

圖片

圖12.驗證碼反爬蟲手段

2.6 請求簽名校驗反爬蟲

簽名驗證是防止服務器被惡意鏈接和篡改資料的有效方式之一,也是目前后端API最常用的防護方式之一,簽名是一個根據資料源進行計算或者加密的程序,用戶經過簽名后會一個具有一致性和唯一性的字串,它就是你訪問服務器的身份象征,由它的一致性和唯一性這兩種特性,從而可以有效的避免服務器端,將偽造的資料或被篡改的資料當初正常資料處理,

前面在2.4節提到的網站是通過客戶端渲染網頁,資料則是通過ajax請求拿到的,這種在一定程度上提升了爬蟲的難度,接下來分析ajax請求,如圖13所示,會發現其ajax請求是帶有請求簽名的,analysis就是加密后的引數,而如果想要破解請求介面,就需要破解該引數的加密方法,這無疑進一步提升了難度,

圖片 圖片

圖13. 請求榜單資料的ajax請求

2.7 蜜罐反爬蟲

蜜罐反爬蟲,是一種在網頁中隱藏用于檢測爬蟲程式的鏈接的手段,被隱藏的鏈接不會顯示在頁面中,正常用戶無法訪問,但爬蟲程式有可能將該鏈接放入待爬佇列,并向該鏈接發起請求,開發者可以利用這個特點區分正常用戶和爬蟲程式,如圖14所示,查看網頁原始碼,頁面只有6個商品,col-md-3的 <div>標簽卻有 8 對,該 CSS 樣式的作用是隱藏標簽,所以我們在頁面只看到 6 件商品,爬蟲程式會提取到 8 件商品的 URL,

圖片

 

圖片

圖14.蜜罐反爬蟲例子

 

三、反反爬相關技術

針對上一節提到的反爬蟲相關技術,有以下幾類反反爬技術手段:css偏移反反爬、自定義字體反反爬、頁面動態渲染反反爬、驗證碼破解等,下面對這幾類方法進行詳細的介紹,

3.1 CSS偏移反反爬

3.1.1 CSS偏移邏輯介紹

那么對于以上2.1css偏移反爬蟲的例子,怎么才能得到正確的機票價格呢,仔細觀察css樣式,可以發現每個帶有數字的標簽都設定了樣式,第 1 對 b 標簽內的i 標簽對的樣式是相同的,都是width: 16px;另外,還注意到最外層的 span 標簽對的樣式為width:48px,

如果按照 css樣式這條線索來分析的話,第 1 對 b 標簽中的 3 對 i 標簽剛好占滿 span 標簽對的位置,其位置如圖15所示,此時網頁中顯示的價格應該是 777,但是由于第 2 和第 3 對 b 標簽中有值,所以我們還需要計算它們的位置,由于第 2 對 b 標簽的位置樣式是 left:-32px,所以第 2 對 b 標簽中的值 6 就會覆寫原來第 1 對 b 標簽中的中的第 2 個數字 7,此時頁面應該顯示的數字是 767,

按此規律推算,第 3 對 b 標簽的位置樣式是 left:-48px,這個標簽的值會覆寫第 1 對 b 標簽中的第 1 個數字 7,最后顯示的票價就是 467,

圖片 圖15.偏移邏輯

3.1.2 CSS偏移反反爬代碼實作

因此接下來我們按以上css樣式的規律來撰寫代碼對該網頁爬取獲取正確的機票價格,代碼和結果如圖16所示,

if __name__ == '__main__':
    url = 'http://www.porters.vip/confusion/flight.html'
    resp = requests.get(url)
    sel = Selector(resp.text)
    em = sel.css('em.rel').extract()
    for element in range(0,1):
        element = Selector(em[element])
        element_b = element.css('b').extract()
        b1 = Selector(element_b.pop(0))
        base_price = b1.css('i::text').extract()
        print('css偏移前的價格:',base_price)
 
        alternate_price = []
        for eb in element_b:
            eb = Selector(eb)
            style = eb.css('b::attr("style")').get()
            position = ''.join(re.findall('left:(.*)px', style))
            value = eb.css('b::text').get()
            alternate_price.append({'position': position, 'value': value})
        print('css偏移值:',alternate_price)
 
        for al in alternate_price:
            position = int(al.get('position'))
            value = al.get('value')
            plus = True if position >= 0 else False
            index = int(position / 16)
            base_price[index] = value
        print('css偏移后的價格:',base_price)
圖片 圖16. CSS 偏移反反爬代碼與結果

 

3.2 自定義字體反反爬

針對于以上2.3自定義字體反爬蟲的情況,解決思路就是提取出網頁中自定義字體檔案(一般為WOFF檔案),并將映射關系包含到爬蟲代碼中,就可以獲取到有效資料,解決的步驟如下:

發現問題:查看網頁源代碼,發現關鍵字符被編碼替代,如&#xefbe

圖片

 

分析:檢查網頁,發現應用了css自定義字符集隱藏

圖片

 

圖片

 

查找:查找css檔案url,獲取字符集對應的url,如PingFangSC-Regular-num

查找:查找和下載字符集url

圖片

 

比對:比對字符集中的字符與網頁源代碼中的編碼,發現編碼的后四位與字符對應,也即網頁源代碼對應的口味是8.9分

圖片

3.3 頁面動態渲染反反爬

客戶端渲染的反爬蟲,頁面代碼在瀏覽器源代碼中看不到,需要執行渲染并進一步獲取渲染后結果,針對這種反爬蟲,有以下幾種方式破解:

  1. 在瀏覽器中,通過開發者工具直接查看ajax具體的請求方式、引數等內容;

  2. 通過selenium模擬真人操作瀏覽器,獲取渲染后的結果,之后的操作步驟和服務端渲染的流程一樣;

  3. 如果渲染的資料隱藏在html結果的JS變數中,可以直接正則提取;

  4. 如果有通過JS生成的加密引數,可以找出加密部分的代碼,然后使用pyexecJS來模擬執行JS,回傳執行結果,

3.4 驗證碼破解

下面舉例一個識別滑塊驗證碼的例子,如圖17所示,是使用目標檢測模型來識別某滑塊驗證碼缺口位置的結果示例,這種破解滑塊驗證碼的方式對應的是模擬真人的方式,不采用介面破解的原因一方面是破解加密演算法有難度,另一方面也是加密演算法可能每天都會變,這樣破解的時間成本也比較大,

圖片

圖17. 通過目標檢測模型識別滑塊驗證碼的缺口

 

3.4.1 爬取滑塊驗證碼圖片

因為使用的目標檢測模型yolov5是有監督學習,所以需要爬取滑塊驗證碼的圖片并進行打標,進而輸入到模型中訓練,通過模擬真人的方式在某場景爬取部分驗證碼,

圖片 圖18. 爬取的滑塊驗證碼圖片

3.4.2 人工打標

本次使用的是labelImg來對圖片人工打標簽的,人工打標耗時較長,100張圖片一般耗時40分鐘左右,自動打標代碼寫起來比較復雜,主要是需要分別提取出驗證碼的所有背景圖片和缺口圖片,然后隨機生成缺口位置,作為標簽,同時將缺口放到對應的缺口位置,生成圖片,作為輸入,

圖片 圖19. 對驗證碼圖片打標簽以及打標簽后生成的xml檔案

3.4.3 目標檢測模型yolov5

直接從github下clone yolov5的官方代碼,它是基于pytorch實作,

接下來的使用步驟如下:

  1. 資料格式轉換:將人工標注的圖片和標簽檔案轉換為yolov5接收的資料格式,得到1100張圖片和1100個yolov5格式的標簽檔案;

  2. 新建資料集:新建custom.yaml檔案來創建自己的資料集,包括訓練集和驗證集的目錄、類別數目、類別名;

  3. 訓練調優:修改模型組態檔和訓練檔案后,進行訓練,并根據訓練結果調優超引數,

 

轉換xml檔案為yolov5格式的部分腳本:

for member in root.findall('object'):
           class_id = class_text.index(member[0].text)
 
           xmin = int(member[4][0].text)
           ymin = int(member[4][1].text)
           xmax = int(member[4][2].text)
           ymax = int(member[4][3].text)
 
           # round(x, 6) 這里我設定了6位有效數字,可根據實際情況更改
           center_x = round(((xmin + xmax) / 2.0) * scale / float(image.shape[1]), 6)
           center_y = round(((ymin + ymax) / 2.0) * scale / float(image.shape[0]), 6)
           box_w = round(float(xmax - xmin) * scale / float(image.shape[1]), 6)
           box_h = round(float(ymax - ymin) * scale / float(image.shape[0]), 6)
 
           file_txt.write(str(class_id))
           file_txt.write(' ')
           file_txt.write(str(center_x))
           file_txt.write(' ')
           file_txt.write(str(center_y))
           file_txt.write(' ')
           file_txt.write(str(box_w))
           file_txt.write(' ')
           file_txt.write(str(box_h))
           file_txt.write('\n')
 
       file_txt.close()

 

訓練引數設定:

parser = argparse.ArgumentParser()
parser.add_argument('--weights', type=str, default='yolov5s.pt', help='initial weights path')
parser.add_argument('--cfg', type=str, default='./models/yolov5s.yaml', help='model.yaml path')
parser.add_argument('--data', type=str, default='data/custom.yaml', help='data.yaml path')
parser.add_argument('--hyp', type=str, default='data/hyp.scratch.yaml', help='hyperparameters path')
# parser.add_argument('--epochs', type=int, default=300)
parser.add_argument('--epochs', type=int, default=50)
# parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs')
parser.add_argument('--batch-size', type=int, default=8, help='total batch size for all GPUs')
parser.add_argument('--img-size', nargs='+', type=int, default=[640, 640], help='[train, test] image sizes')
parser.add_argument('--rect', action='store_true', help='rectangular training')
parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')
parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')
parser.add_argument('--notest', action='store_true', help='only test final epoch')
parser.add_argument('--noautoanchor', action='store_true', help='disable autoanchor check')
parser.add_argument('--evolve', action='store_true', help='evolve hyperparameters')
parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')
parser.add_argument('--cache-images', action='store_true', help='cache images for faster training')
parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')
parser.add_argument('--device', default='cpu', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')
parser.add_argument('--single-cls', action='store_true', help='train multi-class data as single-class')
parser.add_argument('--adam', action='store_true', help='use torch.optim.Adam() optimizer')
parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')
parser.add_argument('--local_rank', type=int, default=-1, help='DDP parameter, do not modify')
parser.add_argument('--workers', type=int, default=8, help='maximum number of dataloader workers')
parser.add_argument('--project', default='runs/train', help='save to project/name')
parser.add_argument('--entity', default=None, help='W&B entity')
parser.add_argument('--name', default='exp', help='save to project/name')
parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
parser.add_argument('--quad', action='store_true', help='quad dataloader')
parser.add_argument('--linear-lr', action='store_true', help='linear LR')
parser.add_argument('--label-smoothing', type=float, default=0.0, help='Label smoothing epsilon')
parser.add_argument('--upload_dataset', action='store_true', help='Upload dataset as W&B artifact table')
parser.add_argument('--bbox_interval', type=int, default=-1, help='Set bounding-box image logging interval for W&B')
parser.add_argument('--save_period', type=int, default=-1, help='Log model after every "save_period" epoch')
parser.add_argument('--artifact_alias', type=str, default="latest", help='version of dataset artifact to be used')
opt = parser.parse_args()

 

3.4.4 目標檢測模型的訓練結果

模型基本在50次迭代的時候在precision和recall以及mAP上已經達到了瓶頸,預測結果也有如下問題:大部分能夠是能夠準確框出缺口,但也出現少量框錯、框出兩個缺口、框不出缺口的情況,

 

圖片 圖片

圖20. 上:模型的訓練結果走勢圖;下:模型對部分驗證集的預測結果

四、總結

本次簡單對爬蟲以及反爬蟲的技術手段進行了介紹,介紹的技術和案例均只是用于安全研究和學習,并不會進行大量爬蟲或者應用于商業,

對于爬蟲,本著爬取網路上公開資料用于資料分析等的目的,我們應該遵守網站robots協議,本著不影響網站正常運行以及遵守法律的情況下進行資料爬取;對于反爬蟲,因為只要人類能夠正常訪問的網頁,爬蟲在具備同等資源的情況下就一定可以抓取到,所以反爬蟲的目的還是在于能夠防止爬蟲在大批量的采集網站資訊的程序對服務器造成超負載,從而杜絕爬蟲行為妨礙到用戶的體驗,來提高用戶使用網站服務的滿意度,

分享 vivo 互聯網技術干貨與沙龍活動,推薦最新行業動態與熱門會議,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/509190.html

標籤:訊息安全

上一篇:CSS Flexbox 布局

下一篇:全域安全:一種運行時安全管理模型

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more