官方教程:Go fuzzing模糊测试

本文详细介绍了如何使用Go 1.18新引入的fuzzing功能进行模糊测试。从安装Go 1.18 beta版本开始,逐步指导创建代码目录,实现和测试Reverse函数,再到增加模糊测试,修复由模糊测试发现的两个bug。文章强调fuzzing与单元测试和性能测试相辅相成,提供了一种发现潜在问题的有效手段。通过实践,读者将掌握Go语言模糊测试的基本流程和应用。
摘要由CSDN通过智能技术生成

前言

Go 1.18在go工具链里引入了fuzzing模糊测试,可以帮助我们发现Go代码里的漏洞或者可能导致程序崩溃的输入。Go官方团队也在官网发布了fuzzing入门教程,帮助大家快速上手。

 

本人对Go官方教程在翻译的基础上做了一些表述上的优化,以飨读者。

注意:fuzzing模糊测试和Go已有的单元测试以及性能测试框架是互为补充的,并不是替代关系。

教程内容

这篇教程会介绍Go fuzzing的入门基础知识。fuzzing可以构造随机数据来找出代码里的漏洞或者可能导致程序崩溃的输入。通过fuzzing可以找出的漏洞包括SQL注入、缓冲区溢出、拒绝服务(Denial of Service)攻击和XSS(cross-site scripting)攻击等。

在这个教程里,你会给一个函数写一段fuzz test(模糊测试)程序,然后运行go命令来发现代码里的问题,最后通过调试来修复问题。

本文里涉及的专业术语,可以参考 Go Fuzzing glossary

接下来会按照如下章节介绍:

  1. 为你的代码创建一个目录

  2. 实现一个函数

  3. 增加单元测试

  4. 增加模糊测试

  5. 修复2个bug

  6. 总结

准备工作

  • 安装Go 1.18 Beta 1或者更新的版本。安装指引可以参考下面的介绍

  • 有一个代码编辑工具。任何文本编辑器都可以。

  • 有一个命令行终端。Go可以运行在Linux,Mac上的任何命令行终端,也可以运行在Windows的PowerShell或者cmd之上。

  • 有一个支持fuzzing的环境。目前Go fuzzing只支持AMD64和ARM64架构。

安装和使用beta版本

这个教程需要使用Go 1.18 Beta 1或以上版本的泛型功能。使用如下步骤,安装beta版本

  1. 使用下面的命令安装beta版本

    $ go install golang.org/dl/go1.18beta1@latest
  2. 运行如下命令来下载更新

    $ go1.18beta1 download

    注意:如果在MAC或者Linux上执行go1.18beta1提示command not found,需要设置bash或者zsh对应的profile环境变量文件。bash设置在~/.bash_profile文件里,内容为:

    export GOROOT=/usr/local/opt/go/libexec
    export GOPATH=$HOME/go
    export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

    GOROOTGOPATH的值可以通过go env命令查看,设置完后执行source ~/.bash_profile让设置生效,再执行go1.18beta1就不报错了。

  3. 使用beta版本的go命令,不要去使用release版本的go命令

    你可以通过直接使用go1.18beta1命令或者给go1.18beta1起一个简单的别名

    • 直接使用go1.18beta1命令

      $ go1.18beta1 version
    • go1.18beta1命令起一个别名

      $ alias go=go1.18beta1
      $ go version

    下面的教程都假设你已经把go1.18beta1命令设置了别名go

为你的代码创建一个目录

首先创建一个目录用于存放你写的代码。

  1. 打开一个命令行终端,切换到你的home目录

    • 在Linux或者Mac上执行如下命令(Linux或者Mac上只需要执行cd就可以进入到home目录)

      cd
    • 在Windows上执行如下命令

      C:\> cd %HOMEPATH%
  2. 在命令行终端,创建一个名为fuzz的目录,并进入该目录

    $ mkdir fuzz
    $ cd fuzz
  3. 创建一个go module

    运行go mod init命令,来给你的项目设置module路径

    $ go mod init example/fuzz

    注意:对于生产代码,你可以根据项目实际情况来指定module路径,如果想了解更多,可以参考Go Module依赖管理

接下来,我们来使用map写一些简单的代码来做字符串的反转,然后使用fuzzing来做模糊测试。

实现一个函数

在这个章节,你需要实现一个函数来对字符串做反转。

编写代码

  1. 打开你的文本编辑器,在fuzz目录下创建一个main.go源文件。

  2. main.go里编写如下代码:

    // maing.go
    package main
    ​
    import "fmt"
    ​
    func Reverse(s string) string {
      b := []byte(s)
      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 string(b)
    }
    ​
    func main() {
      input := "The quick brown fox jumped over the lazy dog"
      rev := Reverse(input)
      doubleRev := Reverse(rev)
      fmt.Printf("original: %q\n", input)
      fmt.Printf("reversed: %q\n", rev)
      fmt.Printf("reversed again: %q\n", doubleRev)
    }

运行代码

main.go所在目录执行命令go run .来运行代码,结果如下:

$ go run .
original: "The quick brown fox jumped over the lazy dog"
reversed: "god
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值