GoLang untaint URL变量以修复gosec警告G107



如果我在下面的片段上运行gosec,我会收到一个受污染的URL警告:G107 (CWE-88): Potential HTTP request made with variable url (Confidence: MEDIUM, Severity: MEDIUM)

我想我应该使用"url"包,但它似乎没有提供比ParseQuery((更多的功能来检测这一点,但尽管它给出了一个错误,gosec仍然报告为一个潜在的漏洞。

我如何写删除警告,最好只使用标准库?

func Run() {
MakeGetRequest("https://www.google.com/hi?a=7; rm /* -rf")
}
func MakeGetRequest(uri string) {
res, _ := http.Get(uri)
fmt.Println(res)
}

如果您正在使用golangci lint,并且由于无法将url设置为常量而希望它忽略此警告,则可以使用//nolint指令,如下所示:

func Run() {
MakeGetRequest("https://www.google.com/hi?a=7; rm /* -rf")
}
func MakeGetRequest(uri string) {
res, _ := http.Get(uri) //nolint
fmt.Println(res)
}

解决此问题的方法是更改执行请求的函数。不使用http.Get(url),可以使用http.NewRequest(method, url, body)封装请求,因此不会立即执行请求。所以你的最终代码可能是:

func MakeGetRequest(uri string) error{
req, err := http.NewRequest(http.MethodGet, uri, nil) 
if err != nil {
return err
}
res, err := http.DefaultClient.Do(req) 
if err != nil {
return err
}
}

通过此更新,http.NewRequest验证方法和URL,为请求设置上下文,并在必要时提供更大的更改灵活性。

根据G107中提到的指导原则,您应该在const中提到url

package main
import (
"fmt"
"net/http"
)
const url = "url"
func main() {
resp, err := http.Get(url)
if err != nil {
fmt.Println(err)
}
fmt.Println(resp.Status)
}

为了更好地理解,您可以参考此处:https://securego.io/docs/rules/g107.html

如果你想删除G107警告,那么你应该明确排除它。

# Run a specific set of rules
$ gosec -include=G101,G203,G401 ./...
# Run everything except for rule G303
$ gosec -exclude=G303 ./...
# folders and files also can be excluded.

欲了解更多信息,请参阅gosec-docs:https://github.com/securego/gosec

最新更新