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.
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ä.
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
sotkevatpnpm-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 versioon1.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 versioon2.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.