主頁 >  其他 > 使用Python決議并“篡改”MySQL的Binlog

使用Python決議并“篡改”MySQL的Binlog

2020-09-30 12:49:01 其他

文章目錄

  • 前言
  • Binlog的結構
  • 恢復誤洗掉的記錄
  • 找出 Binlog 中的大事務
  • 切割 Binlog 中的大事務
  • 后記

前言

MySQL 的 Binlog 記錄著 MySQL 資料庫的所有變更資訊,了解 Binlog 的結構可以幫助我們決議Binlog,甚至對 Binlog 進行一些修改,或者說是“篡改”,例如實作類似于 Oracle 的 flashback 的功能,恢復誤洗掉的記錄,把 update 的記錄再還原回去等,本文將帶您探討一下這些神奇功能的實作,您會發現比您想象地要簡單得多,本文指的 Binlog 是 ROW 模式的 Binlog,這也是 MySQL 8 里的默認模式,STATEMENT 模式因為使用中有很多限制,現在用地越來越少了,

Binlog的結構

Binlog由事件(event)組成,請注意是事件(event)不是事務(transaction),一個事務可以包含多個事件,事件描述對資料庫的修改內容,
從 MySQL 5 版本開始,Binlog 采用的是 v4 版本,事件的型別根據 MySQL 的內部檔案,有下面36類:

enum Log_event_type { 
  UNKNOWN_EVENT= 0, 
  START_EVENT_V3= 1, 
  QUERY_EVENT= 2, 
  STOP_EVENT= 3, 
  ROTATE_EVENT= 4, 
  INTVAR_EVENT= 5, 
  LOAD_EVENT= 6, 
  SLAVE_EVENT= 7, 
  CREATE_FILE_EVENT= 8, 
  APPEND_BLOCK_EVENT= 9, 
  EXEC_LOAD_EVENT= 10, 
  DELETE_FILE_EVENT= 11, 
  NEW_LOAD_EVENT= 12, 
  RAND_EVENT= 13, 
  USER_VAR_EVENT= 14, 
  FORMAT_DESCRIPTION_EVENT= 15, 
  XID_EVENT= 16, 
  BEGIN_LOAD_QUERY_EVENT= 17, 
  EXECUTE_LOAD_QUERY_EVENT= 18, 
  TABLE_MAP_EVENT = 19, 
  PRE_GA_WRITE_ROWS_EVENT = 20, 
  PRE_GA_UPDATE_ROWS_EVENT = 21, 
  PRE_GA_DELETE_ROWS_EVENT = 22, 
  WRITE_ROWS_EVENT = 23, 
  UPDATE_ROWS_EVENT = 24, 
  DELETE_ROWS_EVENT = 25, 
  INCIDENT_EVENT= 26, 
  HEARTBEAT_LOG_EVENT= 27, 
  IGNORABLE_LOG_EVENT= 28,
  ROWS_QUERY_LOG_EVENT= 29,
  WRITE_ROWS_EVENT = 30,
  UPDATE_ROWS_EVENT = 31,
  DELETE_ROWS_EVENT = 32,
  GTID_LOG_EVENT= 33,
  ANONYMOUS_GTID_LOG_EVENT= 34,
  PREVIOUS_GTIDS_LOG_EVENT= 35, 
  ENUM_END_EVENT 
  /* end marker */ 
};

每個 Binlog 檔案總是以 Format Description Event 作為開始,以 Rotate Event 結束作為結束,我們來看一個 Binlog 的例子:

mysql>  show binlog events in 'scut.000023';
+-------------+-----+----------------+-----------+-------------+--------------------------------------------------------+
| Log_name    | Pos | Event_type     | Server_id | End_log_pos | Info                                                   |
+-------------+-----+----------------+-----------+-------------+--------------------------------------------------------+
| scut.000023 |   4 | Format_desc    |      1024 |         123 | Server ver: 5.7.31-0ubuntu0.16.04.1-log, Binlog ver: 4 |
| scut.000023 | 123 | Previous_gtids |      1024 |         154 |                                                        |
| scut.000023 | 154 | Anonymous_Gtid |      1024 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                   |
| scut.000023 | 219 | Query          |      1024 |         291 | BEGIN                                                  |
| scut.000023 | 291 | Rows_query     |      1024 |         330 | # delete from tt1                                      |
| scut.000023 | 330 | Table_map      |      1024 |         378 | table_id: 111 (test.tt1)                               |
| scut.000023 | 378 | Delete_rows    |      1024 |         434 | table_id: 111 flags: STMT_END_F                        |
| scut.000023 | 434 | Xid            |      1024 |         465 | COMMIT /* xid=216 */                                   |
| scut.000023 | 465 | Rotate         |      1024 |         507 | scut.000024;pos=4                                      |
+-------------+-----+----------------+-----------+-------------+--------------------------------------------------------+
9 rows in set (0.00 sec)

關于“show binlog events”語法顯示的每一列的作用說明如下:

列名說明
Log_name當前事件所在的 binlog 檔案名稱
Pos當前事件的開始位置,每個事件都占用固定的位元組大小,結束位置(End_log_position)減去Pos,就是這個事件占用的位元組數,
Event_type表示事件的型別
Server_id表示產生這個事件的 MySQL server_id
End_log_position下一個事件的開始位置
Info當前事件的描述資訊

每個事件型別的說明可以參考 MySQL 的內部檔案,我們這里說明一下這里遇到的幾個事件型別:

事件名說明
Format_desc是 binlog 檔案的第一個事件,在 Info 列,我們可以看到,其標明了 MySQL Server 的版本是5.7.31, Binlog 版本是4,
Previous_gtids這是表示之前的 Binlog 檔案中,已經執行過的 GTID,需要我們開啟 GTID 選項,這個事件才會有值,
Anonymous_Gtid沒有開啟 GTID 選項時,每個事務開始的事件;
Query是向 Binlog 發生一個陳述句,這里是事務的開始陳述句 begin,
Rows_query記錄SQL,這個事件只有當引數 binlog_rows_query_log_events 為 TRUE 的情況下才會產生,這個引數的默認為值為 FALSE,
Table_map記錄將要被修改的表的結構
Delete_rows從表中洗掉一個記錄
Xid事務 commit 的時候寫入事務 ID
RotateRotate Event是每個Binlog檔案的結束事件,在Info列中,我們看到了其指定了下一個 Binlog檔案的名稱是 mysql-bin.000018,

根據官方檔案,事件(event)資料結構如下:

+=====================================+
| event  | timestamp         0 : 4    |
| header +----------------------------+
|        | type_code         4 : 1    |
|        +----------------------------+
|        | server_id         5 : 4    |
|        +----------------------------+
|        | event_length      9 : 4    |
|        +----------------------------+
|        | next_position    13 : 4    |
|        +----------------------------+
|        | flags            17 : 2    |
|        +----------------------------+
|        | extra_headers    19 : x-19 |
+=====================================+
| event  | fixed part        x : y    |
| data   +----------------------------+
|        | variable part              |
+=====================================+

恢復誤洗掉的記錄

現在我們已經了解了 Binlog 的結構,我們可以試著修改 Binlog 里的資料,例如前面舉例的 Binlog 洗掉了一條記錄,我們可以試著把這條記錄恢復,Binlog 里面有個洗掉行(DELETE_ROWS_EVENT)的事件,就是這個事件洗掉了記錄,這個事件和寫行(WRITE_ROWS_EVENT)的事件的資料結構是完全一樣的, 只是洗掉行事件的型別是32,寫行事件的型別是30,我們把對應的 Binlog 位置的32改成30即可把已經洗掉的記錄再插入回去,從前面的“show binlog events”里面可看到這個 DELETE_ROWS_EVENT 是從位置378開始的,這里的位置就是 Binlog 檔案的實際位置(以位元組為單位),從事件(event)的結構里面可以看到 type_code 是在 event 的第5個位元組,我們寫個 Python 小程式把把第383(378+5=383)位元組改成30即可,當然您也可以用二進制編輯工具來改,下面是這個 Python 小程式的例子:

#! /usr/bin/python3
import sys

if len(sys.argv) != 3:
        print ('Please run chtype.py inputType changedType.')
        sys.exit()

inputType=open(sys.argv[1],"rb")
changedType=open(sys.argv[2],"wb")

changedType.write(inputType.read(382))
changedType.write(chr(30).encode())
inputType.seek(1,1)
while True:
  line = inputType.readline()  
  if not line:
        break
  changedType.write(line)
  
inputType.close()
changedType.close()

我們把原來的 Binlog 和修改后的 Binlog 進行一個對比:
Binlog 修改對比

發現這兩個 Binlog只有一個位元組有區別,也就是 type_code 從32變成了30,注意 Binlog 里面顯示的是16進制的數字,
我們分別應用一下原來的 Binlog 和修改后的 Binlog,看看效果如何?

$ mysql  -e "select * from test.tt1";
$ mysqlbinlog ./scut.000023_ch |mysql
$ mysql  -e "select * from test.tt1";
+---------------------+
| col1                |
+---------------------+
| aaaaaaaaaaaaaaaaaaa |
+---------------------+
$ mysqlbinlog ./scut.000023 |mysql
$ mysql  -e "select * from test.tt1";
$ mysqlbinlog ./scut.000023_ch |mysql
$ mysql  -e "select * from test.tt1";
+---------------------+
| col1                |
+---------------------+
| aaaaaaaaaaaaaaaaaaa |
+---------------------+

我們發現這兩個 Binlog 可以分別把對應的記錄洗掉和插入到 MySQL 資料庫中,這樣我們就成功地實作了類似于 Oracle 的 flashback 功能,

找出 Binlog 中的大事務

由于 ROW 模式的 Binlog 是每一個變更都記錄一條日志,因此一個簡單的 SQL,在 Binlog 里可能會產生一個巨無霸的事務,例如一個不帶 where 的 update 或 delete 陳述句,修改了全表里面的所有記錄,每條記錄都在 Binlog 里面記錄一次,結果是一個巨大的事務記錄,這樣的大事務經常是產生麻煩的根源,我的一個客戶有一次向我抱怨,一個 Binlog 前滾,滾了兩天也沒有動靜,我把那個 Binlog 決議了一下,發現里面有個事務產生了 1.4G 的記錄,修改了66萬條記錄!下面是一個簡單的找出 Binlog 中大事務的 Python 小程式,我們知道用 mysqlbinlog 決議的 Binlog,每個事務都是以BEGIN 開頭,以 COMMIT 結束,我們找出 BENGIN 前面的“# at”的位置,檢查 COMMIT 后面的“# at”位置,這兩個位置相減即可計算出這個事務的大小,下面是這個 Python程式的例子,

$ cat ./checkBigTran.py 
#! /usr/bin/python3
import sys

position=0
beginPosition=0
endPosition=0
maxSize=0
isEnd=0
for line in sys.stdin:
      if line[: 4]=='# at':
          position=int(line[5:])
          if isEnd:
             endPosition=position
             isEnd=0
      if line[: 5]=='BEGIN':
          beginPosition=position
      if line[: 6]=='COMMIT':
          isEnd=1
      if endPosition-beginPosition>maxSize:
          maxBeginPosition= beginPosition
          maxEndPosition=endPosition
          maxSize=endPosition-beginPosition

print("The largest transaction size is %d, the begion position is %d, the end position is %d." % (maxSize,maxBeginPosition,maxEndPosition))

用這個小程式檢查一下可能包含大事務的 Binlog:

$ mysqlbinlog binlog1|./checkBigTran.py 
The largest transaction size is 1468183501, the begion position is 5737766, the end position is 1473921267.

發現里面果然包含了一個1.4G的大事務,

切割 Binlog 中的大事務

對于大的事務, MySQL 會把它分解成多個事件(注意一個是事務TRANSACTION,另一個是事件EVENT),事件的大小由引數 binlog-row-event-max-size 決定,這個引數默認是8K,因此我們可以把若干個事件切割成一個單獨的略小的事務,例如下面這個 Binlog:

mysql> show binlog events in 'scut.000025';
+-------------+-----+----------------+-----------+-------------+--------------------------------------------------------+
| Log_name    | Pos | Event_type     | Server_id | End_log_pos | Info                                                   |
+-------------+-----+----------------+-----------+-------------+--------------------------------------------------------+
| scut.000025 |   4 | Format_desc    |      1024 |         123 | Server ver: 5.7.31-0ubuntu0.16.04.1-log, Binlog ver: 4 |
| scut.000025 | 123 | Previous_gtids |      1024 |         154 |                                                        |
| scut.000025 | 154 | Anonymous_Gtid |      1024 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                   |
| scut.000025 | 219 | Query          |      1024 |         291 | BEGIN                                                  |
| scut.000025 | 291 | Rows_query     |      1024 |         343 | # insert into tt1 values ('1')                         |
| scut.000025 | 343 | Table_map      |      1024 |         391 | table_id: 111 (test.tt1)                               |
| scut.000025 | 391 | Write_rows     |      1024 |         429 | table_id: 111 flags: STMT_END_F                        |
| scut.000025 | 429 | Rows_query     |      1024 |         481 | # insert into tt1 values ('2')                         |
| scut.000025 | 481 | Table_map      |      1024 |         529 | table_id: 111 (test.tt1)                               |
| scut.000025 | 529 | Write_rows     |      1024 |         567 | table_id: 111 flags: STMT_END_F                        |
| scut.000025 | 567 | Xid            |      1024 |         598 | COMMIT /* xid=397 */                                   |
| scut.000025 | 598 | Rotate         |      1024 |         640 | scut.000026;pos=4                                      |
+-------------+-----+----------------+-----------+-------------+--------------------------------------------------------+
12 rows in set (0.01 sec)

這個 Binlog 的兩個 insert 是在一個事務里面完成的,我們可以兩個事務之間插入 xid、Anonymous_Gtid, Query 等三個事件把一個事務切割成兩個事務, Rows_query 這個事件不用插入,這個事件是注釋掉了的,記錄的是執行的 SQL,這個事件只有在引數 binlog_rows_query_log_events 為 on 時才會有,默認是 off ,相應的 Python 程式如下:

# cat splitTran.py 
#! /usr/bin/python3
import sys

if len(sys.argv) != 3:
    print ('Please run splitTrans.py inputBinlog changedBinlog.')
    sys.exit()

inputBinlog=open(sys.argv[1],"rb")
changedBinlog=open(sys.argv[2],"wb")

changedBinlog.write(inputBinlog.read(429))   # read from the head of  input binlog file to the first insert, then write into the changed binlog file.
firstInsert=inputBinlog.tell()
inputBinlog.seek(567,0)  # locate to the xid event
changedBinlog.write(inputBinlog.read(31))  # read from 567 to 598, write xid event, into the changed binlog file.
inputBinlog.seek(154,0)  # locate to the Anonymous_Gtid, Query events.
changedBinlog.write(inputBinlog.read(137))  # read from 154 to 291, write Anonymous_Gtid, Query events into changed binlog file.
inputBinlog.seek(firstInsert)
while True:
      line = inputBinlog.readline()  
      if not line:
           break
      changedBinlog.write(line)
  
inputBinlog.close()
changedBinlog.close()

我們執行這個 Python 程式,生成一個新的 Binlog ,然后把新的 Binlog 應用到 MySQL,

$  ./splitTran.py scut.000025 scut.000025_ch
$ mysqlbinlog scut.000025_ch |mysql
$ 

我們看看執行地效果:


mysql> show binlog events in 'scut.000026';
+-------------+-----+----------------+-----------+-------------+------------------------------------------------------------------------------------------------------------------------------------+
| Log_name    | Pos | Event_type     | Server_id | End_log_pos | Info                                                                                                                               |
+-------------+-----+----------------+-----------+-------------+------------------------------------------------------------------------------------------------------------------------------------+
| scut.000026 |   4 | Format_desc    |      1024 |         123 | Server ver: 5.7.31-0ubuntu0.16.04.1-log, Binlog ver: 4                                                                             |
| scut.000026 | 123 | Previous_gtids |      1024 |         154 |                                                                                                                                    |
| scut.000026 | 154 | Anonymous_Gtid |      1024 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                                                               |
| scut.000026 | 219 | Query          |      1024 |         287 | BEGIN                                                                                                                              |
| scut.000026 | 287 | Rows_query     |      1024 |         439 | # BINLOG '
EbA7XxMABAAAMAAAAIcBAAAAAG8AAAAAAAEABHRlc3QAA3R0MQAB/gL+QAEYYumN
EbA7Xx4ABAAAJgAAAK0BAAAAAG8AAAAAAAEAAgAB//4BMeeyFcw=
' |
| scut.000026 | 439 | Table_map      |      1024 |         487 | table_id: 111 (test.tt1)                                                                                                           |
| scut.000026 | 487 | Write_rows     |      1024 |         525 | table_id: 111 flags: STMT_END_F                                                                                                    |
| scut.000026 | 525 | Xid            |      1024 |         556 | COMMIT /* xid=425 */                                                                                                               |
| scut.000026 | 556 | Anonymous_Gtid |      1024 |         621 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                                                               |
| scut.000026 | 621 | Query          |      1024 |         689 | BEGIN                                                                                                                              |
| scut.000026 | 689 | Rows_query     |      1024 |         841 | # BINLOG '
F7A7XxMABAAAMAAAABECAAAAAG8AAAAAAAEABHRlc3QAA3R0MQAB/gL+QAE+WKbj
F7A7Xx4ABAAAJgAAADcCAAAAAG8AAAAAAAEAAgAB//4BMmfP2Zk=
' |
| scut.000026 | 841 | Table_map      |      1024 |         889 | table_id: 111 (test.tt1)                                                                                                           |
| scut.000026 | 889 | Write_rows     |      1024 |         927 | table_id: 111 flags: STMT_END_F                                                                                                    |
| scut.000026 | 927 | Xid            |      1024 |         958 | COMMIT /* xid=432 */                                                                                                               |
+-------------+-----+----------------+-----------+-------------+------------------------------------------------------------------------------------------------------------------------------------+
14 rows in set (0.00 sec)

我們看到兩個 insert 已經分開到兩個事務里面了,

后記

ROW模式下,即使我們只更新了一條記錄的其中某個欄位,也會記錄每個欄位變更前后的值,這個行為是 binlog_row_image 引數控制的,這個引數有3個值,默認為FULL,也就是記錄列的所有修改,即使欄位沒有發生變更也會記錄,這樣我們就可以實作類似 Oracle 的 flashback 的功能,我個人估計 MySQL 未來的版本從可能會基于 Binlog 推出這樣的功能,
了解了 Binlog 的結構,再加上 Python 這把瑞士軍刀,我們還可以實作很多功能,例如我們可以統計哪個表被修改地最多? 我們還可以把 Binlog 切割成一段一段的,然后再重組,可以靈活地進行 MySQL 資料庫的修改和遷移等作業,

姚遠2018 CSDN認證博客專家 10G OCM 12C OCM
Oracle10g,12c OCM; MySQL 5.6,5.7,8.0 OCP;CCNA; EMC Certified; IBM P Certified; RHCE; SQLServer 764; DB2 Certified; TOEIC 890;獲得過兩次國家部級科技進步獎;發明過兩項計算機專利,

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

標籤:其他

上一篇:誰有oVirt云平臺的任何問題,我們可以一起交流

下一篇:plc程式圖

標籤雲
其他(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)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more