Как обновить вложенную (уязвимую) зависимость npm?

Github пометил зависимость в моем файле блокировки приложения как уязвимую.

Чтобы исправить это, я должен обновить этот пакет до более новой версии.

Как мне это сделать, если у меня нет контроля над уязвимым пакетом, потому что он вложен в дерево зависимостей?

Прошу прощения, если это очень простой вопрос, но я, кажется, не нашел в этом ничего полезного.


person U r s u s    schedule 15.01.2018    source источник
comment
Отвечает ли это на ваш вопрос? Как мне исправить уязвимый пакет npm в моем package-lock.json, которого нет в package.json?   -  person JBallin    schedule 01.02.2020
comment
npmjs.com/package/npm-force-resolutions или npm shrinkwrap. в основном они делают то же самое, но первый более удобен в использовании.   -  person Paolo    schedule 09.02.2021


Ответы (4)


Вы правы - уязвимый пакет находится в одной из ваших зависимостей, например:

Your Package -> Dependency -> Vulnerable package

Вы не сможете обновить зависимости зависимостей таким образом, чтобы выжить в будущем npm install или yarn.

Однако вы можете использовать следующие подходы:

  • Ошибка сопровождающего: попросите его обновить свои зависимости и поднять версии. Это решит проблему для вас и ваших коллег, которые зависят от этого пакета.
  • Есть ли альтернативные пакеты? Возможно, вы можете использовать другой пакет вместо уязвимого. Это потребует некоторых обновлений вашего кода, но может быть лучшим подходом в долгосрочной перспективе, особенно если исходный сопровождающий не отвечает.
  • Исправьте сами: разветвите репозиторий и обновите зависимость в этой копии. Затем вы можете обратиться к пакету в своем package.json.

См. этот ответ для получения дополнительной информации об установке непосредственно из репозиториев Github.

Такой подход решит проблему в краткосрочной перспективе, но не рекомендуется, так как вы не получите никакой выгоды от исправлений ошибок, сделанных сопровождающим, и, кроме того, к тому времени, когда вы это сделаете, зависимость может иметь все равно обновлялся!

person Tom Hallam    schedule 15.01.2018

Я думаю, что есть способ (потенциально) достичь этого с помощью флага depth.

предостережение 1: официальная документация по обновлению npm советует использовать глубину 9999 для рекурсивной проверки всех зависимостей. Но в моей настройке это либо приводит к ошибке, либо к зависанию npm. Поэтому я использую реалистичную глубину 1 или 2 (по умолчанию 0, что означает только прямые зависимости)

ОБНОВЛЕНИЕ. См. комментарий Майка ниже. Параметр глубины больше не поддерживается; npm update <name> теперь обновит все экземпляры name в дереве, за исключением связанного или свернутого дерева.

Так что это все равно должно работать:

npm update vulnerable_package

предостережение: это работает, только если доступна обновленная версия вложенного пакета (с исправлением уязвимости), которая все еще соответствует диапазону версий вашей зависимости. Итак, если это ваше дерево зависимостей:

Your Package -> Dependency@^1.0.0 -> Vulnerable_package@^2.1.0

И исправление уязвимости находится в Vulnerable_package версии 3.0.0, тогда оно не сработает, поскольку обновление npm обновит только самую высокую версию, которая все еще соответствует диапазону версий вашей зависимости. (в данном случае высшая версия 2.x.x)

person gijswijs    schedule 09.10.2020
comment
npm WARN update Опция --depth больше не действует. См. RFC0019. - person mike; 06.03.2021

Как объяснено здесь: https://stackoverflow.com/a/17423915, вы можете использовать npm shrinkwrap, чтобы явно указать npm, чтобы получить вложенный версия зависимости, которую вы хотите.

person Julien    schedule 29.05.2020

Первая команда обновления
npm install -g npm

затем, чтобы удалить уязвимые

исправление аудита npm --force

person Krishna Kumar Singh    schedule 31.07.2018
comment
Это может привести к нарушению пользовательского интерфейса, поскольку опция принудительной установки игнорирует предупреждения SEMVER. - person Rice; 17.01.2019
comment
В моем случае проблем не возникло. - person Krishna Kumar Singh; 13.08.2019
comment
тебе повезло - person Paolo; 09.02.2021