如何从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)
没有人说 linter 很聪明。孤立地看该功能,无法判断是否存在安全问题。filePath
如果使用用户提供的且未充分验证的a 调用该函数,并且它在可以读取用户否则无法读取的文件的上下文中运行(例如,在具有提升权限的程序中或在远程服务器上) ,那么可能有一个问题。否则,对警告唯一能做的就是抑制或忽略它。
路径来自哪里?如果您不确定它永远不会有用户输入,最好在使用前清理它并使用已知的前缀,例如:
filePath = filepath.Join(basePath,filepath.Clean(filePath))
f, err := os.Open(filePath)
Run Code Online (Sandbox Code Playgroud)
这应该可以解决问题.这是一个合理的预防措施,即使您认为它现在是安全的,以防有人将您的功能用于用户数据.