- Hành vi mặc định của
npm installđược chuyển sang hướng ưu tiên bảo mật, khiến các tính năng trước đây tự động chạy nay chỉ hoạt động khi người dùng chủ động cho phép (opt-in) allowScriptsmặc định là off — các scriptpreinstall·install·postinstallcó trong các gói bên ngoài được cài đặt sẽ bị chặn theo mặc định, chỉ các gói được dự án cho phép mới được chạy- Thay đổi này nhằm chặn các script vốn trước đây tự động chạy ngay khi chỉ cài package, từ đó giảm khả năng mã độc chen vào
- Cả quá trình build native của
node-gypcũng thuộc diện bị chặn, nên những package chỉ cóbinding.gypmà không có script cài đặt riêng cũng sẽ không build được (vì npm nội bộ chạynode-gyp rebuild) - Script
preparecủa các package được lấy qua git·file·link cũng sẽ bị chặn tương tự - Cách dùng: dùng
npm approve-scripts --allow-scripts-pendingđể kiểm tra package nào có script → dùngnpm approve-scriptsđể chỉ cho phép những package đáng tin cậy, phần còn lại chặn bằngnpm deny-scripts→ vì danh sách cho phép được lưu vàopackage.json, hãy commit lại
--allow-gitmặc định lànone— các package được lấy trực tiếp từ kho Git (bao gồm cả các package mà chúng kéo theo) sẽ bị chặn theo mặc định, và chỉ được cài khi cho phép bằng--allow-git- Mục tiêu là chặn con đường mà
.npmrctrong package Git có thể thay thế chính file thực thi Git (--ignore-scriptscũng không chặn được vấn đề này) (npm 11.10.0+)
- Mục tiêu là chặn con đường mà
--allow-remotemặc định lànone— các package được lấy từ URL từ xa như tarball https (bao gồm phụ thuộc bắc cầu) sẽ bị chặn theo mặc định, và chỉ được cài khi cho phép bằng--allow-remote(npm 11.15.0+)- Tuy nhiên,
--allow-filevà--allow-directorysẽ không đổi giá trị mặc định trong đợt v12 này
- Tuy nhiên,
- Tất cả các thay đổi trên đều sẽ được đưa ra trước dưới dạng cảnh báo trong npm 11.16.0 trở lên, để có thể kiểm tra và ứng phó trước khi phát hành chính thức
- Thời điểm dự kiến phát hành v12 là tháng 7/2026
1 bình luận
Ý kiến trên Hacker News
Không hiểu sao tôi lại bỏ lỡ việc npm được GitHub mua lại, nhưng tự nhiên giờ nhiều thứ bắt đầu trở nên dễ hiểu
Khó mà nghĩ ra một mái nhà nào tệ hơn cho một phần quan trọng như thế này của hệ sinh thái Node
https://github.blog/news-insights/company-news/npm-is-joinin...
Đúng kiểu “bao trùm, mở rộng, tiêu diệt”
https://en.wikipedia.org/wiki/Embrace,_extend,_and_extinguis...
script postinstall lẽ ra phải bị loại bỏ từ lâu rồi, đúng là thứ ung thư của các gói NPM
Có quá nhiều trường hợp chỉ cần tải cái gì đó về là một đống postinstall lồng sâu, không kiểm soát, chạy ngẫu nhiên
Không hiểu ai từng nghĩ đây là ý hay
Thường thì dù sao bạn cũng sẽ chạy mã dependency đã đóng gói ở một thời điểm nào đó, và đa phần là với cùng quyền như lúc cài đặt
Vậy thì các script cấu hình kiểu này, dù tốt hay xấu, chỉ cần dời điểm vào từ npm sang chỗ xảy ra
importhoặcrequirelà đượcTrừ khi cả hệ sinh thái chuyển sang môi trường sandbox kiểu Deno, thì cùng lắm nó chỉ như một chướng ngại nhỏ. Có thể đó chính là kế hoạch
Ví dụ hiện ra ngay trong đầu là https://www.npmjs.com/package/patch-package
Hy vọng cơn cuồng loạn hiện tại không dẫn tới những quyết định vô ích kiểu này
Chuyện này chắc hẳn đã được thảo luận hàng trăm lần bên trong NPM kể từ khi được nêu ra công khai 10 năm trước
Vì Shai Halud nên giờ nó đã quá lớn để tiếp tục phớt lờ
“Chúng tôi sẽ sớm sửa” gần như lúc nào cũng thành “chết tiệt, giờ phải sửa rồi”
Tôi tò mò không biết các bản Node LTS hiện tại, nếu nhớ không nhầm là 22, 24, 26, có dự định nâng npm đi kèm lên v12 để được hưởng bản sửa bảo mật này không
Hiện tại tất cả đều đang kèm npm v11
Ở v18.19.0[1] và v20.10.0[2], npm đã được nâng từ 9 lên 10
[1]: https://nodejs.org/en/blog/release/v18.19.0#npm-updated-to-v...
[2]: https://nodejs.org/en/blog/release/v20.10.0
Chỉ cần đặt mặc định phù hợp như bài viết nói là xong
Điểm hay nhất của thay đổi này là khi mặc định đổi đi, các gói phiền toái vốn ngầm giả định các thiết lập này được bật sẽ hỏng ngay khi dev mới chỉ việc chạy install
Ví dụ, điều này có thể buộc mọi người ngừng thói quen trông chờ script sẽ được chạy
Chỉ đọc bài thì chưa rõ, nhưng có vẻ danh sách cho phép script hỗ trợ cấp quyền theo từng package chứ không phải cấu hình toàn cục
Có lẽ sẽ dễ hơn để duy trì các quy tắc cấp tổ chức chỉ cho phép script ở một số package cụ thể
Tôi tự hỏi có linter nào dùng để chặn các mặc định không an toàn kiểu này trong cấu hình package manager không
greplà được sao?Tôi tự hỏi giờ còn lý do gì để dùng Yarn nữa không
Không biết Yarn có triển khai các biện pháp bảo vệ chống tấn công chuỗi cung ứng không
Trước giờ tôi chỉ biết pnpm, nên việc npm bắt kịp cũng là điều tốt
Bản Yarn mới nhất 4.x đảm bảo hành vi xác định gần như quá mức, và bạn có thể kỳ vọng hành vi nhất quán trên toàn bộ team
Về tính năng thì có nhiều chi tiết nhỏ, nhưng khi đã quen thì gộp lại tạo khác biệt lớn
Bản major tiếp theo cũng sẽ tiếp tục đẩy theo hướng đó với hiệu năng tốt hơn, cùng các tính năng trước giờ chưa thể triển khai vì phụ thuộc vào các cải tiến hiệu năng ấy
Nhân tiện, tôi là maintainer chính của Yarn
Nó cũng có tính năng bảo vệ chuỗi cung ứng
Cuối cùng chúng tôi hết chịu nổi và chuyển sang pnpm, việc cài đặt nhanh hơn rất nhiều cả trên CI lẫn máy dev cục bộ
Với sự trợ giúp của LLM, việc migrate mất khoảng một ngày
node_modules, nó chạy trực tiếp từ archive nénhttps://yarnpkg.com/features/pnp
Khá giống việc trong Java dùng
.jarthay cho cây thư mục.classTuy hơi hacky một chút, và hỗ trợ từ editor cùng công cụ thì không đồng đều
Vì số lượng file nhỏ ít hơn rất nhiều, nên nếu buộc phải làm việc trên Windows thì nó có thể nhanh hơn đáng kể
Bạn thậm chí có thể đưa các archive vào kho git, từ đó loại bỏ phụ thuộc vào Internet và package registry
Tôi thực sự không biết câu trả lời
Tôi không biết npm thuộc sở hữu của GitHub
Điều đó giải thích được nhiều chuyện
Một số ý đọc lại sau thời gian khá thú vị
Bình luận đứng đầu là: “Microsoft không làm mọi thứ đúng, nhưng thành thật mà nói thương vụ mua GitHub diễn ra tốt hơn tôi tưởng rất nhiều. Thay vì ép GitHub theo chính sách xoay quanh Microsoft, Microsoft lại tiếp nhận nhiều thứ của GitHub hơn từ góc độ sản phẩm. GitHub vẫn vận hành như một công ty riêng biệt.”
Họ có vốn đầu tư mạo hiểm nhưng không tìm ra được mô hình kinh doanh bền vững
GitHub mua lại để cứu hệ sinh thái, và thương vụ này cũng hầu như không mang lại lợi ích lớn nào cho GitHub
Và Microsoft đã chuyển GitHub sang Azure
Tôi tò mò không biết danh sách cho phép trong
package.jsoncó ghim tới cả phiên bản package hay chỉ ghim theo tên packageMặc định
allowScriptstắt như vậy thật tuyệt[nhìn đồng hồ] hóa ra chỉ mất 18 tháng để đuổi theo pnpm à?
Vậy bên JavaScript cái này dùng để làm gì?