ТЛ;ДР Попросите Cursor исправить ошибку обхода пути, и вы получите path.basename, path.resolve и проверку включения startWith. Это похоже на ответ из учебника. Проверка представляет собой чистую строковую математику. Он никогда не касается диска, поэтому не может сказать, что...
ТЛ;ДР
Попросите Cursor исправить ошибку обхода пути, и вы получите path.basename, path.resolve и проверку включения startWith. Это похоже на ответ из учебника.
Проверка представляет собой чистую строковую математику. Он никогда не касается диска, поэтому не может определить, что файл в каталоге загрузки является символической ссылкой, указывающей на /etc/passwd.
Используйте fs.realpath для проверки содержания, чтобы сравнение проводилось с тем, где на самом деле находится файл, и вообще перестаньте принимать имена файлов от пользователей.
У меня была конечная точка загрузки файла с реальной ошибкой обхода пути. Учебная версия: req.query.file перешел в path.join и вышел с другой стороны в sendFile. Я вставил его в Курсор и попросил исправить обход.
Это вернуло мне ответ, который я бы написал сам. Присвойте базовое имя вводу, разрешите его относительно каталога загрузки, проверьте, что результат все еще начинается с этого каталога, в противном случае отклоните. Четыре строки. Я прочитал, согласился с этим и отправил.
Это все еще CWE-22. Не потому, что исправление небрежное, а потому, что каждая его строка оперирует строкой, а ошибка живет в файловой системе.
Исправление записи курсора
Вот код, близкий к дословному. Это правильно выглядящее исправление, которое останавливает ровно один из двух способов выхода из ситуации.