软件需求:漏洞扫描器需要一个配置文件,用于存放不同漏洞的 Payload。
解决方式:创建 paramsFuzz.json 文件,定义多层嵌套的 Json 数据格式。然后在 main.go 中定义对应数据格式的结构体,把配置文件中的数据读取到程序中,运行没有问题。
main.go 相关的主要代码如下:
// ParamsFuzzJson 定义配置文件解析后的结构
type ParamsFuzzJson struct {
Data []ParamData `json:"data"`
ParamsWhiteArray []string `json:"params_white_list"`
ParamsHazardArray []ParamsHazardData `json:"params_hazard"`
}
func read_paramsPayload() ParamsFuzzJson {
var paramsFuzzJson ParamsFuzzJson
bytes, err := ioutil.ReadFile("./fuzzDicts/paramsFuzz.json")
if err != nil {
fmt.Println("读取json文件失败", err)
os.Exit(1)
}
// 把文件内容赋值给定义的结构体
err = json.Unmarshal(bytes, ¶msFuzzJson)
if err != nil {
fmt.Println("读取/fuzzDicts/paramsFuzz.json时,解析数据失败", err)
os.Exit(1)
}
return paramsFuzzJson
}
需求:把项目代码编译成 exe,便于执行,避免每次执行都要启动 IDEA。
遇到问题:编译打包过程中,不会打包 Json 文件,导致程序运行时无法读取 Json 配置文件,如图。
embed:embed是在Go 1.16中新加包。它通过//go:embed指令,可以在编译阶段将静态资源文件打包进编译好的程序中,并提供访问这些文件的能力。
embed的三种数据类型及使用:在embed中,可以将静态资源文件嵌入到三种类型的变量,分别为:字符串、字节数组、embed.FS文件类型。
将文件内容嵌入到字节数组变量中-示例:
package main
import (
_ "embed"
"fmt"
)
//go:embed version.txt
var versionByte []byte
func main() {
fmt.Printf("version %q\n", string(versionByte))
}
易错点://go:embed
指令只能用在包级别的全局变量中,不能用在函数或方法内,否则在编译的时候会报"go:embed cannot apply to var inside func"错误。
应用步骤:
更改后的代码:
// ParamsFuzzJson 定义配置文件解析后的结构
type ParamsFuzzJson struct {
Data []ParamData `json:"data"`
ParamsWhiteArray []string `json:"params_white_list"`
ParamsHazardArray []ParamsHazardData `json:"params_hazard"`
}
//go:embed paramsFuzz.json
var payloadByte []byte
func read_paramsPayload() ParamsFuzzJson {
var paramsFuzzJson ParamsFuzzJson
json.Unmarshal(payloadByte, ¶msFuzzJson)
return paramsFuzzJson
}