Trang này cung cấp cho lập trình viên Go các thực hành tốt để ưu tiên bảo mật cho dự án của mình. Từ việc tự động hoá kiểm thử bằng fuzzing đến kiểm tra race condition một cách dễ dàng, những gợi ý này có thể giúp mã nguồn của bạn an toàn và đáng tin cậy hơn.
Quét mã nguồn và tệp nhị phân để tìm lỗ hổng
Thường xuyên quét mã nguồn và tệp nhị phân để tìm lỗ hổng giúp phát hiện sớm các rủi ro bảo mật tiềm ẩn. Bạn có thể dùng govulncheck, được hậu thuẫn bởi vulnerability database của Go, để quét mã nguồn tìm lỗ hổng và phân tích xem lỗ hổng nào thực sự ảnh hưởng tới bạn. Bắt đầu với hướng dẫn về govulncheck.
Govulncheck cũng có thể được tích hợp vào các luồng CI/CD. Nhóm Go cung cấp một GitHub Action cho govulncheck trên GitHub Marketplace. Govulncheck còn hỗ trợ cờ -json để giúp lập trình viên tích hợp việc quét lỗ hổng với các hệ thống CI/CD khác.
Bạn cũng có thể quét lỗ hổng ngay trong trình soạn thảo mã của mình bằng extension Go cho Visual Studio Code. Bắt đầu với hướng dẫn này.
Giữ phiên bản Go và các phụ thuộc luôn mới
Giữ cho phiên bản Go của bạn luôn mới giúp bạn tiếp cận các tính năng ngôn ngữ mới nhất, các cải thiện hiệu năng và bản vá cho những lỗ hổng bảo mật đã biết. Một phiên bản Go được cập nhật cũng đảm bảo tương thích với các phiên bản phụ thuộc mới hơn, giúp tránh các vấn đề tích hợp tiềm ẩn. Hãy xem lịch sử phát hành Go để biết những thay đổi nào đã được thực hiện trong Go giữa các bản phát hành. Nhóm Go phát hành các bản point release trong suốt chu kỳ phát hành để xử lý các lỗi bảo mật. Hãy chắc chắn cập nhật lên phiên bản Go minor mới nhất để có được các bản khắc phục bảo mật mới nhất.
Giữ các phụ thuộc bên thứ ba luôn mới cũng rất quan trọng đối với bảo mật phần mềm, hiệu năng và tuân thủ các chuẩn mới nhất trong hệ sinh thái Go. Tuy nhiên, cập nhật lên phiên bản mới nhất mà không rà soát kỹ cũng có thể rủi ro, có khả năng đưa vào lỗi mới, thay đổi không tương thích, hoặc thậm chí mã độc hại. Vì vậy, dù việc cập nhật phụ thuộc để có các bản vá bảo mật và cải tiến mới nhất là thiết yếu, mỗi lần cập nhật đều cần được rà soát và kiểm thử cẩn thận.
Kiểm thử bằng fuzzing để phát hiện các trường hợp biên bị khai thác
Fuzzing là một dạng kiểm thử tự động dùng dẫn hướng theo coverage để biến đổi dữ liệu đầu vào ngẫu nhiên và đi qua mã nguồn nhằm tìm và báo cáo các lỗ hổng tiềm ẩn như SQL injection, tràn bộ đệm, từ chối dịch vụ và tấn công cross-site scripting. Fuzzing thường chạm được tới những trường hợp biên mà lập trình viên bỏ sót, hoặc cho là quá khó xảy ra nên không kiểm thử. Bắt đầu với hướng dẫn này.
Kiểm tra race condition bằng race detector của Go
Race condition xảy ra khi hai hoặc nhiều goroutine truy cập cùng một tài nguyên một cách đồng thời, và ít nhất một trong các truy cập đó là thao tác ghi. Điều này có thể dẫn tới những vấn đề khó lường, khó chẩn đoán trong phần mềm của bạn. Hãy xác định các race condition tiềm ẩn trong mã Go của bạn bằng race detector có sẵn, công cụ này giúp bạn đảm bảo an toàn và độ tin cậy cho các chương trình đồng thời. Tuy nhiên, race detector chỉ tìm được các race xảy ra lúc runtime, nên nó sẽ không tìm thấy race trong những nhánh mã không được thực thi.
Để dùng race detector, hãy thêm cờ -race khi chạy test hoặc build ứng dụng của bạn, ví dụ go test -race. Lệnh này sẽ biên dịch mã của bạn với race detector được bật và báo cáo mọi race condition mà nó phát hiện lúc runtime. Khi race detector tìm thấy một data race trong chương trình, nó sẽ in ra một report chứa stack trace của các truy cập xung đột, và stack nơi các goroutine liên quan được tạo ra.
Dùng Vet để soi các cấu trúc đáng ngờ
Câu lệnh vet của Go được thiết kế để phân tích mã nguồn của bạn và đánh dấu những vấn đề tiềm ẩn vốn không hẳn là lỗi cú pháp, nhưng có thể gây rắc rối lúc runtime. Chúng bao gồm các cấu trúc đáng ngờ, như mã không bao giờ tới được, biến không dùng tới, và những sai lầm phổ biến quanh goroutine. Bằng cách bắt sớm những vấn đề này trong quá trình phát triển, go vet giúp duy trì chất lượng mã, giảm thời gian gỡ lỗi, và nâng cao độ tin cậy tổng thể của phần mềm. Để chạy go vet cho một dự án cụ thể, hãy chạy:
go vet ./...
Đăng ký golang-announce để nhận thông báo về các bản phát hành bảo mật
Các bản phát hành Go chứa khắc phục bảo mật được thông báo trước tới danh sách thư ít lưu lượng [email protected]. Nếu bạn muốn biết khi nào có các bản khắc phục bảo mật cho chính Go, hãy đăng ký.