ฉันจะแก้ไขแพ็คเกจ npm ที่มีช่องโหว่ใน package-lock.json ของฉันที่ไม่อยู่ใน package.json ได้อย่างไร


92

Github กำลังบอกฉันว่าการอ้างอิงในไฟล์ package-lock.json ของฉันมีช่องโหว่และล้าสมัย ปัญหาคือถ้าฉันทำnpm installหรือnpm updateไม่อัปเดตการอ้างอิงในไฟล์ package-lock.json

ฉันได้ทำ googling เกี่ยวกับเรื่องนี้หลายอย่างรวมทั้งลบไฟล์และทำเสร็จnpm installแล้ว

หากใครสามารถช่วยแก้ไขปัญหานี้ได้ฉันจะขอบคุณอย่างมาก แพ็คเกจที่เป็นปัญหาคือ Hoek ซึ่งจริงๆแล้วฉันไม่มีในไฟล์ package.json

ขอบคุณมากล่วงหน้า


2
ลองลบ package-lock.json ของคุณแล้วรันการติดตั้ง npm อีกครั้ง
Rishikesh Dhokare

1
คุณสามารถตรวจสอบการอ้างอิงของคุณเพื่อดูว่าอันไหนขึ้นอยู่กับโฮกและอัปเดตอันนั้น (แต่คุณอาจจะโชคไม่ดีและการพึ่งพานั้นไม่มีเวอร์ชันใหม่กว่านี้)
Roland Starke

ฉันอยากจะแนะนำ @RishikeshDhokare
xpto

ฉันทำตามที่ @RishikeshDhokare พูด แก้ปัญหาให้ตัวเอง
melih sahin

คำตอบ:


41

ดูเหมือนว่า Hoek เป็นการพึ่งพาของการอ้างอิงอย่างใดอย่างหนึ่งของคุณ (ดังนั้นแพ็คเกจที่คุณมีใน package.json จึงต้องการจาก package.json ของตัวเอง)

คุณได้ลองลบ / ติดตั้งใหม่และอัปเดตการอ้างอิงโปรเจ็กต์ของคุณแล้ว แต่ไม่ประสบความสำเร็จดังนั้นดูเหมือนว่าการอ้างอิงแพ็กเกจที่เป็นปัญหามีระบุเวอร์ชันที่ชัดเจนหรือสูงสุด

หากไม่เห็น package.json สำหรับการอ้างอิงแต่ละรายการของคุณจะเป็นการยากที่จะแนะนำเพิ่มเติมเกี่ยวกับวิธีบังคับให้อัปเดต

แก้ไข: เพื่อช่วยคุณระบุว่าแพ็คเกจใดใช้การอ้างอิงใดคุณสามารถใช้lsคำสั่งของ NPM : https://docs.npmjs.com/cli/ls

ตัวอย่างเช่นหากต้องการดูว่าแพ็คเกจใดใช้ Hoek: npm ls hoek

แก้ไข 2: ตามที่ Ulysse BN ชี้ให้เห็นอย่างถูกต้องหากคุณมี NPM เวอร์ชัน 6 ขึ้นไปคุณสามารถใช้npm audit fixเพื่อขอให้ NPM พยายามแก้ไขช่องโหว่ให้คุณได้

แก้ไข 3: ผู้ที่อ่านสิ่งนี้ควรตรวจสอบคำตอบของ JBallin ด้านล่าง มันขยายข้อมูลที่ฉันให้ไว้ที่นี่และ (ในความคิดของฉัน) เป็นคำตอบที่มีโครงสร้างมากกว่าซึ่งตอบคำถามของ OP ได้ดีกว่า อย่างไรก็ตาม - หากคุณต้องการการแก้ไขอย่างรวดเร็วคำตอบนี้ก็เพียงพอแล้ว


3
ฉันมีปัญหาคล้ายกันกับแพ็กเกจอื่น (Growl) ฉันเดาว่ามันเป็นเวอร์ชันบางอย่างในตัวฉันpackage.jsonซึ่งขึ้นอยู่กับ Growl เวอร์ชันเฉพาะ (ที่มีช่องโหว่) คำตอบของคุณอยู่บนเส้นทางที่ถูกต้องและคุณอาจจะเล็บมันถ้าคุณสามารถแบ่งปันคำสั่งที่จะแสดงให้เห็นว่าแพคเกจ (s) ในที่ขึ้นอยู่กับคนที่มีช่องโหว่ในการแสดงpackage.json package-lock.json
Fuhrmanator

ดูคำตอบที่อัปเดต หากคุณต้องการความช่วยเหลือเพิ่มเติม - สร้างคำถามใหม่ :)
Alex Mulchinock

ขอบคุณ. เสร็จสิ้น: stackoverflow.com/questions/50764225/…
Fuhrmanator

แน่ใจหรือว่ามีการรับประกันคำถามเพิ่มเติม ดูเหมือนจะซ้ำกัน
JBallin

@JBallin คำตอบของฉันได้รับการอัปเดตหลายครั้งตั้งแต่นั้นมา อาจไม่มีคุณสมบัติเป็นรายการซ้ำเดิม
Alex Mulchinock

25

TLDR: อัปเดตแพ็กเกจหลักโดยใช้npm i $PARENT_PKG_NAME.


บันทึก

เมื่ออัปเดตการอ้างอิงคุณควรตรวจสอบ CHANGELOG เพื่อดูการเปลี่ยนแปลงที่ไม่สมบูรณ์

การวินิจฉัย

npm auditจะเปิดเผยทั้งแพ็กเกจที่มีช่องโหว่ (โปรดทราบว่าคุณจะต้องมีไฟล์ package-lock.json สำหรับสิ่งนี้ดังนั้นคุณจะต้องเรียกใช้npm i) รวมถึงแพ็กเกจที่ต้องพึ่งพา (ถ้ามี) โปรดทราบว่าคุณสามารถใช้ไฟล์npm ls $CHILD_PKG_NAMEเพื่อดูการอ้างอิงระดับบนสุด

ความพยายามแก้ไขด่วน

npm audit fix และ npm audit fix --forceคุ้มค่าที่จะลอง แต่บางครั้งการแก้ไขจะต้องดำเนินการด้วยตนเอง (ดูด้านล่าง)

แก้ไขด้วยตนเอง

เป็นไปได้มากว่าแพ็กเกจหลักจะได้แก้ไขการอ้างอิงแล้ว (คุณสามารถตรวจสอบได้โดยไปที่ GitHub ของพวกเขาและตรวจสอบการคอมมิตล่าสุดหรือเพียงแค่ดูว่าสิ่งนี้แก้ไขได้หรือไม่) ดังนั้นคุณสามารถเรียกใช้ npm i $PARENT_PKG_NAME @$NEW_VERSIONและจะอัปเดตการล็อกแพ็กเกจ .json.

หากผู้ปกครองไม่ได้แก้ไขช่องโหว่

หากผู้ดูแลดูเหมือนจะไม่ตอบสนองคุณอาจลองใช้แพ็คเกจทางเลือกที่ทำสิ่งเดียวกันหรือปลอมแพ็คเกจและอัปเดตช่องโหว่ด้วยตัวเอง

ยืนยันการแก้ไข

ตอนนี้คุณสามารถตรวจสอบได้ว่ามันทำงานได้โดยการเรียกใช้npm auditและตรวจสอบว่าไม่มีช่องโหว่ปรากฏ ยอมรับการเปลี่ยนแปลงของคุณส่งไปที่ GitHub รีเฟรชการแจ้งเตือน / การแจ้งเตือนของคุณและควรจะหายไป!


ในกรณีของฉัน Quick Fix ใช้ไม่ได้ทั้งคู่มือในคำตอบนี้เนื่องจากพาเรนต์เป็นเฟรมเวิร์กที่ในการอัปเดตเปลี่ยน API อย่างสมบูรณ์และกำจัดแม้แต่ไลบรารีนั้น เนื่องจากงาน Fraemwork หลักยังคงใช้ห้องสมุดเก่า อันที่จริงยังคงอยู่ แต่ไม่ได้รับการอัปเดตฉันหมายถึงวิธีดำเนินการ
Carmine Tambascia

1
@CarmineTambascia หากแพคเกจที่คุณใช้ไม่ได้แก้ไขช่องโหว่ (ฉันจะเปิดปัญหา / ประชาสัมพันธ์โดยหวังว่ามันจะได้รับการแก้ไข) - ฉันจะพิจารณาสร้างทางแยกของแพ็คเกจของคุณเองแก้ไขช่องโหว่ใน สถานที่ของบรรจุภัณฑ์ที่ได้รับผลกระทบ
JBallin

มีวิธีอัปเดตแพ็กเกจลูกไหม ในกรณีที่แพคเกจหลักไม่ได้รับการแก้ไขช่องโหว่?
Harshita

@Harshita ดูหัวข้อ "ถ้าผู้ปกครองไม่ได้แก้ไขช่องโหว่"
JBallin

1
@Harshita คุณติดต่อกับพวกเขาหรือยัง? พวกเขาสนใจที่จะแก้ไขช่องโหว่เหล่านั้นด้วยเช่นกัน
JBallin

6

หากคุณมี npm @ 6 ขึ้นไปคุณสามารถใช้npm audit fixสำหรับปัญหาด้านความปลอดภัยของคุณ


1
มีเครื่องมือที่แตกต่างกันมากมายและไม่มีฐานข้อมูลช่องโหว่เหมือนกัน สิ่งที่ฉันพบว่าละเอียดถี่ถ้วนที่สุดคือ Snytch
Ulysse BN

2

ใช้:

npm ฉันโฮก

npm จะติดตั้ง hoek เวอร์ชันล่าสุดและ package.lock.json ของคุณจะได้รับการอัปเดต


2

แก้ไขpackage-lock.jsonด้วยตนเองและอัปเดตเวอร์ชันแพ็กเกจที่มีช่องโหว่เป็นเวอร์ชันคงที่จากนั้นใช้

npm ci

ที่จะติดตั้งแพ็กเกจตามpackage-lock.jsonโดยละเว้นpackage.jsonก่อน จากนั้นใช้

npm audit fix

อีกครั้งเพื่อให้แน่ใจว่าทำถูกต้องหรือไม่ หากไม่ได้ผลให้ใช้วิธีแก้ไขปัญหาอื่น ๆ

ข้อมูลเพิ่มเติมที่นี่:

https://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-reliable

หรือที่นี่: https://docs.npmjs.com/auditing-package-dependencies-for-security-vulnerabilities


วิธีแก้ปัญหาเพิ่มเติมอาจเป็น: npmjs.com/package/npm-check-updates
Lonely

นี่เป็นทางออกทางเลือกที่ดี หากทำสิ่งนี้ภายในแพ็คเกจที่ตั้งใจจะเผยแพร่มันจะไม่ทำงานเนื่องจากไฟล์ package-lock.json ไม่ได้รับการเผยแพร่ แต่สำหรับการใช้แพ็คเกจในเครื่องนี่อาจเป็นทางออกที่ดีที่สุดของnpm audit fixไม่ใช่ตัวเลือก .
rpivovar

1

ในการตรวจสอบแพ็คเกจ npm ที่มีช่องโหว่ให้ใช้คำสั่งต่อไปนี้:

npm audit

ในการแก้ไขแพ็คเกจ npm ที่มีช่องโหว่ให้ใช้คำสั่งต่อไปนี้ซึ่งจะแก้ไข package-lock.json ด้วย:

npm audit fix

0

ฉันมีปัญหานี้และพบว่าเป็นเพราะเซิร์ฟเวอร์ที่ฉันใช้งาน npm มีเวอร์ชันเก่าของ npm อยู่ - package-lock.json ได้รับการสนับสนุนโดยเวอร์ชันที่ใหม่กว่าเท่านั้น


0

คุณไม่ลองนี้ไปที่รากโครงการของคุณลบpackage-lock.jsonไฟล์node_modulesและโฟลเดอร์แล้ว.cachenpm install


-4

หลังจากติดตั้งการอ้างอิงใหม่ให้รันคำสั่งต่อไปนี้เพื่ออัพเดตไฟล์ package-lock.json:

npm update package-lock.json
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.