Thư viện bên ngoài giúp bạn làm nhanh hơn rất nhiều, nhưng mỗi thư viện là mã của người lạ chạy với đầy đủ quyền của chương trình bạn. Rủi ro gồm lỗ hổng chưa được vá, thư viện bị bỏ hoang, bản cập nhật bị chèn mã độc và gói giả mạo có tên gần giống. Cách giữ an toàn là chọn kỹ, ghi rõ phiên bản, cập nhật có kiểm soát và dùng công cụ cảnh báo lỗ hổng.
Chào bạn, đây là Nhà Lập Trình. Một dự án web bình thường ngày nay có thể kéo theo hàng trăm thư viện, phần lớn là thư viện của thư viện mà bạn chưa từng nghe tên. Mỗi cái là một mắt xích. Tập này kể về chuỗi mắt xích đó, ở góc nhìn người giữ nhà.
Mã của người lạ, quyền của bạn
Khi bạn thêm một thư viện vào dự án, bạn đang mời mã của người khác vào chạy trong chương trình của mình. Nó đọc được mọi thứ chương trình đọc được: cơ sở dữ liệu, tệp cấu hình, biến môi trường chứa khoá bí mật. Nó gửi được dữ liệu ra ngoài.
Phần lớn thời gian, điều này hoàn toàn ổn. Những người viết thư viện mã nguồn mở là những người rất hào phóng, và cả ngành phần mềm được xây trên công sức của họ. Không dùng thư viện nào là điều không thực tế.
Nhưng hiểu rằng đó là một mối quan hệ tin cậy giúp bạn cẩn thận hơn. Bạn không đưa chìa khoá nhà cho bất kỳ ai. Với thư viện cũng vậy.
Và nhớ rằng mỗi thư viện bạn thêm thường kéo theo những thư viện nó phụ thuộc, và những thư viện đó lại kéo theo thư viện khác. Bạn chọn một, nhưng tin tưởng hàng chục.
Bốn loại rủi ro chính
Loại thứ nhất là lỗ hổng: thư viện có lỗi bảo mật mà người viết chưa biết hoặc đã vá ở bản mới nhưng bạn chưa cập nhật. Đây là loại phổ biến nhất. Nhiều vụ xâm nhập lớn bắt đầu từ một thư viện cũ có lỗ hổng đã được công bố từ lâu.
Loại thứ hai là bỏ hoang: người viết không còn chăm sóc thư viện. Không ai vá lỗi, không ai cập nhật cho phiên bản ngôn ngữ mới. Một ngày bạn phải thay nó, và nếu nó nằm sâu trong dự án, việc thay rất tốn kém.
Loại thứ ba là bản cập nhật có mã độc. Tài khoản của người giữ thư viện bị chiếm, hoặc thư viện được chuyển giao cho một người mới có ý đồ xấu. Một bản cập nhật trông bình thường nhưng chứa mã lấy cắp dữ liệu. Nếu dự án của bạn tự động lấy bản mới nhất, bạn nhận luôn mã độc.
Loại thứ tư là tên giả mạo: ai đó đăng một gói có tên gần giống thư viện nổi tiếng, chỉ khác một chữ. Gõ nhầm một ký tự khi cài là bạn cài phải gói giả.
Chọn thư viện như chọn người hợp tác
Trước khi thêm một thư viện, hãy dành vài phút xem xét. Thư viện này có được dùng rộng rãi không? Có thay đổi gần đây không? Có người trả lời các báo lỗi không? Có nhiều người cùng giữ hay chỉ một người?
Hãy tự hỏi có thật sự cần thư viện này không. Nếu chỉ cần một hàm mười dòng, tự viết có khi an toàn hơn kéo theo một thư viện với hàng chục thư viện phụ thuộc. Ngược lại, những thứ phức tạp và nhạy cảm như mật mã, xử lý ngày giờ, đọc định dạng tệp phức tạp thì nên dùng thư viện uy tín thay vì tự viết.
Kiểm tra kỹ tên trước khi cài. Chép tên từ trang chính thức của thư viện thay vì gõ tay.
Và ghi lại vì sao chọn thư viện đó. Khi sau này cần thay, người sau biết nó được dùng vào việc gì và cần thay bằng thứ gì tương đương.
Khoá phiên bản và cập nhật có kiểm soát
Hãy ghi rõ phiên bản chính xác của mọi thư viện dự án dùng, kể cả thư viện phụ thuộc, trong một tệp khoá được lưu cùng mã. Nhờ vậy, mọi máy cài dự án đều nhận đúng cùng phiên bản, và không có bản cập nhật nào tự lọt vào mà bạn không biết.
Nhưng khoá phiên bản không có nghĩa là không bao giờ cập nhật. Thư viện cũ tích tụ lỗ hổng. Hãy có lịch cập nhật định kỳ, chẳng hạn mỗi tháng, xem có bản mới nào, đọc ghi chú thay đổi, cập nhật, chạy thử nghiệm, rồi mới đưa lên máy thật.
Với bản vá lỗ hổng nghiêm trọng, cập nhật nhanh hơn, không chờ lịch. Nhưng vẫn chạy thử nghiệm trước.
Cập nhật thường xuyên từng chút một dễ hơn nhiều so với để ba năm rồi cập nhật một lần. Ba năm sau, mỗi thư viện đã đổi nhiều thứ, và bạn phải sửa mã ở hàng trăm chỗ cùng lúc.
Để máy canh giúp
Không ai theo dõi được hàng trăm thư viện bằng tay. May là có những công cụ tự động quét danh sách thư viện của dự án, so với cơ sở dữ liệu lỗ hổng đã công bố, và cảnh báo khi có thư viện nào cần cập nhật. Nhiều dịch vụ lưu trữ mã có sẵn chức năng này.
Hãy bật nó, và quan trọng hơn, hãy đọc cảnh báo. Rất nhiều đội bật công cụ rồi để hàng chục cảnh báo nằm đó nhiều tháng. Không phải cảnh báo nào cũng nguy hiểm với dự án của bạn, nhưng cần có người xem và quyết định.
Với dự án lớn, có thể giới hạn thư viện chỉ được lấy từ một nơi trung gian đã kiểm duyệt, thay vì lấy thẳng từ kho công cộng. Với đội nhỏ, khoá phiên bản và công cụ cảnh báo thường là đủ.
Thư viện bên ngoài là món quà của cộng đồng. Nhận quà thì vui, nhưng người giữ nhà cẩn thận vẫn mở hộp ra xem trước khi mang vào nhà.
Câu hỏi thường gặp
Dùng thư viện mã nguồn mở có an toàn không?
Phần lớn là an toàn và rất có ích, nhưng mỗi thư viện là mã bên ngoài chạy với quyền của chương trình bạn. Cần chọn thư viện uy tín, khoá phiên bản và cập nhật định kỳ để giảm rủi ro.
Khoá phiên bản thư viện là gì?
Là ghi lại phiên bản chính xác của mọi thư viện dự án dùng trong một tệp lưu cùng mã, để mọi máy cài đúng cùng phiên bản và không có bản cập nhật nào tự lọt vào.
Bao lâu nên cập nhật thư viện một lần?
Nên có lịch định kỳ như mỗi tháng, và cập nhật nhanh hơn khi có bản vá lỗ hổng nghiêm trọng. Cập nhật đều đặn từng chút dễ hơn nhiều so với để lâu rồi cập nhật một lần.
Gói giả mạo tên gần giống là gì?
Là gói do kẻ xấu đăng lên với tên gần giống thư viện nổi tiếng, chờ người gõ nhầm để cài. Nên chép tên từ trang chính thức và kiểm tra kỹ trước khi cài.
Có nên tự viết thay vì dùng thư viện?
Với việc đơn giản vài dòng, tự viết có thể tốt hơn kéo theo cả chuỗi phụ thuộc. Với việc phức tạp và nhạy cảm như mật mã hay xử lý ngày giờ, nên dùng thư viện uy tín.