常見web攻擊 及基礎 回顧(雜記)
阿新 • • 發佈:2020-06-28
1.http 和 https 之間的區別; 1. http超文字傳輸協議 資訊為明文傳輸 無狀態 即:超文字傳輸協議,HTTP連線最顯著的特點是客戶端傳送的每次請求都需要伺服器 回送響應,在請求結束後,會主動釋放連線。從建立連線到關閉連線的過程稱為“一次連線”。 2.https 是以安全為目標的http通道 即為http協議下 加入ssl層 需要到ca申請證書 收費 ssl+http協議 構建的可進行加密傳輸 身份認證的網路協議 比 http安全 3.socket 是套接字 是對tcp/ip的封裝 他對資料傳輸的兩者 提供了一個全雙工管道 和http一樣 傳輸資料要經歷三次握手四次揮手 和http協議的區別在於 socket是一個長連線 http是短連結 但是由於網路或者是其他原因有可能會斷開連結 所以往往會提供一個心跳包 每隔一段時間 向伺服器傳送一個 規定好的心跳包 如果某段時間 沒有心跳包 那代表已經斷開連結了 socket傳輸的特點: 傳輸資料為位元組級別的 傳輸資料可自定義 資料量小 傳輸資料時間段 效能高 適合客戶端和伺服器之間的資訊實時互動 可以加密資料 資料安全性高 基於Socket傳輸的特點:Socket 傳輸方式適合於對傳輸速度,安全性,實時互動,費用等要求高的應用中,如網路遊戲,手機應用, 銀行內部互動等 基於http協議傳輸的特點:基於http協議傳輸方式適合於對傳輸速度,安全性 要求不是很高,且需要快速開發的應用。 如公司OA系統,網際網路服務等。 tcp 和 udp tcp 和udp 是的區別 他們是傳輸層的兩個協議 一次http操作稱為一個事務 過程可分為四步 client 和 server建立連結 client傳送一個請求給server 請求方式格式為:統一資源識別符號(url) 協議版本號 mime資訊包括server 資訊 實體資訊和可能的內容 server接受到請求後 給與相應的響應 格式為一個狀態行 包括資訊的協議版本號 一個成功或者錯誤的程式碼 後邊是mime 資訊 包括server資訊 實體資訊 和可能的內容 client 收到server資訊通過瀏覽器顯示 然後斷開連結 https; client 使用 https的url訪問web伺服器 要求與web伺服器建立ssl連結 web伺服器收到客戶端請求後 會將網站的證書資訊(證書中包含公鑰) 傳送一份給客戶端 客戶端的瀏覽器與web伺服器開始協商ssl連結的安全等級 也就是資訊加密的等級 客戶端的瀏覽器根據雙方同意的安全等級 建立會話金鑰 然後利用網站公鑰將繪畫金鑰加密 並且傳送給網站 web伺服器利用自己的私鑰揭密出會話金鑰 web伺服器利用會話金鑰加密與客戶端之間的通訊 https;優缺點1.https協議可認證使用者和伺服器 缺保資料傳送到正確的客戶機和伺服器 2.https協議是由ssl+http協議構建的可進行加密傳輸身份認證的網路協議 要比http協議安全 可防止資料在傳輸過程中不被竊取 改變 確保資料完整性 缺點: 1https協議握手階段比較費時 會使頁面載入延長50% 增加10%到20%耗電 https連結快取不如http高效 會增加資料開銷和功耗 甚至已有的安全措施會受到影響 ssl證書需要錢 功能越強大費用越高 ssl證書一般需要繫結ip 不能再同一ip上繫結多個域名 ssl: 機密性:ssl協議使用金鑰加密通訊資料 可靠性:伺服器和客戶都會被驗證 客戶認證是是首選 完整性:ssl協議 會對傳送資料進行完整性 檢查 xss;跨站指令碼攻擊1.型別 1.持久型跨站 跨站程式碼儲存在伺服器 資料庫 2.非持久型跨站:反射型跨站指令碼漏洞 最普遍型別 使用者訪問伺服器 跨站連結 返回跨站程式碼 dom跨站 客戶端指令碼處理邏輯導致的 安全問題 html 注入 預防 xss 攻擊 1.輸入驗證 2.輸出編碼 防禦規則: 1.不要再允許位置插入不可行資料 2.在向html 元素內容插入不可信資料前對html解碼 3.在向html javascript data values 插入不可信資料前 進行javascript解碼 3.在向html css中插入不可行資料前進行css解碼 5.在向html url屬性插入不可信資料前 進行url解碼6.httpcookie only 預防XSS攻擊竊取使用者cookie最有效的防禦手段。Web應用程式在設定cookie時,將其屬性設為HttpOnly, 就可以避免該網頁的cookie被客戶端惡意JavaScript竊取,保護使用者cookie資訊。( dos和ddos攻擊 dos 即為拒絕服務 造成遠端伺服器拒絕服務的行為被稱為dos攻擊 舉例子: 1.tcp 三次握手 資料段互換client 傳送連結請求報文 server 接受後 回覆ack報文 並且 為這次連結分配資源 client接收到ack 報文後 也向server傳送ack報文 並分配資源 這樣tcp連結就建立了 前兩次握手 是為了保證服務端能接受到客戶端資訊 並做出正確的應答 後兩次握手是為了保證客戶端能夠接受伺服器資訊 並做出正確的回答 建立完tcp三次握手後 client就可以和web 伺服器進行通訊 在dos攻擊中 攻擊者通過偽造 ack資料包 希望server 重傳某些資料包 server 根據tcp重傳 機制 進行資料重傳 攻擊者 利用tcp協議缺陷 通過傳送大量半聯結請求 耗費cpu和記憶體 預防 ; 第一中縮短syn time out時間 及時將超時請求丟棄 釋放被佔用cpu 和記憶體 第二種限制同時開啟syn半聯結數目 關閉不必要的服務 第三種 給每一個ip分配一個cookie 如果短時間內收到某個ip的重複syn報文 就認定收到了攻擊 以後這個ip來的包 一概丟棄 csrf跨站請求偽造 利用cookie等偽造請求 傳送攻擊請求 預防 1.驗證碼 特別是賬戶交易等操作 強制使用者輸入驗證碼 2.referer http 一般會帶上鍊接之前的地址 3.token token 值 sql 注入 (1) 轉義字元處理不當。特別是輸入驗證和單引號處理不當。使用者簡單的在url頁面輸入一個單引號,就能快速識別Web站點是否易收到SQL注入攻擊。 (2) 後臺查詢語句處理不當。開發者完全信賴使用者的輸入,未對輸入的欄位進行判斷和過濾處理,直接呼叫使用者輸入欄位訪問資料庫。 (3) SQL語句被拼接。攻擊者構造精心設計拼接過的SQL語句,來達到惡意的目的。 如構造語句:select * from users where userid=123; DROP TABLE users;直接導致user表被刪除。 SQL注入常見的注入方式有: (1) 內聯SQL注入。向查詢注入一些SQL程式碼後,原來的查詢仍然會全部執行。內聯SQL注入包含字串內聯SQL注入和數字內聯SQL注入。 sql 索引原理 和sql建索引 索引是一種資料結構 索引中是 包含一個表中的列的值和他的實體地址的值 並且這些值儲存在一個數據結構中 常用的資料結構 二叉樹 雜湊表 索引中寸的資料 其中只存一個表中的一列 或者 多列 多數情況下 查詢都是全表檢索 當我們的select是查詢empno=4的時候,dbms會生成一個類似指標的東西,從empno=1的地方開始搜尋, 一直搜尋到表的結束,這裡是empno=11. 索引型別 主鍵索引 普通索引 全文索引 唯一索引 sql primary key 和 unique區別 primarykey: 不能為空 只能有一個 允許多列組合 = unique +not null 做記錄標記 unique:可以為空 允許多個 允許多列組合 保證唯一性 生成器 迭代器 可迭代物件 可迭代物件 包括迭代器 如果一個物件擁有__iter__方法 是可迭代物件 如果一個物件擁有了next方法 就是迭代器 生成器是一種特殊的迭代器 只能對其迭代一次 生成器自動實現了 迭代器協議 不需要手動實現 生成器在迭代過程中可以改變當前迭代值 而修改普通迭代器的當前迭代值 回發生異常 生成器一邊迴圈 一邊計算後邊的值 這種機制 成為生成器 具有yield 關鍵字的函式都是生成器 yiled可以理解為return 返回後面的值給呼叫者 不同的是 return返回後函式會釋放 而生成器則不會 在直接呼叫next方法或用for語句進行下一次迭代時 生成器會從yield下一句開始執行 直至遇到下一個yield python 賦值 copy deepcopy 賦值就是value=[1,2,3] python 首先建立一個列表物件給他貼上value的標籤 賦予新值後把value標籤換到新得列表 賦值前後共用一個 互相影響 淺複製 git config --global http.sslVerify false git ssl設定為false # import copy # # # 賦值 # 直接賦值 就是物件引用 # a = [1, 2, 3, [5, 6, [7, 8]]] # b = a # b[0] = 22 # b[3][1] = 22 # b[3][2][0] = 22 # a[3][2][1] = 99 # print a, id(a) # print b, id(b) # ''' # [22, 2, 3, [5, 22, [22, 99]]] # [22, 2, 3, [5, 22, [22, 99]]] # ''' # # 淺拷貝 # a = {'a': 1, 'b': 2, 'c':[1, 2, 3, [4, 5]]} # b = a.copy() # b['a'] = 'opp' # 拷貝了一份a物件父物件 互不影響 # a['a'] = '123456' # 拷貝了一份a物件父物件 互不影響 # # a['c'] = '123456' # 拷貝了一份a物件父物件 互不影響 # b['c'][0] = '789456' # 對於含有子物件的 依然是引用 # a['c'][0] = '123' # 對於含有子物件的 依然是引用 # a['c'][3][0] = '12223' # 對於含有子物件的 依然是引用 # print a # print b # ''' # {'a': '123456', 'c': ['123', 2, 3, ['12223', 5]], 'b': 2} # {'a': 'opp', 'c': ['123', 2, 3, ['12223', 5]], 'b': 2} # ''' # a = [1, 2, 3, 4, 5, [6, 7]] # b = copy.copy(a) # a[0] = 88 # 拷貝了一份a物件父物件 互不影響 # b[0] = 99 # a[-1][0] = 99 # 對於含有子物件的 依然是引用 # # b[-1][0] = 99 # print a # print b # # # 深拷貝 # import copy # a = [1, 2, 3, 4, 5, [6, 7]] # b = copy.deepcopy(a) # b[0] = 22 # 完全拷貝一份 互不影響 # b[-1][0] = 22 # a[-1][0] = 11 # a[-1] = 22 # print a,id(a) # print b,id(b) # ''' # [1, 2, 3, 4, 5, 22] # [22, 2, 3, 4, 5, [22, 7]] # ''' # # 基本語法 一般用來捕獲異常 保證程式不會因為錯誤奔潰 或者是模組分離 # try: # pass # 用來捕獲異常 # except: # exception,e 捕獲所有異常(sys.exit()相關之外) # pass # else: # 沒用異常執行 # pass # finally: # 都會執行 # pass # 1.索引 用到的欄位做索引 複合索引 sql 語句優化(比如避免子查詢 union all 等合理使用) # 2.記錄上次查詢id 或者主鍵 為條件 快速定位 先過濾 在分組 # 2.也可以設定最大offset超過另行處理 '''xrange的用法與range相同,即xrange([start,] stop[, step]) 根據start與stop指定的範圍以及step設定的步長,不同的是xrange並不是生成序列,而是作為一個生成器 所以相對來說,xrange比range效能優化很多,因為他不需要一下子開闢一塊很大的記憶體,特別是資料量比 較大的時候,pytohn3去掉xrange 用range實現了功能''' import os all_path = [] def print_directory_contents(sPath): """ sPath 是這個函式接受資料夾的名稱作為輸入引數, 返回該資料夾中檔案的路徑, 以及其包含資料夾中檔案的路徑 """ all_file_list = os.listdir(sPath) # 遍歷該資料夾下的所有目錄或者檔案 for file_ in all_file_list: file_path = os.path.join(sPath, file_) # 如果是資料夾,遞迴呼叫函式 if os.path.isdir(file_path): print_directory_contents(file_path) # 如果不是資料夾,儲存檔案路徑及檔名 elif os.path.isfile(file_path): all_path.append(file_path) return all_path '''is 比較的是兩個物件的id值是否相等,也就是比較倆物件是否為同一個例項物件,是否指向同一個記憶體地址。 == 比較的是兩個物件的內容是否相等,預設會呼叫物件的__eq__()方法。 '''