
Installer en toute sécurité des paquets NPM
Un installateur npm axé sur la sécurité qui protège vos projets contre les paquets récemment compromis.
Les attaques sur la chaîne d'approvisionnement des paquets npm constituent une menace croissante. Les attaquants compromettent parfois des paquets légitimes en :
Ces attaques se produisent souvent soudainement — un paquet qui était sûr hier peut être compromis aujourd'hui. safe-npm vous protège en n'installant que les versions de paquets qui ont été disponibles publiquement pendant une durée minimale (90 jours par défaut). Cela donne à la communauté de sécurité le temps de découvrir et de signaler les versions malveillantes avant qu'elles n'atteignent votre projet.
Lorsque vous exécutez safe-npm install, il :
package.json ou les arguments de la ligne de commandePar exemple, si vous spécifiez react@^18 et qu'un [email protected] malveillant a été publié hier, safe-npm installera à la place la version la plus récente qui a au moins 90 jours.
# Install globally
npm install -g @dendronhq/safe-npm
# Now you can use it anywhere
safe-npm install
# Clone and build
git clone <repository-url>
cd safe-npm
npm install
npm run build
# Link the binary globally
npm link
# Use the minimum age of 90 days (default)
safe-npm install
# Or specify your own minimum age
safe-npm install --min-age-days 120
# Install packages directly with version constraints
safe-npm install react@^18 lodash@^4.17.0
# These will be filtered to only use versions at least 90 days old
safe-npm install express --min-age-days 60
# Preview which versions would be installed without actually installing
safe-npm install --dry-run
--min-age-days <n>Valeur par défaut : 90
Le nombre minimum de jours pendant lesquels une version de paquet doit avoir été publiée avant de pouvoir être installée.
Exemple : --min-age-days 120 exige que les paquets aient au moins 4 mois.
Quand ajuster :
--ignore <pkg1,pkg2>Une liste séparée par des virgules de paquets qui contournent l'exigence d'âge. Ces paquets respecteront toujours les plages semver mais ignoreront l'âge minimum.
Exemple : --ignore typescript,@types/node
Quand utiliser :
--strictSe termine par une erreur si UNE QUELCONQUE dépendance ne peut pas être résolue en une version satisfaisant l'exigence d'âge.
Exemple : safe-npm install --strict
Quand utiliser :
--dev / --prod-onlyContrôle les dépendances de package.json qui sont traitées.
Exemples :
safe-npm install --dev - N'installer que les devDependenciessafe-npm install --prod-only - N'installer que les dépendances de productionQuand utiliser :
--strategy <direct|overrides>Valeur par défaut : direct
Comment safe-npm installe les versions résolues :
direct - Installe directement les versions résolues en utilisant npm install package@version
overrides - Écrit les versions résolues dans le champ overrides de package.json, puis exécute npm install
--registry <url>Valeur par défaut : https://registry.npmjs.org
Spécifiez un registre npm alternatif.
Exemple : --registry https://registry.company.com
Quand utiliser :
--dry-runAffiche ce qui serait installé sans faire de modifications.
Exemple : safe-npm install --dry-run
Quand utiliser :
# Create a new project
mkdir my-project && cd my-project
npm init -y
# Install dependencies safely
safe-npm install express@^4 lodash
# This creates package-lock.json with versions at least 90 days old
# Check what versions would be installed with age requirements
safe-npm install --dry-run
# If you're happy, install them
safe-npm install
# In your CI pipeline, fail the build if any package can't meet age requirements
safe-npm install --strict --min-age-days 120
# Or allow newer packages for dev dependencies only
safe-npm install --prod-only --strict
# Need to urgently update a specific package? Add it to ignore list
safe-npm install --ignore package-with-critical-fix
Le projet inclut une suite de tests que vous pouvez exécuter :
npm test
Pour les tests automatisés, vous pouvez simuler les réponses du registre en utilisant des fixtures :
export SAFE_NPM_FIXTURES=/path/to/fixtures.json
safe-npm install
Le fichier de fixtures doit contenir du JSON qui reflète les réponses du registre npm pour chaque paquet.
Scénario réel :
popular-lib est maintenu par un développeur de confiance[email protected] avec un logiciel malveillant^5.0.0 installeraient immédiatement la version malveillante4.9.0 (la version la plus récente datant de plus de 90 jours)La sécurité repose sur des compromis. safe-npm échange les mises à jour de pointe contre une protection contre les compromissions soudaines de la chaîne d'approvisionnement. C'est une couche dans une stratégie de défense en profondeur qui devrait également inclure :
npm audit)ISC