Những thay đổi phá vỡ tương thích sắp tới trong npm v12
(github.blog)- Trong npm v12, giá trị mặc định liên quan đến bảo mật của
npm installsẽ chuyển từ tự động chạy·phân giải sang cơ chế chỉ cho phép khi được chỉ định rõ, và có thể kiểm tra trước qua cảnh báo từ npm 11.16.0 trở lên - Giá trị mặc định của
allowScriptssẽ chuyển sang tắt, chặn việc chạy các scriptpreinstall,install,postinstallcủa các dependency chưa được cho phép rõ ràng, cũng như chặnnode-gyp rebuildngầm định và scriptpreparecủa các dependency dạng git·file·link - Có thể dùng
npm approve-scripts --allow-scripts-pendingđể kiểm tra các package sẽ bị chặn, sau đó dùngnpm approve-scriptsvànpm deny-scriptsđể quyết định cho phép·chặn, rồi commit allowlist được tạo vàopackage.json - Giá trị mặc định của
--allow-gitsẽ đổi thànhnone, ngừng phân giải các dependency Git trực tiếp·bắc cầu nếu không được cho phép rõ ràng bằng--allow-git - Chặn đường thực thi mã mà
.npmrccủa dependency Git có thể ghi đè tệp thực thi Git ngay cả khi đang dùng--ignore-scripts - Giá trị mặc định của
--allow-remotesẽ đổi thànhnone, ngừng phân giải các dependency URL từ xa như tarball https nếu không được cho phép rõ ràng bằng--allow-remote - Giá trị mặc định của
--allow-filevà--allow-directorykhông thay đổi trong npm v12 - Quy trình chuẩn bị là nâng cấp lên npm 11.16.0 trở lên, chạy cài đặt thông thường để xem lại cảnh báo, chỉ phê duyệt các package đáng tin cậy, và sau khi nâng cấp thì chỉ các script đã được phê duyệt mới tiếp tục chạy
- Tài liệu liên quan:
npm approve-scripts,npm deny-scripts,allow-scriptsconfig
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ì?