• pnpm
  • turvallisuus
  • riippuvuudet
  • npm
  • lanka

Päivitä transitiiviset riippuvuudet PNPM: Korjaa tietoturva-aukot rikkomatta asioita

Tietoturva-aukkojen korjaaminen voi olla turhauttavaa erityisesti, kun se koskee transitiivisia riippuvuuksia. Opi, kuinka päivittää niitä vaikuttamatta suoriin riippuvuuksiisi.

Gao
Gao
Founder

Nykyään tietoturva-aukot ovat yleinen ongelma ohjelmistokehityksessä. Onneksi meillä on työkaluja, kuten GitHub Dependabot, jotka auttavat pitämään riippuvuudet ajan tasalla automatisoidulla tunnistamisella ja vetopyynnöillä.

Dependabot

Kuitenkaan ne eivät aina toimi odotetusti. Koska jotkut riippuvuudet ovat transitiivisia, niiden päivittäminen voi olla hankala tehtävä näille työkaluille, koska ne eivät tiedä muutosten vaikuttavuudesta ja siitä, mitä päätöstä tehdä ristiriitatilanteissa. Meidän on käsiteltävä nämä tapaukset manuaalisesti.

Menetelmät, jotka eivät toimi

  • Viralliset komennot kuten pnpm up sotkevat pnpm-lock.yaml -tiedostosi. Tästä on ongelma, joka on vielä avoinna kirjoitushetkellä.
  • Asenna suoran riippuvuuden uusin versio, joka sisältää kohteen transitiivisen riippuvuuden. Tämä ei ehkä toimi. Jos suora riippuvuus ei päivittänyt version määrityksiä, transitiivista riippuvuutta ei päivitetä, koska se on ratkaistu ja lukittu pnpm-lock.yaml -tiedostossa.

Ratkaisu

overrides-kenttä on tehokas ominaisuus PNPM:ssä, jonka avulla voit ohittaa joitakin version ratkaisuja. Käytämme tätä ominaisuutta transitiivisten riippuvuuksien päivittämiseen ja muutoksen tekemiseen mahdollisimman vähäiseksi.

Käytetäänpä yllä olevaa Dependabot-hälytystä esimerkkinä. Se kertoo meille, että follow-redirects-paketissa on tietoturva-aukko, ja korjattu versio on 1.15.6. Kuitenkin suora riippuvuus gatsby käyttää axios, joka riippuu [email protected].

Vaihe 1: Etsi transitiivinen riippuvuus

On monia tapoja löytää transitiivinen riippuvuus, mutta suosittelen yksinkertaisinta tapaa: hae pnpm-lock.yaml -tiedostosta.

Entä "pnpm why"?

Komento pnpm why <paketti> on itse asiassa hyödyllinen. Se voi kuitenkin aiheuttaa sekaannusta tässä tapauksessa. Kun suoritan pnpm why follow-redirects, tässä on osa tulosteesta:

Itse asiassa pnpm-lock.yaml -tiedostossa on vain yksi resoluutio follow-redirects varten. pnpm why komento saattaa näyttää useita polkuja, jotka riippuvat samasta paketin versiosta.

Vaihe 2: Lisää ohitukset

Helpoin tapaus on, että pnpm-lock.yaml -tiedostossa on vain yksi resoluutio. Voit lisätä ohituksen suoraan package.json -tiedostoon:

Jos olet työtilassa, sinun tulee lisätä ohitus työtilan juuren package.json -tiedostoon.

Vaihe 3: Sovella muutokset

Suorita pnpm install soveltaaksesi muutokset. Näemme, että follow-redirects-paketti on päivitetty versioon 1.15.6 pnpm-lock.yaml -tiedostossa vähäisin muutoksin.

Nyt voit poistaa overrides-kentän package.json -tiedostosta pitääksesi sen siistinä. Sitten suorita pnpm install uudelleen varmistaaksesi, että muutokset voidaan soveltaa ilman overrides-kenttää.

Vianmääritys

Yllä olevat vaiheet ovat ihannetapauksessa. Asiat eivät aina mene odotetusti. Tässä muutamia vinkkejä vianmääritykseen:

Versio palautettiin ohituksen poistamisen jälkeen

Tämä voi tapahtua, kun riippuvaisessa paketissa on kiinteä versio tai alue, joka ei sisällä kohdeversiota. Tarkista riippuvaisen paketin, tässä tapauksessa axios, package.json -tiedosto nähdäksesi, koskeeko tämä tapaus sinua.

Jos näin on, sinun täytyy pitää overrides-kenttä package.json -tiedostossa, kunnes riippuvainen paketti päivittää versiomäärittelyt.

Transitiiviselle riippuvuudelle on useita resoluutioita

Kun projekti kasvaa, pnpm-lock.yaml -tiedosto voi kellua useilla resoluutioilla samalle paketille. Esimerkiksi voi olla kaksi merkittävää versiota samasta foo-paketista:

Tietoturvaraportti osoittaa, että [email protected] sisältää tietoturvaongelman, joka on korjattu versiossa 1.0.1, ja [email protected] ei ole vaikuttanut. Emme voisi yksinkertaisesti lisätä ohitusta foo:

  • Jos lisäämme ohituksen "foo": "^1.0.1", [email protected] alennetaan versioon 1.0.1. Tämä voi rikkoa projektin, koska [email protected] saattaa sisältää joitakin uusia ominaisuuksia, joita käytetään riippuvaisissa paketeissa.
  • Jos lisäämme ohituksen "foo": "^2.0.0", [email protected] päivitetään versioon 2.0.0. Tämä voi rikkoa projektin, koska [email protected] saattaa sisältää joitakin rikkovia muutoksia.

Oletetaan, että foo noudattaa Semanttista versiointia, voimme lisätä ohituksen näin:

Tämä päivittää vain [email protected] versioon 1.0.1 ja pitää [email protected] muuttumattomana.

Lopuksi

Ennen kuin PNPM tukee transitiivisten riippuvuuksien suoraa päivittämistä, overrides-kenttä on hyvä kiertotie korjata tietoturva-aukot rikkomatta asioita. Toivottavasti tämä artikkeli auttaa sinua käsittelemään näitä tapauksia tehokkaammin. Logtossa käytämme tätä menetelmää pitääksemme riippuvuudet ajan tasalla ja turvattuina.