當(dāng)您對(duì)外部模塊的存儲(chǔ)庫進(jìn)行了 fork (例如修復(fù)模塊代碼中的問題或添加功能)時(shí),您可以讓 Go 工具將您的 fork 用于模塊的源代碼。這對(duì)于測(cè)試您自己的代碼的更改很有用。
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的高平網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
為此,您可以使用go.mod 文件中的replace指令將外部模塊的原始模塊路徑替換為存儲(chǔ)庫中 fork 的路徑。這指示 Go 工具在編譯時(shí)使用替換路徑(fork 的位置),例如,同時(shí)允許您保留import 原始模塊路徑中的語句不變。
在以下 go.mod 文件示例中,當(dāng)前模塊需要外部模塊example.com/theirmodule。然后該replace指令將原始模塊路徑替換為example.com/myfork/theirmodule模塊自己的存儲(chǔ)庫的分支。
設(shè)置require/replace對(duì)時(shí),使用 Go 工具命令確保文件描述的需求保持一致。使用go list命令獲取當(dāng)前模塊正在使用的版本。然后使用go mod edit命令將需要的模塊替換為fork:
注意: 當(dāng)您使用該replace指令時(shí),Go 工具不會(huì)像添加依賴項(xiàng)中所述對(duì)外部模塊進(jìn)行身份驗(yàn)證。
您可以使用go get命令從其存儲(chǔ)庫中的特定提交為模塊添加未發(fā)布的代碼。
為此,您使用go get命令,用符號(hào)@指定您想要的代碼 。當(dāng)您使用go get時(shí),該命令將向您的 go.mod 文件添加一個(gè) 需要外部模塊的require指令,使用基于有關(guān)提交的詳細(xì)信息的偽版本號(hào)。
以下示例提供了一些說明。這些基于源位于 git 存儲(chǔ)庫中的模塊。
當(dāng)您的代碼不再使用模塊中的任何包時(shí),您可以停止將該模塊作為依賴項(xiàng)進(jìn)行跟蹤。
要停止跟蹤所有未使用的模塊,請(qǐng)運(yùn)行g(shù)o mod tidy 命令。此命令還可能添加在模塊中構(gòu)建包所需的缺失依賴項(xiàng)。
要?jiǎng)h除特定依賴項(xiàng),請(qǐng)使用go get,指定模塊的模塊路徑并附加 @none,如下例所示:
go get命令還將降級(jí)或刪除依賴于已刪除模塊的其他依賴項(xiàng)。
當(dāng)您使用 Go 工具處理模塊時(shí),這些工具默認(rèn)從 proxy.golang.org(一個(gè)公共的 Google 運(yùn)行的模塊鏡像)或直接從模塊的存儲(chǔ)庫下載模塊。您可以指定 Go 工具應(yīng)該使用另一個(gè)代理服務(wù)器來下載和驗(yàn)證模塊。
如果您(或您的團(tuán)隊(duì))已經(jīng)設(shè)置或選擇了您想要使用的不同模塊代理服務(wù)器,您可能想要這樣做。例如,有些人設(shè)置了模塊代理服務(wù)器,以便更好地控制依賴項(xiàng)的使用方式。
要為 Go 工具指定另一個(gè)模塊代理服務(wù)器,請(qǐng)將GOPROXY 環(huán)境變量設(shè)置為一個(gè)或多個(gè)服務(wù)器的 URL。Go 工具將按照您指定的順序嘗試每個(gè) URL。默認(rèn)情況下,GOPROXY首先指定一個(gè)公共的 Google 運(yùn)行模塊代理,然后從模塊的存儲(chǔ)庫直接下載(在其模塊路徑中指定):
您可以將變量設(shè)置為其他模塊代理服務(wù)器的 URL,用逗號(hào)或管道分隔 URL。
Go 模塊經(jīng)常在公共互聯(lián)網(wǎng)上不可用的版本控制服務(wù)器和模塊代理上開發(fā)和分發(fā)。您可以設(shè)置 GOPRIVATE環(huán)境變量。您可以設(shè)置GOPRIVATE環(huán)境變量來配置go命令以從私有源下載和構(gòu)建模塊。然后 go 命令可以從私有源下載和構(gòu)建模塊。
GOPRIVATE或環(huán)境變量可以設(shè)置為匹配模塊前綴的全局模式列表,這些GONOPROXY前綴是私有的,不應(yīng)從任何代理請(qǐng)求。例如:
本教程介紹了 Go 中模糊測(cè)試的基礎(chǔ)知識(shí)。通過模糊測(cè)試,隨機(jī)數(shù)據(jù)會(huì)針對(duì)您的測(cè)試運(yùn)行,以嘗試找出漏洞或?qū)е卤罎⒌妮斎???梢酝ㄟ^模糊測(cè)試發(fā)現(xiàn)的一些漏洞示例包括 SQL 注入、緩沖區(qū)溢出、拒絕服務(wù)和跨站點(diǎn)腳本攻擊。
在本教程中,您將為一個(gè)簡(jiǎn)單的函數(shù)編寫一個(gè)模糊測(cè)試,運(yùn)行 go 命令,并調(diào)試和修復(fù)代碼中的問題。
首先,為您要編寫的代碼創(chuàng)建一個(gè)文件夾。
1、打開命令提示符并切換到您的主目錄。
在 Linux 或 Mac 上:
在 Windows 上:
2、在命令提示符下,為您的代碼創(chuàng)建一個(gè)名為 fuzz 的目錄。
3、創(chuàng)建一個(gè)模塊來保存您的代碼。
運(yùn)行g(shù)o mod init命令,為其提供新代碼的模塊路徑。
接下來,您將添加一些簡(jiǎn)單的代碼來反轉(zhuǎn)字符串,稍后我們將對(duì)其進(jìn)行模糊測(cè)試。
在此步驟中,您將添加一個(gè)函數(shù)來反轉(zhuǎn)字符串。
a.使用您的文本編輯器,在 fuzz 目錄中創(chuàng)建一個(gè)名為 main.go 的文件。
獨(dú)立程序(與庫相反)始終位于 package 中main。
此函數(shù)將接受string,使用byte進(jìn)行循環(huán) ,并在最后返回反轉(zhuǎn)的字符串。
此函數(shù)將運(yùn)行一些Reverse操作,然后將輸出打印到命令行。這有助于查看運(yùn)行中的代碼,并可能有助于調(diào)試。
e.該main函數(shù)使用 fmt 包,因此您需要導(dǎo)入它。
第一行代碼應(yīng)如下所示:
從包含 main.go 的目錄中的命令行,運(yùn)行代碼。
可以看到原來的字符串,反轉(zhuǎn)它的結(jié)果,然后再反轉(zhuǎn)它的結(jié)果,就相當(dāng)于原來的了。
現(xiàn)在代碼正在運(yùn)行,是時(shí)候測(cè)試它了。
在這一步中,您將為Reverse函數(shù)編寫一個(gè)基本的單元測(cè)試。
a.使用您的文本編輯器,在 fuzz 目錄中創(chuàng)建一個(gè)名為 reverse_test.go 的文件。
b.將以下代碼粘貼到 reverse_test.go 中。
這個(gè)簡(jiǎn)單的測(cè)試將斷言列出的輸入字符串將被正確反轉(zhuǎn)。
使用運(yùn)行單元測(cè)試go test
接下來,您將單元測(cè)試更改為模糊測(cè)試。
單元測(cè)試有局限性,即每個(gè)輸入都必須由開發(fā)人員添加到測(cè)試中。模糊測(cè)試的一個(gè)好處是它可以為您的代碼提供輸入,并且可以識(shí)別您提出的測(cè)試用例沒有達(dá)到的邊緣用例。
在本節(jié)中,您將單元測(cè)試轉(zhuǎn)換為模糊測(cè)試,這樣您就可以用更少的工作生成更多的輸入!
請(qǐng)注意,您可以將單元測(cè)試、基準(zhǔn)測(cè)試和模糊測(cè)試保存在同一個(gè) *_test.go 文件中,但對(duì)于本示例,您將單元測(cè)試轉(zhuǎn)換為模糊測(cè)試。
在您的文本編輯器中,將 reverse_test.go 中的單元測(cè)試替換為以下模糊測(cè)試。
Fuzzing 也有一些限制。在您的單元測(cè)試中,您可以預(yù)測(cè)Reverse函數(shù)的預(yù)期輸出,并驗(yàn)證實(shí)際輸出是否滿足這些預(yù)期。
例如,在測(cè)試用例Reverse("Hello, world")中,單元測(cè)試將返回指定為"dlrow ,olleH".
模糊測(cè)試時(shí),您無法預(yù)測(cè)預(yù)期輸出,因?yàn)槟鸁o法控制輸入。
但是,Reverse您可以在模糊測(cè)試中驗(yàn)證函數(shù)的一些屬性。在這個(gè)模糊測(cè)試中檢查的兩個(gè)屬性是:
(1)將字符串反轉(zhuǎn)兩次保留原始值
(2)反轉(zhuǎn)的字符串將其狀態(tài)保留為有效的 UTF-8。
注意單元測(cè)試和模糊測(cè)試之間的語法差異:
(3)確保新包unicode/utf8已導(dǎo)入。
隨著單元測(cè)試轉(zhuǎn)換為模糊測(cè)試,是時(shí)候再次運(yùn)行測(cè)試了。
a.在不進(jìn)行模糊測(cè)試的情況下運(yùn)行模糊測(cè)試,以確保種子輸入通過。
如果您在該文件中有其他測(cè)試,您也可以運(yùn)行g(shù)o test -run=FuzzReverse,并且您只想運(yùn)行模糊測(cè)試。
b.運(yùn)行FuzzReverse模糊測(cè)試,查看是否有任何隨機(jī)生成的字符串輸入會(huì)導(dǎo)致失敗。這是使用go test新標(biāo)志-fuzz執(zhí)行的。
模糊測(cè)試時(shí)發(fā)生故障,導(dǎo)致問題的輸入被寫入將在下次運(yùn)行的種子語料庫文件中g(shù)o test,即使沒有-fuzz標(biāo)志也是如此。要查看導(dǎo)致失敗的輸入,請(qǐng)?jiān)谖谋揪庉嬈髦写蜷_寫入 testdata/fuzz/FuzzReverse 目錄的語料庫文件。您的種子語料庫文件可能包含不同的字符串,但格式相同。
語料庫文件的第一行表示編碼版本。以下每一行代表構(gòu)成語料庫條目的每種類型的值。由于 fuzz target 只需要 1 個(gè)輸入,因此版本之后只有 1 個(gè)值。
c.運(yùn)行沒有-fuzz標(biāo)志的go test; 新的失敗種子語料庫條目將被使用:
由于我們的測(cè)試失敗,是時(shí)候調(diào)試了。
語料庫文件以特殊格式編碼。這是種子語料庫和生成語料庫的相同格式。
下面是一個(gè)語料庫文件的例子:
第一行用于通知模糊引擎文件的編碼版本。雖然目前沒有計(jì)劃未來版本的編碼格式,但設(shè)計(jì)必須支持這種可能性。
下面的每一行都是構(gòu)成語料庫條目的值,如果需要,可以直接復(fù)制到 Go 代碼中。
在上面的示例中,我們?cè)?a []byte后跟一個(gè)int64。這些類型必須按順序與模糊測(cè)試參數(shù)完全匹配。這些類型的模糊目標(biāo)如下所示:
指定您自己的種子語料庫值的最簡(jiǎn)單方法是使用該 (*testing.F).Add方法。在上面的示例中,它看起來像這樣:
但是,您可能有較大的二進(jìn)制文件,您不希望將其作為代碼復(fù)制到您的測(cè)試中,而是作為單獨(dú)的種子語料庫條目保留在 testdata/fuzz/{FuzzTestName} 目錄中。golang.org/x/tools/cmd/file2fuzz 上的file2fuzz工具可用于將這些二進(jìn)制文件轉(zhuǎn)換為為[]byte.
要使用此工具:
語料庫條目:語料庫 中的一個(gè)輸入,可以在模糊測(cè)試時(shí)使用。這可以是特殊格式的文件,也可以是對(duì) (*testing.F).Add。
覆蓋指導(dǎo): 一種模糊測(cè)試方法,它使用代碼覆蓋范圍的擴(kuò)展來確定哪些語料庫條目值得保留以備將來使用。
失敗的輸入:失敗的輸入是一個(gè)語料庫條目,當(dāng)針對(duì) 模糊目標(biāo)運(yùn)行時(shí)會(huì)導(dǎo)致錯(cuò)誤或恐慌。
fuzz target: 模糊測(cè)試的目標(biāo)功能,在模糊測(cè)試時(shí)對(duì)語料庫條目和生成的值執(zhí)行。它通過將函數(shù)傳遞給 (*testing.F).Fuzz實(shí)現(xiàn)。
fuzz test: 測(cè)試文件中的一個(gè)被命名為func FuzzXxx(*testing.F)的函數(shù),可用于模糊測(cè)試。
fuzzing: 一種自動(dòng)化測(cè)試,它不斷地操縱程序的輸入,以發(fā)現(xiàn)代碼可能容易受到的錯(cuò)誤或漏洞等問題。
fuzzing arguments: 將傳遞給 模糊測(cè)試目標(biāo)的參數(shù),并由mutator進(jìn)行變異。
fuzzing engine: 一個(gè)管理fuzzing的工具,包括維護(hù)語料庫、調(diào)用mutator、識(shí)別新的覆蓋率和報(bào)告失敗。
生成的語料庫: 由模糊引擎隨時(shí)間維護(hù)的語料庫,同時(shí)模糊測(cè)試以跟蹤進(jìn)度。它存儲(chǔ)在$GOCACHE/fuzz 中。這些條目?jī)H在模糊測(cè)試時(shí)使用。
mutator: 一種在模糊測(cè)試時(shí)使用的工具,它在將語料庫條目傳遞給模糊目標(biāo)之前隨機(jī)操作它們。
package: 同一目錄下編譯在一起的源文件的集合。
種子語料庫: 用戶提供的用于模糊測(cè)試的語料庫,可用于指導(dǎo)模糊引擎。它由 f.Add 在模糊測(cè)試中調(diào)用提供的語料庫條目以及包內(nèi) testdata/fuzz/{FuzzTestName} 目錄中的文件組成。這些條目默認(rèn)使用go test運(yùn)行,無論是否進(jìn)行模糊測(cè)試。
測(cè)試文件: 格式為 xxx_test.go 的文件,可能包含測(cè)試、基準(zhǔn)、示例和模糊測(cè)試。
漏洞: 代碼中的安全敏感漏洞,可以被攻擊者利用。