Как обработать предупреждение gosec linter: возможное включение файла через переменную

Как устранить следующее предупреждение от линтера госек:

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

Линтер предупреждает меня в первой строке этой функции:

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, вы можете пострадать, если выполняете некоторые сценарии из указанного файла, если вы просто читаете из файла , то вы можете проигнорировать предупреждение, чтобы избавиться от него, жестко запрограммировав путь.

nilsocket 13.09.2018 22:32

Чтение из произвольных файлов также может быть опасным - раскрытие данных, запуск ошибок чтения и т. д.

Kenny Grant 16.10.2018 20:53
14
2
7 243
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Никто не сказал, что линтер был умный. Глядя на функцию изолированно, невозможно сказать, есть ли проблема с безопасностью. Если функция вызывается с помощью filePath, предоставленного пользователем и недостаточно проверенного, а также, она запускается в контексте, где она может читать файлы, которые пользователь не смог бы в противном случае (например, в программе с повышенными привилегиями или на удаленном сервере ), тогда, вероятно, проблема. В противном случае единственное, что можно сделать с предупреждением, - это подавить или проигнорировать его.

Ответ принят как подходящий

Откуда идет путь? Если вы не совсем уверены, что пользователь никогда не сможет его ввести, лучше очистить его перед использованием и использовать известный префикс, например:

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

Это должно исправить жалобу. В любом случае это разумная мера предосторожности, даже если вы думаете, что сейчас это безопасно, на случай, если позже кто-то воспользуется вашей функцией с пользовательскими данными.

Если вы укажете путь к файлу с помощью переменной, существует риск того, что будет указан непредусмотренный путь к файлу. Следовательно, вы должны использовать filepath.Clean() для очистки возможных плохих путей.

простое решение:

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

Добавлено объяснение @Dropout

Tomari 30.06.2020 06:34

Другие вопросы по теме