如何处理gosec linter警告:通过变量包含潜在文件

sai*_*pen 6 go

如何从gosec linter解决以下警告:

::warning: Potential file inclusion via variable,MEDIUM,HIGH (gosec)
Run Code Online (Sandbox Code Playgroud)

linter在这个函数的第一行警告我:

func File2lines(filePath string) ([]string, error) {
    f, err := os.Open(filePath) //Warning here
    if err != nil {
        return nil, err
    }
    defer f.Close()
    return linesFromReader(f)
}
Run Code Online (Sandbox Code Playgroud)

我曾尝试阅读本地文件包含,但无法看到这将如何适用.

Ale*_*lex 10

如果使用变量指定文件路径,则可能会指定意外的文件路径。因此,您应该使用filepath.Clean()来清理可能的坏路径。

一个简单的解决方案:

f,err := os.Open(filepath.Clean(fname))
Run Code Online (Sandbox Code Playgroud)


hob*_*bbs 8

没有人说 linter 很聪明。孤立地看该功能,无法判断是否存在安全问题。filePath如果使用用户提供的且未充分验证的a 调用该函数,并且它在可以读取用户否则无法读取的文件的上下文中运行(例如,在具有提升权限的程序中或在远程服务器上) ,那么可能有一个问题。否则,对警告唯一能做的就是抑制或忽略它。


Ken*_*ant 7

路径来自哪里?如果您不确定它永远不会有用户输入,最好在使用前清理它并使用已知的前缀,例如:

filePath = filepath.Join(basePath,filepath.Clean(filePath))
f, err := os.Open(filePath)
Run Code Online (Sandbox Code Playgroud)

这应该可以解决问题.这是一个合理的预防措施,即使您认为它现在是安全的,以防有人将您的功能用于用户数据.