【问题标题】:How to handle gosec linter warning: Potential file inclusion via variable如何处理 gosec linter 警告:通过变量潜在的文件包含
【发布时间】:2019-02-18 14:26:59
【问题描述】:

如何解决来自gosec linter 的以下警告:

::warning: Potential file inclusion via variable,MEDIUM,HIGH (gosec)

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)
}

我已尝试阅读本地文件包含,但看不到这将如何适用于此。

【问题讨论】:

  • 您正试图通过一个可以是动态的变量打开一个文件,即,如果您的应用程序的用户正在提供filePath,那么如果您正在执行一些脚本,您可能会受到影响提到的文件,如果你只是从文件中读取,那么你可以忽略警告,为了摆脱警告硬编码路径。
  • 从任意文件读取也可能很危险——暴露数据、读取触发错误等

标签: go


【解决方案1】:

路径从何而来?如果您不确定它永远不会有用户输入,最好在使用前对其进行清理并使用已知前缀,例如:

filePath = filepath.Join(basePath,filepath.Clean(filePath))
f, err := os.Open(filePath)

这应该可以解决投诉。无论如何,这是一个合理的预防措施,即使您认为它现在是安全的,以防以后有人将您的函数用于用户数据。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      一个简单的解决方案:

      f,err := os.Open(filepath.Clean(fname))
      

      【讨论】:

      • @Dropout 解释添加
      猜你喜欢
      • 2022-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      相关资源
      最近更新 更多