- Hầu hết các sự cố với npm đều bắt nguồn từ các vấn đề cấu hình môi trường như chính sách thực thi và quyền hạn, chứ không phải từ chính npm.
- Cài đặt xác định với
npm civà sử dụng cẩn thậnnpm auditGiảm thiểu rủi ro về chuỗi cung ứng và tính dễ bị tổn thương. - Tránh
sudo npmViệc giảm thiểu các phụ thuộc không cần thiết và sử dụng tiền tố cấp người dùng giúp cho việc cài đặt toàn cục an toàn và ổn định hơn. - Việc ghi nhật ký chi tiết, sử dụng npm doctor và thỉnh thoảng cài đặt lại sạch sẽ là những công cụ thiết yếu để chẩn đoán và giải quyết các lỗi npm khó khắc phục.

Gặp phải những sự cố kỳ lạ với npm có thể vô cùng khó chịu, đặc biệt khi tất cả những gì bạn muốn chỉ là cài đặt một gói và quay lại lập trình. Từ việc PowerShell chặn các tập lệnh trên Windows, đến những cơn ác mộng về quyền truy cập trên Linux, cho đến danh sách các lỗ hổng bảo mật bất tận trong báo cáo kiểm tra của bạn, các lỗi npm có thể nhanh chóng leo thang thành hàng giờ làm việc bị gián đoạn nếu bạn không biết mình đang xem xét điều gì.
Hướng dẫn này sẽ giúp bạn giải quyết những sự cố thường gặp nhất khi sử dụng npm, giải thích lý do tại sao chúng xảy ra và cung cấp các giải pháp thực tế, đã được kiểm chứng. Chúng ta sẽ xem xét các chính sách thực thi của Windows, lỗi quyền truy cập toàn cục, các lỗ hổng bảo mật trong hệ sinh thái npm, sự khác biệt giữa các lỗ hổng bảo mật trong môi trường phát triển và sản xuất, v.v. npm ci Thực sự là vậy, và làm thế nào để gỡ lỗi các cài đặt bị lỗi và sự cố bộ nhớ cache mà không cần hoảng loạn.
Chính sách thực thi PowerShell chặn npm trên Windows
Một trong những trở ngại đầu tiên mà nhiều người dùng Windows gặp phải sau khi cài đặt Node.js là npm không chịu chạy trong PowerShell. Cửa sổ dòng lệnh báo lỗi tương tự như "không thể tải tệp". C:\Program Files\nodejs\npm.ps1 vì việc chạy tập lệnh đã bị vô hiệu hóa trên hệ thống này”, cùng với một PSSecurityException và một gợi ý để đọc about_Execution_Policies.
Vấn đề này không liên quan gì đến việc cài đặt Node.js bị lỗi; mà là một tính năng bảo mật của PowerShell được gọi là chính sách thực thi. Theo mặc định, một số thiết lập Windows ngăn chặn việc chạy bất kỳ tập lệnh cục bộ nào (bao gồm cả trình bao bọc PowerShell của npm), điều này khiến PowerShell xử lý vấn đề như thế nào. npm.ps1 là nội dung có khả năng không an toàn.
Để khắc phục điều này, thông thường bạn cần nới lỏng chính sách thực thi PowerShell cho người dùng hiện tại, thay vì vô hiệu hóa hoàn toàn bảo mật ở cấp hệ thống. Một cách tiếp cận phổ biến là chạy PowerShell với quyền quản trị viên và sử dụng một lệnh như sau: Set-ExecutionPolicy RemoteSigned -Scope CurrentUserĐiều này cho phép tạo các tập lệnh cục bộ trong khi vẫn chặn các tập lệnh từ xa chưa được ký.
Nếu bạn không muốn thay đổi chính sách PowerShell, bạn có thể khắc phục sự cố bằng cách sử dụng Command Prompt (cmd.exe) hoặc Windows Terminal với một shell khác. Trong những môi trường đó, npm không thông qua tập lệnh PowerShell, vì vậy hạn chế đó không áp dụng và... npm Các lệnh sẽ chạy miễn là Node.js được thêm đúng vào biến môi trường PATH.
npm ci thực sự làm gì và tại sao điều đó lại quan trọng
Sau khi npm đang chạy, một lệnh khác thường gây thắc mắc là: npm ci, có cách hoạt động khác với những cái quen thuộc hơn. npm install. Cả hai đều cài đặt các thư viện phụ thuộc, npm ci Được thiết kế đặc biệt cho các môi trường sạch sẽ, có thể tái tạo được như các quy trình tích hợp liên tục (CI).
Sự khác biệt chính là npm ci bỏ qua phạm vi phiên bản trong package.json và cài đặt chính xác các phiên bản đã được ghim trong package-lock.json. Điều đó có nghĩa là sẽ không có phiên bản phụ thuộc "tương thích nhưng mới hơn" nào lọt vào bản dựng của bạn chỉ vì chúng được phát hành sau; mọi quá trình cài đặt đều được xác định rõ ràng miễn là tệp khóa vẫn giữ nguyên.
Từ góc độ hiệu suất, npm ci Phương pháp này thường nhanh hơn đối với CI vì nó bỏ qua một số bước giải quyết phụ thuộc và giả định trạng thái ban đầu là sạch. Nó mong đợi rằng bạn node_modules Thư mục đó hoặc trống hoặc sẽ bị xóa, điều này cho phép npm tránh được rất nhiều bước kiểm tra và cập nhật bổ sung. npm install thường sẽ thực hiện.
Từ góc độ an ninh và chuỗi cung ứng, npm ci Giảm đáng kể nguy cơ các thay đổi phụ thuộc chưa được xem xét lọt vào bản dựng sản phẩm của bạn. Vì nó không bao giờ tìm kiếm các phiên bản tương thích mới hơn, nên về cơ bản bạn đang cố định cây phụ thuộc của mình ở những gì nhóm của bạn đã khóa và kiểm tra, giúp việc tái tạo sự cố và phân tích lỗ hổng dễ dàng hơn nhiều.
Các nhóm tập trung vào bảo mật thường kết hợp với nhau. npm ci với các công cụ quét phụ thuộc tự động kiểm tra mọi gói, bao gồm cả những gói bị khóa. package-lock.json tập tin. Bằng cách đó, ngay cả khi tệp khóa của bạn sạch sẽ khi được cam kết, các lỗ hổng mới được phát hiện hoặc các gói độc hại vẫn có thể bị phát hiện trong quá trình xây dựng CI trước khi ứng dụng được triển khai.
Quyền hạn npm toàn cục và quy tắc "không bao giờ sử dụng sudo npm"
Trên các hệ thống giống Unix (Linux, macOS), một trong những loại sự cố npm khét tiếng nhất xuất phát từ việc cài đặt các gói toàn cục với quyền quản trị cao. Nếu bạn đã từng thấy những cảnh báo như “Thiếu quyền ghi vào” /usr/lib/node_modules” hoặc các lỗi như EACCES: permission deniedBạn đã gặp phải loại vấn đề này.
Theo mặc định, npm thường cố gắng đặt các gói được cài đặt toàn cục vào thư mục [tên thư mục]. /usr (ví dụ /usr/lib/node_modules và các tệp thực thi trong /usr/bin), đó là các thư mục hệ thống thường thuộc sở hữu của người dùng root. Khi người dùng bắt đầu chạy sudo npm install -g ... Để "khắc phục" lỗi quyền truy cập, các tập tin và thư mục sẽ được chuyển quyền sở hữu cho người dùng root, khiến các lệnh chạy sau đó với tư cách người dùng thông thường gặp sự cố về quyền ghi.
Tóm lại rất đơn giản: đừng chạy npm với quyền root và tránh sử dụng... sudo Hãy sử dụng npm trừ khi bạn hoàn toàn chắc chắn về những gì mình đang làm. Bên cạnh sự hỗn loạn về quyền truy cập, việc cài đặt JavaScript của bên thứ ba với quyền root cũng làm tăng tác động của bất kỳ gói phần mềm độc hại hoặc bị xâm nhập nào, cho phép nó kiểm soát hoàn toàn hệ thống của bạn.
Để kiểm tra xem npm hiện đang đặt các gói toàn cục ở đâu, bạn có thể chạy lệnh sau: npm config get prefix, và thường sẽ trả về kết quả tương tự như sau: /usr trên một cấu hình có vấn đề. Tiền tố đó xác định vị trí lưu trữ của các mô-đun toàn cục và các tệp nhị phân của chúng, vì vậy nếu tiền tố trỏ đến một đường dẫn hệ thống, thì các vấn đề về quyền truy cập gần như là không thể tránh khỏi về lâu dài.
Một giải pháp an toàn và được khuyến nghị là di chuyển tiền tố npm toàn cục vào thư mục chính của người dùng, nơi bạn có toàn quyền kiểm soát mà không cần quyền quản trị. Một kiểu mẫu điển hình là tạo một thư mục như sau: ~/.npm-global và sau đó chạy npm config set prefix '~/.npm-global' để tất cả các lượt cài đặt toàn cầu trong tương lai đều được thực hiện ở đó thay vì ở nơi khác. /usr.
Sau khi thay đổi tiền tố, bạn phải thêm thư mục chứa các tệp nhị phân toàn cục mới vào biến môi trường PATH để hệ thống có thể tìm thấy các lệnh đã được cài đặt toàn cục. Ví dụ, bạn có thể thêm một dòng như sau: export PATH=~/.npm-global/bin:$PATH vào tệp khởi động shell của bạn (chẳng hạn như ~/.bashrc or ~/.zshrc), sau đó khởi động lại thiết bị đầu cuối để thay đổi có hiệu lực.
Sau khi cấu hình chính xác, hãy chạy lại npm doctor trở thành một bước kiểm tra hợp lý tốt: nó sẽ báo cáo rằng các tệp được lưu vào bộ nhớ cache và toàn cục node_modules Có thể đọc và ghi bởi người dùng hiện tại của bạn. Lưu ý rằng khi bạn chuyển sang thư mục toàn cục mới, các gói toàn cục đã cài đặt trước đó sẽ không còn tồn tại và bạn cần cài đặt lại những gói mà bạn thực sự sử dụng.
Sử dụng npm doctor để chẩn đoán các vấn đề về môi trường.
Nhiều vấn đề rắc rối với npm không phải do một dự án cụ thể nào gây ra mà là do môi trường npm bị lỗi hoặc không ổn định trên máy tính của bạn. Lệnh npm doctor Nó được xây dựng chính xác cho mục đích này: nó chạy một loạt các kiểm tra sức khỏe trên thiết lập npm của bạn và làm nổi bật các vấn đề tiềm ẩn.
Khi bạn thực hiện npm doctornpm kiểm tra kết nối đến registry, xác minh phiên bản npm và Node.js của bạn, kiểm tra URL registry đã cấu hình và kiểm tra quyền truy cập vào các thư mục cache và thư mục module toàn cục. Mỗi lần kiểm tra đều được báo cáo với trạng thái "ok" hoặc "notOk", giúp dễ dàng phát hiện các lỗi cấu hình.
Ví dụ, nếu npm phát hiện các thư mục như... /usr/lib/node_modules or /root/.npm Nếu người dùng thông thường không thể ghi vào các tệp này, bạn sẽ thấy các mục liên quan đến quyền được đánh dấu là “notOk” màu đỏ. Đó là một dấu hiệu mạnh mẽ cho thấy npm trước đây đã được chạy với quyền root hoặc thông qua sudo, để lại các tập tin thuộc sở hữu của người dùng root, gây cản trở hoạt động bình thường.
Lệnh doctor cũng có thể phát hiện các công cụ bị thiếu mà npm yêu cầu, chẳng hạn như Git, vốn cần thiết cho một số thư viện phụ thuộc sử dụng URL Git thay vì các gói đăng ký đã được công bố. Nếu Git chưa được cài đặt hoặc không có trong biến môi trường PATH, bạn sẽ thấy cảnh báo yêu cầu bạn cài đặt nó và thử lại.
Sau khi khắc phục mọi vấn đề. npm doctor Theo báo cáo, chạy lại lệnh sẽ hiển thị tất cả các trạng thái "ok" màu xanh lá cây, cho thấy quá trình cài đặt npm diễn ra suôn sẻ. Hãy coi lệnh này như một bước kiểm tra sức khỏe cơ bản bất cứ khi nào bạn nghi ngờ cấu hình npm toàn hệ thống có thể là nguyên nhân gây ra các lỗi bất thường mà bạn gặp phải trong quá trình cài đặt hoặc kiểm tra.
Hệ sinh thái npm dễ bị tổn thương đến mức nào: những sự cố và rủi ro nổi tiếng
Ngoài các vấn đề cấu hình cục bộ, điều quan trọng là phải hiểu rằng npm với tư cách là một hệ sinh thái cũng có những rủi ro về cấu trúc, xuất phát từ các cây phụ thuộc khổng lồ và phần lớn là những người duy trì tình nguyện. Các dự án JavaScript hiện đại thường sử dụng hàng trăm, thậm chí hàng nghìn gói, trong đó nhiều gói được duy trì bởi chỉ một hoặc hai người trong thời gian rảnh rỗi.
Sự phân mảnh cực độ này khiến việc xem xét thủ công mọi thứ cuối cùng trong hồ sơ ứng tuyển trở nên gần như bất khả thi, điều này mở ra cơ hội cho... các cuộc tấn công chuỗi cung ứng vào npm và những điểm yếu tinh vi. Chỉ một gói phần mềm bị lỗi hoặc bị bỏ rơi cũng có thể gây ra hiệu ứng dây chuyền lan truyền khắp sơ đồ phụ thuộc và ảnh hưởng đến một số lượng lớn dự án mà các nhà phát triển không hề nhận ra ngay lập tức.
Một ví dụ điển hình về sự mong manh này là sự cố năm 2016 liên quan đến một gói hàng nhỏ có tên gọi là... left-pad, bao gồm khoảng 11 dòng mã. Mục đích duy nhất của nó là thêm ký tự vào bên trái chuỗi cho đến khi đạt đến độ dài nhất định, thế nhưng nó lại được sử dụng trực tiếp và gián tiếp bởi vô số gói phần mềm và công cụ quan trọng như trình biên dịch JavaScript Babel.
Sau một cuộc tranh chấp giữa tác giả và npm, người duy trì dự án đã quyết định gỡ bỏ một số gói của ông, bao gồm cả... left-pad, từ sổ đăng ký. Vì npm không lưu giữ các bản sao lưu bất biến của các phiên bản đã xuất bản vào thời điểm đó, việc gỡ bỏ ngay lập tức làm hỏng các bản dựng trên toàn thế giới phụ thuộc vào chính xác các phiên bản đó, khiến các nhà phát triển gặp khó khăn với các cài đặt bị lỗi.
Trong một động thái chưa từng có tiền lệ, npm Inc. đã khôi phục phiên bản cuối cùng được biết đến của left-pad Họ tự mình thực hiện, mà không có sự đồng ý của tác giả, để khôi phục lại hệ sinh thái. Quyết định đó gây tranh cãi vì nó mâu thuẫn với quan điểm cho rằng các tác giả kiểm soát vòng đời của các gói phần mềm của họ, nhưng nó cũng làm nổi bật việc cơ sở hạ tầng quan trọng đã phụ thuộc nhiều vào các mô-đun bên thứ ba tầm thường như thế nào.
Bên cạnh các sự cố về tính khả dụng, đã có nhiều trường hợp tập trung vào bảo mật, trong đó các gói npm phổ biến bị xâm phạm hoặc được phát hiện chứa các lỗ hổng nghiêm trọng. Những trường hợp này bao gồm việc người bảo trì bị tấn công bằng kỹ thuật xã hội, quyền sở hữu các gói phần mềm bị bỏ rơi bị chiếm đoạt, hoặc các lỗi nhỏ tinh vi bị khai thác để thực thi mã tùy ý.
Một ví dụ được thảo luận rộng rãi là năm 2018. event-stream Vụ xâm nhập, trong đó kẻ tấn công đã giành quyền kiểm soát một tiện ích phát trực tuyến phổ biến và chèn mã nhằm mục đích đánh cắp tiền điện tử từ các ứng dụng bị ảnh hưởng. Bởi vì event-stream Vì nó là một thành phần phụ thuộc trong nhiều gói phần mềm khác, mã độc đã lan truyền âm thầm thông qua chuỗi phụ thuộc vào hệ thống sản xuất.
Một trường hợp khác là lỗ hổng tấn công chèn lệnh năm 2019 trong coa, một công cụ hỗ trợ giao diện dòng lệnh (CLI) được sử dụng bởi nhiều công cụ nổi tiếng. Trong một số điều kiện nhất định, dữ liệu đầu vào của người dùng không được xử lý đúng cách có thể bị chuyển đổi thành các lệnh shell tùy ý, mở ra khả năng thực thi từ xa nếu lỗ hổng được kích hoạt trong một ngữ cảnh dễ bị tổn thương.
Các thư viện nổi tiếng như axios Chúng cũng có những lỗ hổng bảo mật, chẳng hạn như vấn đề giả mạo yêu cầu phía máy chủ (SSRF) cho phép kẻ tấn công chuyển hướng máy chủ để thực hiện các yêu cầu đến các tài nguyên nội bộ. Ngay cả những tiện ích cực kỳ phổ biến như minimist Chúng bị ảnh hưởng bởi các lỗi làm ô nhiễm nguyên mẫu, cho phép kẻ tấn công can thiệp vào các nguyên mẫu đối tượng và có khả năng thay đổi hành vi của ứng dụng theo những cách tinh vi và nguy hiểm.
Bài học chính là ngay cả những gói phần mềm rất phổ biến hoặc tưởng chừng vô hại cũng không tự động an toàn; chúng có thể bị khai thác, bị bỏ rơi hoặc bị cấu hình sai như bất kỳ phần mềm nào khác. Đây là lý do tại sao một tư thế bảo mật lành mạnh xung quanh npm đòi hỏi cả các công cụ kỹ thuật (kiểm tra, quét, khóa) và các thói quen văn hóa (cập nhật thường xuyên, lựa chọn phụ thuộc cẩn thận và ưu tiên tự viết các tiện ích đơn giản khi có thể).
Các lỗ hổng bảo mật trong môi trường phát triển so với môi trường sản xuất
Khi các nhà phát triển chạy lần đầu tiên npm audit Trong một dự án, danh sách dài các lỗ hổng bảo mật có thể trông đáng sợ, nhưng không phải tất cả chúng đều ảnh hưởng đến ứng dụng đang hoạt động trong môi trường sản xuất. Nhiều vấn đề được báo cáo nằm ở các công cụ chỉ được sử dụng trong quá trình phát triển hoặc biên dịch.
Sự khác biệt chính nằm ở các phần phụ thuộc được khai báo dưới dependencies và những người dưới devDependencies in package.json. Gói trong devDependencies Thông thường, chúng chỉ cần thiết cho các tác vụ như đóng gói, biên dịch, kiểm tra cú pháp hoặc chạy máy chủ thử nghiệm, và chúng không được dùng để đưa vào gói sản phẩm cuối cùng hoặc môi trường chạy máy chủ.
Ví dụ, các lỗ hổng trong các công cụ như webpack-dev-server, @angular-devkit, hoặc là vite Những vấn đề này thường chỉ quan trọng trong quá trình phát triển cục bộ, chứ không phải sau khi bản dựng sản phẩm được triển khai. Các máy chủ phát triển và công cụ xây dựng này có thể tạo ra các lỗ hổng bảo mật như rò rỉ mã nguồn từ nguồn khác hoặc hành vi tương tự SSRF, nhưng chỉ khi máy chủ phát triển đang hoạt động và có thể truy cập được.
Chạy một chiếc máy bay npm audit Báo cáo thường sẽ bao gồm cả các lỗ hổng trong quá trình chạy và các lỗ hổng chỉ phát sinh trong quá trình phát triển, cho thấy các vấn đề trong các gói như... brace-expansion, esbuildvà webpack-dev-server. Cuộc kiểm toán thường sẽ đề xuất npm audit fix hoặc thậm chí npm audit fix --force Nâng cấp phiên bản, đôi khi đòi hỏi những cập nhật lớn trong các framework như Angular để loại bỏ các cảnh báo.
Để xem những lỗ hổng nào thực sự ảnh hưởng đến những gì được triển khai lên môi trường sản xuất, bạn có thể chạy lệnh sau: npm audit --production (hoặc sử dụng phương pháp được đề xuất) --omit=dev (Tùy chọn này có trong các phiên bản npm mới hơn). Nếu lệnh này trả về “found 0 vulnerabilities”, điều đó có nghĩa là, theo như cơ sở dữ liệu tư vấn của npm biết, bộ phụ thuộc trong môi trường sản xuất của bạn hiện không có vấn đề nào đã biết.
Điều này không có nghĩa là bạn có thể bỏ qua các lỗ hổng chỉ dành cho nhà phát triển mãi mãi, bởi vì chúng vẫn có thể gây nguy hiểm cho máy tính hoặc mã nguồn của nhà phát triển trong quá trình làm việc trên dự án. Tuy nhiên, hiểu được sự khác biệt này cho phép bạn ưu tiên: khắc phục các sự cố sản xuất có tác động lớn trước, sau đó giải quyết các vấn đề trong môi trường phát triển một cách có kế hoạch thay vì phản ứng với mọi cảnh báo như thể chúng đều nghiêm trọng như nhau.
Cách thức hoạt động của npm audit fix và khi nào nên tránh sử dụng –force
Lệnh npm audit fix Công cụ này được thiết kế để tự động nâng cấp các thư viện phụ thuộc dễ bị tổn thương trong phạm vi phiên bản an toàn, nhưng nó không phải là một nút thần kỳ giải quyết mọi vấn đề mà không cần phải đánh đổi. Nó sẽ duyệt qua cây phụ thuộc của bạn để tìm các gói có vấn đề đã biết và cố gắng cập nhật chúng lên các phiên bản đã được vá lỗi mà vẫn tương thích với hệ thống hiện có của bạn. package.json những ràng buộc.
Ví dụ, nếu một mối phụ thuộc được chỉ định như sau: ^1.2.0npm sẽ cố gắng chuyển sang phiên bản mới nhất. 1.x phiên bản có chứa bản sửa lỗi, mà không cần phải chuyển thẳng đến bản gốc. 2.xĐiều này có thể dẫn đến những thay đổi đột phá. Điều này làm cho npm audit fix Tương đối an toàn cho nhiều dự án, vì nó tuân thủ các ràng buộc về phiên bản ngữ nghĩa.
Tuy nhiên, đôi khi các bản vá lỗi duy nhất có sẵn chỉ nằm trong các phiên bản chính mới hơn hoặc trong các bộ công cụ yêu cầu nâng cấp toàn diện hơn, đó là khi npm đề xuất sử dụng... npm audit fix --force. Cờ này cho npm biết rằng nó được phép cài đặt các bản cập nhật có khả năng gây lỗi, bao gồm cả việc tăng phiên bản chính và các thay đổi dây chuyền trong các framework hoặc công cụ xây dựng.
Chạy một cách mù quáng --force Trong các dự án lớn hoặc dự án cũ, điều này có thể dễ dàng gây ra lỗi khi biên dịch hoặc dẫn đến các sự cố nhỏ trong quá trình chạy, bởi vì các thành phần phụ thuộc mà mã của bạn dựa vào có thể thay đổi hành vi hoặc API. Hãy coi đó như một quá trình chuyển đổi nhỏ cho hệ thống của bạn, chứ không chỉ là một bản vá bảo mật, vì vậy cần phải thực hiện với các biện pháp kiểm thử và kiểm soát phiên bản được thiết lập sẵn.
Cũng có những trường hợp npm không thể tự động sửa tất cả các lỗ hổng bảo mật, thường là do việc nâng cấp phiên bản cần thiết sẽ xung đột với các ràng buộc khác trong biểu đồ phụ thuộc của bạn. Trong những trường hợp đó, bạn có thể cần phải cập nhật hoặc thay thế thủ công một số thư viện nhất định, hoặc chấp nhận mức độ rủi ro tạm thời cho đến khi bản vá không gây lỗi được phát hành.
Một chiến lược thực tế là trước tiên hãy hiểu rõ những lỗ hổng nào ảnh hưởng đến môi trường sản xuất, sau đó mới áp dụng chúng. npm audit fix không có --forcevà chỉ xem xét việc nâng cấp bắt buộc hoặc nâng cấp lớn sau khi đã phân tích tác động và thực hiện đầy đủ các bước kiểm thử cần thiết. Bằng cách đó, bạn có thể giữ cho ứng dụng của mình an toàn mà không cần liên tục làm mất ổn định mã nguồn chỉ để theo đuổi một báo cáo kiểm toán hoàn hảo.
Tóm lại, việc xử lý các lỗ hổng bảo mật của npm là một quá trình liên tục bao gồm đánh giá rủi ro, ưu tiên và cập nhật có kiểm soát, chứ không phải là một lệnh chạy một lần rồi quên đi. Mỗi vấn đề cần được đánh giá dựa trên mức độ nghiêm trọng, khả năng khai thác thực tế trong bối cảnh của bạn và chi phí nâng cấp các gói hoặc bộ công cụ bị ảnh hưởng.
Xem xét lại số lượng thư viện npm bạn thực sự cần.
Một trong những biện pháp bảo mật dài hạn hiệu quả nhất với npm là chỉ cần phụ thuộc vào ít gói bên thứ ba nhất có thể. Mỗi sự phụ thuộc bổ sung sẽ làm tăng diện tích bề mặt tấn công, gánh nặng bảo trì và tiềm năng phát sinh các vấn đề lan truyền bất ngờ trong tương lai.
Các nhà phát triển thường cài đặt các gói vì sự tiện lợi, ngay cả khi chức năng đó có thể được thực hiện chỉ với một vài dòng mã JavaScript đơn giản. Theo thời gian, thói quen này có thể làm phình to cây phụ thuộc của bạn với các mô-đun ít được sử dụng, bảo trì kém hoặc dễ dàng bị thay thế bởi các đoạn mã nội bộ nhỏ.
Việc giảm thiểu các phụ thuộc mang lại nhiều lợi ích ngoài vấn đề bảo mật: dự án nhỏ hơn, thời gian cài đặt và biên dịch nhanh hơn, ít xung đột phiên bản hơn và việc gỡ lỗi đơn giản hơn khi có sự cố xảy ra. Một biểu đồ phụ thuộc gọn nhẹ hơn cũng giúp việc kiểm tra xem những gì thực sự đang được đưa vào ứng dụng của bạn dễ dàng hơn, thay vì phải xem xét hàng trang các gói tạm thời mà bạn chưa bao giờ chủ động lựa chọn.
Từ góc độ rủi ro, càng ít thành phần chuyển động thì càng ít khả năng các dự án bị bỏ dở, người bảo trì bị xâm phạm quyền riêng tư, hoặc các lỗ hổng bảo mật tinh vi trong các tiện ích ít được biết đến ảnh hưởng đến hệ thống của bạn. Ngay cả khi không thể tránh khỏi các framework lớn hoặc thư viện cốt lõi, bạn vẫn có thể chọn lọc những công cụ hỗ trợ nhỏ thực hiện các tác vụ đơn giản, vốn thường chiếm một phần đáng kể trong dữ liệu kiểm toán.
Một chiến lược quản lý phụ thuộc hoàn thiện bao gồm việc đánh giá kỹ lưỡng các gói mới, loại bỏ định kỳ các gói không sử dụng và ưu tiên các thư viện được bảo trì tốt, được kiểm chứng rộng rãi hơn các giải pháp chuyên biệt hoặc riêng lẻ bất cứ khi nào có thể. Kết hợp với việc sử dụng tốt npm audit, npm ciVới tư duy này và việc cập nhật thường xuyên, bạn có thể giảm đáng kể tần suất và mức độ nghiêm trọng của các vấn đề liên quan đến npm mà bạn gặp phải.
Gỡ lỗi các sự cố, nhật ký và cài đặt bị hỏng của npm.
Ngay cả với một môi trường được cấu hình tốt và một cây phụ thuộc gọn nhẹ, cuối cùng bạn vẫn sẽ gặp phải những lỗi npm khó hiểu làm gián đoạn quy trình làm việc của mình. Gỡ lỗi hiệu quả bắt đầu bằng việc thu thập thêm thông tin về những gì npm thực sự đang làm bên trong khi một lệnh thất bại.
Một kỹ thuật đơn giản là tăng mức độ chi tiết của npm bằng cách sử dụng các cờ như... --dd (Hoặc --loglevel verbose), chương trình này in ra các bước chi tiết của quy trình. Mức độ ghi nhật ký này có thể tiết lộ chính xác thao tác nào đã thất bại, tệp hoặc thư mục nào gây ra sự cố, hoặc tập lệnh nào trong chuỗi phụ thuộc của bạn đang bị lỗi.
Mỗi khi một lệnh thất bại, npm thường cũng cho bạn biết nơi nó lưu trữ tệp nhật ký chi tiết hơn, thường là trong một thư mục như... ~/.npm/_logs. Việc mở tệp nhật ký đó sẽ cung cấp cho bạn dấu vết theo trình tự thời gian của quá trình cài đặt hoặc chạy tập lệnh, bao gồm dấu vết ngăn xếp, chi tiết môi trường và các lỗi hệ thống tiềm ẩn mà không phải lúc nào cũng xuất hiện trong thông báo lỗi ngắn gọn.
Một số thất bại xuất phát từ những sai lầm của chính bạn. package.json, chẳng hạn như JSON không hợp lệ, tên tập lệnh không chính xác hoặc phạm vi phiên bản bị lỗi. Trong những trường hợp đó, việc xem xét kỹ lưỡng lại tệp tin để tìm lỗi cú pháp, lỗi chính tả hoặc dấu phẩy thừa có thể giải quyết các vấn đề thoạt nhìn có vẻ khó hiểu.
Đôi khi, nguyên nhân gốc rễ nằm ở cấp độ hệ điều hành hoặc công cụ: các vấn đề về truy cập mạng, phân giải DNS, quy tắc tường lửa hoặc thông tin đăng nhập Git hoặc GitHub bị cấu hình sai. Ví dụ, nếu một thư viện phụ thuộc được tải trực tiếp từ kho lưu trữ Git và Git bị thiếu hoặc cấu hình sai, npm sẽ thất bại ngay cả khi kho lưu trữ đó vẫn có thể truy cập được.
Các sự cố cài đặt phụ thuộc cũng có thể bắt nguồn từ tệp bị hỏng. node_modules thư mục hoặc bộ nhớ cache npm, đặc biệt là sau khi quá trình cài đặt bị gián đoạn hoặc nâng cấp chưa hoàn tất. Nếu bạn nghi ngờ có tham nhũng, việc loại bỏ ông ta thường dễ dàng hơn. node_modules và tệp khóa, xóa bộ nhớ cache của npm và cài đặt lại, thay vì cố gắng sửa chữa từng gói bị lỗi riêng lẻ.
Một phương pháp phục hồi phổ biến là xóa bỏ. node_modulesTùy chọn chạy lệnh xóa bộ nhớ cache, sau đó thực thi npm install lại phải xây dựng lại cây phụ thuộc từ đầu. Thao tác thiết lập lại mạnh tay này thường giải quyết được các hành vi kỳ lạ hoặc không nhất quán mà các bước khắc phục sự cố thông thường không phát hiện ra, đặc biệt là sau khi chuyển đổi nhánh hoặc hợp nhất các thay đổi phụ thuộc lớn.
Hãy nhớ rằng không phải tất cả lỗi đều do chính npm gây ra; một số lỗi bắt nguồn từ các tập lệnh mà các gói chạy trong quá trình cài đặt hoặc từ các hook vòng đời của dự án của bạn. Các nhật ký chi tiết và dấu vết lỗi có thể giúp bạn xác định xem bạn đang gặp phải sự cố thuần túy của npm hay sự cố trong một tập lệnh của bên thứ ba hoặc công cụ tùy chỉnh nào đó được kích hoạt thông qua npm.
Nhìn chung, việc kết hợp ghi nhật ký tốt hơn, đọc kỹ các thông báo lỗi và thỉnh thoảng khởi động lại hệ thống sẽ giúp cải thiện hiệu suất. node_modules Sẽ giúp bạn khắc phục hầu hết các lỗi của npm mà không bị sa lầy vào vòng lặp thử và sai vô tận. Theo thời gian, bạn sẽ nhận ra các mẫu lặp đi lặp lại—lỗi chính tả JSON, vấn đề về quyền truy cập, thiếu công cụ—giúp cho phiên gỡ lỗi tiếp theo diễn ra nhanh hơn nhiều.
Quản lý npm thành công cuối cùng là hiểu rõ cả những đặc điểm riêng của công cụ cục bộ và những rủi ro rộng hơn trong hệ sinh thái: từ các chính sách thực thi PowerShell và quyền truy cập Unix, đến cài đặt có tính xác định và kiểm tra lỗ hổng bảo mật, cũng như lựa chọn phụ thuộc cẩn thận và gỡ lỗi có hệ thống, mỗi thực tiễn tốt mà bạn áp dụng sẽ giảm thiểu khả năng các vấn đề của npm làm gián đoạn công việc phát triển của bạn.