Go-知識測試-模糊測試

Go-知識測試-模糊測試

  • 1. 定義
  • 2. 例子
  • 3. 數據結構
  • 4. tesing.F.Add
  • 5. 模糊測試的執行
  • 6. testing.InternalFuzzTarget
  • 7. testing.runFuzzing
  • 8. testing.fRunner
  • 9. FuzzXyz
  • 10. RunFuzzWorker
  • 11. CoordinateFuzzing
  • 12. 總結

建議先看:https://blog.csdn.net/a18792721831/article/details/140062769

Go-知識測試-工作機制

1. 定義

模糊測試(Fuzzing)是一種通過構造隨機數據對代碼進行測試的測試方法,相比于單元測試,
它能提供更為全面的測試覆蓋,從而找出代碼中的潛在漏洞。
從1.18開始,Go開始正式支持模糊測試。
模糊測試要保證測試文件以_test.go結尾。
測試方法必須以FuzzXxx開頭。
模糊測試方法必須以*testing.F作為參數。

2. 例子

假設有個函數,根據輸入內容,將輸入進行翻轉然后在和輸入拼接,從而返回一個回文串(不一定是嚴格意義下的回文串)
函數如下:

func PalindromeStr(in string) string {b := []byte(in)for i, j := 0, len(b)-1; i < len(b)/2; i, j = i+1, j-1 {b[i], b[j] = b[j], b[i]}return in + string(b)
}

接著使用單元測試

func TestPalindromeStr(t *testing.T) {testCase := []struct{ in, out string }{{"abc", "abccba"},{"abcdef", "abcdeffedcba"},{"abcdefg", "abcdefggfedcba"},{" ", "  "},}for _, c := range testCase {o := PalindromeStr(c.in)if o != c.out {t.Error("Not equal", c.out, "got:", o)}}
}

使用go test -v 執行示例測試,-v 表示控制臺輸出結果
在這里插入圖片描述

接著使用模糊測試

func FuzzPalindromeStr(f *testing.F) {testCase := []string{"abc", "def", " ", "a", "aaa", "aaaaaaaaaaaaaaaaaaaa"}for _, c := range testCase {f.Add(c) // 輸入測試種子}f.Fuzz(func(t *testing.T, a string) {b := PalindromeStr(a)// 返回結果進行判斷,回文串的規則就是第一個字符和最后一個字符相同,依次類推for i, j := 0, len(b)-1; i < len(b)/2; i, j = i+1, j-1 {if b[i] != b[j] {t.Error("Not palindrome")}}})
}

使用go test -fuzz=Fuzz -fuzztime=100s啟動模糊測試,-fuzz表示執行模糊測試,-fuzztime表示持續時間
在這里插入圖片描述

發現執行了100s,也沒法問題。
那么我們就自動構造一個錯誤,如果是utf-8字符,返回回文串,否則返回輸入內容,模擬異常邏輯:

func PalindromeStr(in string) string {b := []byte(in)if !utf8.Valid(b) {return in}for i, j := 0, len(b)-1; i < len(b)/2; i, j = i+1, j-1 {b[i], b[j] = b[j], b[i]}return in + string(b)
}

因為單元測試中沒有中文字符,所以單元測試通過,但是模糊測試呢:
在這里插入圖片描述

報錯了,同時testdata目錄中有相應的輸入和輸出
在這里插入圖片描述

非utf8字符串,觸發了錯誤邏輯

3. 數據結構

由于模糊測試可以覆蓋人類經常忽略的邊界用例,因此模糊測試對于發現安全漏洞特別有價值。
模糊測試的結構如下:
在這里插入圖片描述

看起來很像單元測試的擴展。
一個模糊測試可以分為兩部分,一是通過 f.Add 添加隨機種子,二是通過 f.Fuzz 函數開始隨機測試。標記測試結果的方法與之前的單元測試是通用的。
模糊測試的testing.F結構:
go在1.18中,在testing的包中增加了fuzz.go文件,支持模糊測試:

type F struct {common // 通用測試結構,更多見 https://blog.csdn.net/a18792721831/article/details/140062769fuzzContext *fuzzContext // 與 testContext 類似,用于控制執行testContext *testContextinFuzzFn bool // 標記 fuzz 是否在運行中corpus []corpusEntry // 種子,語料庫result     fuzzResult // 模糊測試結果fuzzCalled bool // 是否啟動
}

通用測試結構 common 提供了諸如標記測試結果的能力,而增加的 corpus 則用于保存通過 f.Add 添加的種子和測試過程中生成的隨機輸入。
每次執行 f.Add 都會生成一個 corpusEntry 對象,然后加入 corpus 語料庫中。
corpusEntry 結構用于保存待測函數的所有輸入:

type corpusEntry = struct {Parent     stringPath       stringData       []byteValues     []any // Values 要與待測函數索旭耀的參數完全一致Generation intIsSeed     bool
}

f.Add 每次添加的種子個數需要與待測函數所需要的參數完全一致,因為測試執行時,每次取出一組種子作為函數的入參。

4. tesing.F.Add

func (f *F) Add(args ...any) {// 將輸入的參數加入到數組中var values []anyfor i := range args {// 模糊測試只能支持基本數據類型,對于復雜類型是不支持的if t := reflect.TypeOf(args[i]); !supportedTypes[t] {panic(fmt.Sprintf("testing: unsupported type to Add %v", t))}values = append(values, args[i])}f.corpus = append(f.corpus, corpusEntry{Values: values, IsSeed: true, Path: fmt.Sprintf("seed#%d", len(f.corpus))})
}

支持模糊測試的參數類型:

var supportedTypes = map[reflect.Type]bool{reflect.TypeOf(([]byte)("")):  true,reflect.TypeOf((string)("")):  true,reflect.TypeOf((bool)(false)): true,reflect.TypeOf((byte)(0)):     true,reflect.TypeOf((rune)(0)):     true,reflect.TypeOf((float32)(0)):  true,reflect.TypeOf((float64)(0)):  true,reflect.TypeOf((int)(0)):      true,reflect.TypeOf((int8)(0)):     true,reflect.TypeOf((int16)(0)):    true,reflect.TypeOf((int32)(0)):    true,reflect.TypeOf((int64)(0)):    true,reflect.TypeOf((uint)(0)):     true,reflect.TypeOf((uint8)(0)):    true,reflect.TypeOf((uint16)(0)):   true,reflect.TypeOf((uint32)(0)):   true,reflect.TypeOf((uint64)(0)):   true,
}

除了這些之外的類型都不支持。

5. 模糊測試的執行

src/tesing/fuzz.goinitFuzzFlags中定義了模糊測試的參數:

func initFuzzFlags() {matchFuzz = flag.String("test.fuzz", "", "run the fuzz test matching `regexp`")flag.Var(&fuzzDuration, "test.fuzztime", "time to spend fuzzing; default is to run indefinitely")flag.Var(&minimizeDuration, "test.fuzzminimizetime", "time to spend minimizing a value after finding a failing input")fuzzCacheDir = flag.String("test.fuzzcachedir", "", "directory where interesting fuzzing inputs are stored (for use only by cmd/go)")isFuzzWorker = flag.Bool("test.fuzzworker", false, "coordinate with the parent process to fuzz random values (for use only by cmd/go)")
}

首先使用-fuzz=reg觸發模糊測試,-fuzztime=30s指定模糊測試持續的時間,如果不指定,則一直運行。
-fuzzminimizetime最小失敗時間,默認一分鐘,-fuzzcachedir緩存目錄,默認是命令執行目錄,fuzzworker工作目錄,默認是命令執行目錄。

6. testing.InternalFuzzTarget

testing.M中,對于單元測試,示例測試和性能測試,都有一個內部類型用于存儲編譯生成的執行參數。模糊測試也有:
在這里插入圖片描述

在1.18中三種內部類型增加成4種了。
在編譯的時候,load操作也增加了 Fuzz開頭的模糊測試函數
在這里插入圖片描述

在渲染測試的main入口中,也增加了模糊測試的模板
在這里插入圖片描述

在testing.M.Run中,增加了模糊測試的支持
在這里插入圖片描述

InternalFuzzTarget的結構:

type InternalFuzzTarget struct {Name stringFn   func(f *F)
}

很簡單,和單元測試等的結構非常類似,name和對應的func,func 的參數是 *testing.F

7. testing.runFuzzing

在runFuzzing中首先對全部的模糊測試進行匹配,找到本次期望執行的模糊測試case
在這里插入圖片描述

接著構造testing.F對象,調用testing.fRunner執行case
在這里插入圖片描述

8. testing.fRunner

在testing.fRunner中啟動執行,類似于單元測試的 testing.tRunner。
在這里插入圖片描述

性能測試是 testing.runN
示例測試是 testing.runExample
單元測試是 testing.tRunner

第一個defer函數主要處理這幾個事情:失敗后資源清理,保證測試報告完成,失敗退出,等待子測試完成,成功輸出報告。
第二個defer函數是等待所有的子測試完成后,發送信號,表示子測試結束。

9. FuzzXyz

接著回到模糊測試中:

func FuzzPalindromeStr(f *testing.F) {testCase := []string{"abc", "def", " ", "a", "aaa", "你好"}for _, c := range testCase {f.Add(c) // 輸入測試種子}f.Fuzz(func(t *testing.T, a string) {b := PalindromeStr(a)// 返回結果進行判斷,回文串的規則就是第一個字符和最后一個字符相同,依次類推for i, j := 0, len(b)-1; i < len(b)/2; i, j = i+1, j-1 {if b[i] != b[j] {t.Error("Not palindrome")}}})
}

模糊測試可以認為是兩部分,第一部分是輸入測試種子,第二部分是判決模糊的參數執行是否成功。
在testing.F.Add中,將參數種子放到了testing.F.corpus里面,并且要求輸入的種子參數的數量,每次Add的時候,必須和被測試方法的入參一致。
在第二部分的Fuzz中,首先對入參進行了校驗:
在這里插入圖片描述

入參是一個func類型的參數,并且第一個參數是*testing.T的參數,后面是可變參數。
第一個*testing.T主要是復用了單元測試的測試管理能力,比如報告輸出,成功失敗的標記等等。
后面的可變參數則是被模糊測試的函數入參列表。
接著對可變參數列表進行類型判斷,只有基本類型才能模糊測試,如果入參中存在復雜類型,那么是無法模糊測試的。
在這里插入圖片描述

接下來就是模糊的核心邏輯了,如何根據輸入的參數種子,派生更多的入參用例:
在這里插入圖片描述

模糊測試的goroutine分為三種
在這里插入圖片描述

這三種的含義先存疑。
在CheckCorpus中,對入參種子和可變參數進行校驗,確保種子數組中每一組都符合要求。
在ReadCorpus中,則是隨機取出本次執行的參數,如果是指定fuzz的目錄和id,那么會使用指定的目錄下的指定參數去執行
在這里插入圖片描述

ReadCorpus調用了internal的fuzz實現
在這里插入圖片描述

在ReadCorpus中調用了readCorpusData
在這里插入圖片描述

不過上面都是執行特定的模糊case 。
在前面已知模糊測試的goroutine中有三種:

const (seedCorpusOnly fuzzMode = iotafuzzCoordinatorfuzzWorker
)

第一種 seedCorpusOnly 是 testing.runFuzzTests 中創建的,由testing.M調用
在這里插入圖片描述

第二種 fuzzCoordinator 是 默認的,如果執行的go命令中沒有指定 test.fuzzworker , 默認是 false
在 testing.runFuzzing 中創建的
在這里插入圖片描述

第三種 fuzzWorker 是由 命令行參數指定的。

在這里插入圖片描述

根據這里的邏輯,基本上可以看出,seedCorpusOnly 是讀取指定模糊case, fuzzCoordinator是生成模糊case,fuzzWorker是執行case。
在這里插入圖片描述

接著創建一個 testing.T 的對象,然后調用 testing.tRunner 執行case 。
在這里插入圖片描述

testing.tRunner執行case的參數是 corpusEntry 類型的輸入。

也就是說,對于模糊測試,會先直接調用測試種子執行,然后會根據執行情況,在進行隨機參數。

如果是 fuzzCoordinator 類型的,那么執行 CoordinateFuzzing
在這里插入圖片描述

如果是 fuzzWorker ,執行 RunFuzzWorker
在這里插入圖片描述

如果是 seedCorpusOnly ,執行 run func,相當于直接用測試種子運行
在這里插入圖片描述

在 fuzzWorker中,對于輸出做了重定向。

10. RunFuzzWorker

RunFuzzWorker方法是在internal中實現的
在這里插入圖片描述

如果一個case經過了10還沒有被執行,就認為是餓死了
在serve方法中調用了workerServer.Fuzz 方法
在這里插入圖片描述

并且是持續性調用的
在workerServer.fuzz中進行模糊測試
在workerServer.fuzz中,第一次調用直接使用種子
在這里插入圖片描述

接著就是持續性測試了
在這里插入圖片描述

在 mutator.mutate 中根據種子進行隨機
在這里插入圖片描述

會對一次隨機的多個參數,隨機選擇一個參數,然后對這個參數進行隨機
比如對于整型,會隨機加或者減一個數
在這里插入圖片描述

對于字符串,對字節碼隨機加減
在這里插入圖片描述

也就是說,如果你的種子里面有中文,才會隨機中文。

contains
accepts
calls
calls
passes
returns
TestDeps
RunFuzzWorker
fn
workerServer.fuzz
mutator.mutate
fuzz.CorpusEntry
error

11. CoordinateFuzzing

CoordinateFuzzing方法在internal中實現的
在這里插入圖片描述

首先會對并發數,緩存目錄,日志等進行初始化
在這里插入圖片描述

根據并發數,創建多個 worker 執行模糊測試
在這里插入圖片描述

在coordinate中也是持續測試
在這里插入圖片描述

如果沒有啟動,那么就調用啟動初始化等操作,如果收到了退出信號,那么就退出
如果隨機輸入已經生成,那么就使用隨機輸入調用
在這里插入圖片描述

接著是for-select進行持續性測試,除非模糊測試失敗,或者執行模糊測試的時候,有設置超時時間,或者主動退出等
在這里插入圖片描述

在workerClient.fuzz中執行
在這里插入圖片描述

也是調用 mutator.mutate 進行隨機
在這里插入圖片描述

同時,在調用FuzzXyz后,會記錄case的執行情況,用于分析執行的覆蓋率等等
在這里插入圖片描述

12. 總結

Go 1.18 的 Fuzz 測試使用了一種稱為 “coverage-guided fuzzing” 的技術來生成隨機輸入。這種技術的基本思想是通過監視被測試代碼的覆蓋率來引導輸入的生成。

具體來說,Fuzz 測試首先使用你提供的種子值(seed values)來運行測試。然后,它會監視這些測試運行過程中哪些代碼被執行了,以及輸入值如何影響代碼的執行路徑。

接著,Fuzz 測試會嘗試修改種子值或者組合種子值,生成新的輸入,以嘗試覆蓋更多的代碼路徑。例如,如果你的種子值是字符串,Fuzz 測試可能會改變字符串的長度,添加、刪除或修改字符,等等。

如果新的輸入導致了更多的代碼被執行,或者觸發了新的代碼路徑,那么這個輸入就會被保存下來,用作后續測試的種子值。這樣,Fuzz 測試就可以逐漸 “學習” 如何生成能夠觸發更多代碼路徑的輸入。

這種方法可以有效地發現一些難以預見的邊界情況,特別是那些可能導致程序崩潰或者行為異常的情況。

需要注意的是,雖然 Fuzz 測試可以自動生成大量的輸入,但是它并不能保證完全覆蓋所有可能的輸入。因此,你仍然需要編寫單元測試和集成測試,以確保你的代碼在預期的輸入下能夠正確工作。

Coverage-Guided Fuzzing 相關論文和鏈接

Coverage-guided fuzzing 是一種基于代碼覆蓋率的模糊測試技術,通過生成輸入數據并監控代碼覆蓋率來發現潛在的錯誤和漏洞。這種方法的核心思想是通過最大化代碼覆蓋率來提高測試的有效性。

  1. “American Fuzzy Lop (AFL)”
    AFL 是一種流行的 coverage-guided fuzzing 工具,由 Micha? Zalewski 開發。雖然 AFL 本身不是一篇論文,但它的設計和實現對該領域有著重要影響。
  • 鏈接: AFL GitHub Repository
  1. “Fuzzing: Brute Force Vulnerability Discovery”
    這篇論文由 Michael Sutton, Adam Greene, 和 Pedram Amini 撰寫,詳細介紹了模糊測試的基本概念和技術,包括 coverage-guided fuzzing。
  • 鏈接: Fuzzing: Brute Force Vulnerability Discovery
  1. “Coverage-based Greybox Fuzzing as Markov Chain”
    這篇論文由 Marcel B?hme, Van-Thuan Pham, 和 Abhik Roychoudhury 撰寫,提出了一種基于覆蓋率的灰盒模糊測試方法,并將其建模為馬爾可夫鏈。
  • 鏈接: Coverage-based Greybox Fuzzing as Markov Chain
  1. “AFLFast: A Framework for Extremely Fast Fuzzing”
    這篇論文由 Marcel B?hme, Van-Thuan Pham, Manh-Dung Nguyen, 和 Abhik Roychoudhury 撰寫,介紹了 AFLFast,這是一種改進的 AFL 版本,通過優化輸入生成策略來提高模糊測試的效率。
  • 鏈接: AFLFast: A Framework for Extremely Fast Fuzzing
  1. “LibFuzzer: A Library for Coverage-Guided Fuzz Testing”
    LibFuzzer 是 LLVM 項目的一部分,提供了一個用于覆蓋率引導模糊測試的庫。雖然沒有正式的論文,但其設計和實現文檔非常詳細。
  • 鏈接: LibFuzzer Documentation
  1. “Fuzzing with Code Fragments”
    這篇論文由 Patrice Godefroid, Hila Peleg, 和 Rishabh Singh 撰寫,提出了一種基于代碼片段的模糊測試方法,通過組合代碼片段來生成新的測試輸入。
  • 鏈接: Fuzzing with Code Fragments
  1. “Evaluating Fuzz Testing”
    這篇論文由 Marcel B?hme, Van-Thuan Pham, Manh-Dung Nguyen, 和 Abhik Roychoudhury 撰寫,評估了不同模糊測試工具和技術的有效性,包括 coverage-guided fuzzing。
  • 鏈接: Evaluating Fuzz Testing
  1. “Fuzzing: Art, Science, and Engineering”
    這篇論文由 Patrice Godefroid 撰寫,全面介紹了模糊測試的藝術、科學和工程,包括 coverage-guided fuzzing 的技術細節和應用。
  • 鏈接: Fuzzing: Art, Science, and Engineering

這些論文和資源提供了關于 coverage-guided fuzzing 的深入理解和最新研究成果。通過閱讀這些文獻,你可以更好地理解這種技術的原理、實現和應用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/45212.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/45212.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/45212.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一文入門【NestJs】Providers

Nest學習系列 ??一文入門【NestJS】 ??一文入門【NestJs】Controllers 控制器 &#x1f6a9; 前言 在NestJS的世界里&#xff0c;理解“Providers”是構建健壯、可維護的后端服務的關鍵。NestJS&#xff0c;作為Node.js的一個現代框架&#xff0c;采用了Angular的一些核…

Redis的安裝配置及IDEA中使用

目錄 一、安裝redis&#xff0c;配置redis.conf 1.安裝gcc 2.將redis的壓縮包放到指定位置解壓 [如下面放在 /opt 目錄下] 3.編譯安裝 4.配置redis.conf文件 5.開機自啟 二、解決虛擬機本地可以連接redis但是主機不能連接redis 1.虛擬機網絡適配器網絡連接設置為橋接模式…

VSCode上通過C++實現單例模式

單例模式實際上就是為了確保一個類最多只有一個實例&#xff0c;并且在程序的任何地方都可以訪問這個實例&#xff0c;也就是提供一個全局訪問點&#xff0c;單例對象不需要手動釋放&#xff0c;交給系統來釋放就可以了&#xff0c;單例模式的設計初衷就是為了在整個應用程序的…

vue 下拉菜單樹形結構——vue-treeselect的組件使用

參考&#xff1a; https://www.cnblogs.com/syjtiramisu/p/17672866.htmlhttps://www.cnblogs.com/syjtiramisu/p/17672866.html vue-treeselect的使用 - 簡書下載依賴 使用https://www.jianshu.com/p/459550e1477d 實際項目使用&#xff1a;

uni-app iOS上架相關App store App store connect 云打包有次數限制

相冊權限 uni-app云打包免費有次數 切換一個賬號繼續

使用SOAP與TrinityCore交互(待定)

原文&#xff1a;SOAP with TrinityCore | TrinityCore MMo Project Wiki 如何使用SOAP與TC交互 SOAP代表簡單對象訪問協議&#xff0c;是一種類似于REST的基于標準的web服務訪問協議的舊形式。只要必要的配置到位&#xff0c;您就可以利用SOAP向TrinityCore服務器發送命令。 …

Open3D 計算點云配準的精度和重疊度

目錄 一、概述 1.1計算配準精度 1.2計算點云重疊度 二、代碼實現 2.1關鍵函數 2.2完整代碼 三、實現效果 3.1原始點云 3.2計算結果 一、概述 在點云配準中,精度和重疊度是兩個重要的評價指標。精度通常用均方根誤差(RMSE)來衡量,而重疊度則表示兩個點云在…

centos環境啟動/重啟java服務腳本優化

centos環境啟動/重啟java服務腳本優化 引部分命令說明根據端口查詢服務進程殺死進程函數腳本接收參數 腳本注意重啟文檔位置異常 引 在離線環境部署的多個java應用組成的系統&#xff0c;測試階段需要較為頻繁的發布&#xff0c;因資源限制&#xff0c;沒有弄devops或CICD那套…

華為手機聯系人不見了怎么恢復?3個解決方案

華為手機聯系人列表就像是我們精心編織的社交網絡之網。然而&#xff0c;有時&#xff0c;這張網可能會因為各種原因而意外破損&#xff0c;聯系人信息消失得無影無蹤&#xff0c;讓我們陷入“人脈孤島”的困境。華為手機聯系人不見了怎么恢復&#xff1f;別擔心&#xff0c;我…

構建高質量數據集與智能數據工程平臺:播客AI Odyssey深度對話實錄

對話整數智能聯創和前IDEA研究員&#xff1a;構建高質量數據集與智能數據工程平臺 - AI Odyssey | 小宇宙 - 聽播客&#xff0c;上小宇宙 人工智能技術的日益深遠發展&#xff0c;對人工智能的性能提升與技術迭代提出了新的要求。在大模型訓練中&#xff0c;已有的研究和實踐表…

【操作系統】進程管理——用信號量機制解決問題,以生產者-消費者問題為例(個人筆記)

學習日期&#xff1a;2024.7.10 內容摘要&#xff1a;利用信號量機制解決幾個經典問題模型 目錄 引言 問題模型 生產者-消費者問題&#xff08;經典&#xff09; 多生產者-多消費者問題 吸煙者問題 讀者寫者問題&#xff08;難點&#xff09; 哲學家進餐問題&#xff0…

解決POST請求中文亂碼問題

解決POST請求中文亂碼問題 1、亂碼原因2、解決方法3、具體步驟 &#x1f496;The Begin&#x1f496;點點關注&#xff0c;收藏不迷路&#x1f496; 在Web開發中&#xff0c;處理POST請求時經常遇到中文亂碼問題&#xff0c;這主要是由于服務器在接收到POST請求的數據后&#x…

物聯網時代的等保測評:保障萬物互聯的安全

隨著物聯網&#xff08;IoT&#xff09;技術的飛速發展&#xff0c;我們的生活正逐漸進入一個萬物互聯的新時代。從智能家居到智慧城市&#xff0c;從無人駕駛到農業物聯網&#xff0c;IoT技術正在滲透到我們生活的方方面面。然而&#xff0c;隨著IoT設備數量的激增&#xff0c…

BUG解決:postman可以請求成功,但Python requests請求報403

目錄 問題背景 問題定位 問題解決 問題背景 使用Python的requests庫對接物聯數據的接口之前一直正常運行&#xff0c;昨天突然請求不通了&#xff0c;通過進一步驗證發現凡是使用代碼調用接口就不通&#xff0c;而使用postman就能調通&#xff0c;請求參數啥的都沒變。 接口…

SSL 證書錯誤:如何修復以及錯誤發生的原因

SSL證書可以提升網站的可信度。然而&#xff0c;如果您的SSL證書出現錯誤&#xff0c;您可能會得到一個“不安全”的標簽&#xff0c;這可能會導致訪問者失去對您網站的信任并轉向競爭對手。 本文將介紹SSL證書錯誤的原因及其對用戶的潛在影響。隨后&#xff0c;我們將提供詳細…

MybatisPlus 核心功能

MybatisPlus 核心功能 文章目錄 MybatisPlus 核心功能1. 條件構造器1.1 QueryWrapper1.2 LambdaQueryWrapper&#xff08;推薦&#xff09;1.3 UpdateWrapper1.4 LambdaUpdateWrapper 2. 自定義SQL3. Service接口 1. 條件構造器 當涉及到查詢或修改語句時&#xff0c;MybatisP…

界面組件Kendo UI for React 2024 Q2亮點 - 生成式AI集成、設計系統增強

隨著最新的2024年第二季度發布&#xff0c;Kendo UI for React為應用程序開發設定了標準&#xff0c;包括生成式AI集成、增強的設計系統功能和可訪問的數據可視化。新的2024年第二季度版本為應用程序界面提供了人工智能(AI)提示&#xff0c;從設計到代碼的生產力增強、可訪問性…

Java畢業設計 基于SSM vue圖書管理系統小程序 微信小程序

Java畢業設計 基于SSM vue圖書管理系統小程序 微信小程序 SSM 圖書管理系統小程序 功能介紹 用戶 登錄 注冊 首頁 圖片輪播 圖書信息推薦 圖書詳情 贊 踩 評論 收藏 系統公告 公告詳情 用戶信息修改 我的待還 圖書歸還 催還提醒 我的收藏管理 意見反饋 管理員 登錄 個人中心…

絕地求生PUBG奇幻大亂斗怎么玩 奇幻大亂斗什么時候回歸

《絕地求生》(PUBG) 是由韓國開發的一款戰術競技型射擊類沙盒游戲&#xff0c;游戲中我們需要和隊友組隊乘坐飛機跳傘到達一座空島&#xff0c;之后我們需要搜索一切我們可以用到的物資&#xff0c;之后我們于敵人進行對戰&#xff0c;期間不斷躲避毒圈的追擊&#xff0c;最后當…

python(餐廳點餐系統)

全部代碼&#xff1a; meau_lis[[1,"牛排",50],[2,"羊排",80],[3,"大盤雞",50],[4,"火鍋雞",68],[5,"豬大骨",35],[6,"米飯",2],[7,"壽司",5],[8,"大餅",6],[9,"小米粥",1],[10,&…