☰ Mục lục series
Tài liệu Go tiếng Việt
  1. Bắt đầu (Getting started)
    1. Tổng quan
    2. Tải về và cài đặt
    3. Bắt đầu với Go
    4. Quản lý các bản cài đặt Go
    5. Plugin trình soạn thảo và IDE
  2. Dạo quanh Go (A Tour of Go)
    1. Chào mừng
    2. Package, biến và hàm
    3. Điều khiển luồng
    4. Struct, slice và map
    5. Method và interface
    6. Generics
    7. Xử lý đồng thời
  3. Hướng dẫn (Tutorials)
    1. Danh sách hướng dẫn
    2. Tạo một Go module
    3. Gọi mã của bạn từ một module khác
    4. Trả về và xử lý lỗi
    5. Trả về lời chào ngẫu nhiên
    6. Trả về lời chào cho nhiều người
    7. Thêm một test
    8. Biên dịch và cài đặt ứng dụng
    9. Kết luận
    10. Bắt đầu với workspace nhiều module
    11. Phát triển RESTful API với Go và Gin
    12. Truy cập cơ sở dữ liệu quan hệ
    13. Bắt đầu với generics
    14. Bắt đầu với fuzzing
    15. Làm việc với JSON
    16. Tìm và sửa các dependency có lỗ hổng với govulncheck
    17. Tìm và khắc phục phụ thuộc có lỗ hổng với VS Code Go
    18. Viết ứng dụng web
  4. Viết code Go
    1. Cách viết mã Go
    2. Effective Go
    3. Doc Comment trong Go
  5. Module
    1. Phát triển và publish module
    2. Quản lý phụ thuộc
    3. Tổ chức một module Go
    4. Quản lý mã nguồn của module
    5. Cách đánh số phiên bản module
    6. Quy trình phát hành và đánh phiên bản module
    7. Publish một module
    8. Phát triển một bản cập nhật major version
    9. Tham chiếu tệp go.mod
    10. Ngừng hỗ trợ 'go get' cho việc cài đặt tệp thực thi
  6. Cơ sở dữ liệu (Database)
    1. Truy cập cơ sở dữ liệu quan hệ
    2. Mở một handle cơ sở dữ liệu
    3. Thực thi câu lệnh SQL không trả về dữ liệu
    4. Truy vấn dữ liệu
    5. Dùng prepared statement
    6. Thực thi transaction
    7. Huỷ các thao tác đang chạy
    8. Quản lý kết nối
    9. Tránh rủi ro SQL injection
  7. Chẩn đoán và hiệu năng
    1. Chẩn đoán
    2. Hướng dẫn về Go Garbage Collector
    3. Tối ưu hoá dựa trên profile
    4. Data Race Detector
    5. Gỡ lỗi mã Go bằng GDB
    6. Hỗ trợ coverage profiling cho integration test
  8. Bảo mật (Security)
    1. Tổng quan bảo mật
    2. Thực hành tốt về bảo mật cho lập trình viên Go
    3. Quản lý lỗ hổng trong Go
    4. Cơ sở dữ liệu lỗ hổng của Go
    5. Quét lỗ hổng trong IDE
    6. Chính sách CNA của Go
    7. Go Fuzzing
    8. Chi tiết kỹ thuật của Go Fuzzing
    9. Chính sách bảo mật của Go
    10. Threat Model của Go
    11. Các quyết định về bảo mật của Go
    12. Tuân thủ FIPS 140-3
  9. Công cụ và toolchain
    1. Tài liệu về các lệnh
    2. Về lệnh go
    3. Go Toolchains
    4. Telemetry của Go
    5. Cài đặt Go từ mã nguồn
    6. Cài đặt và sử dụng gccgo
  10. Tham khảo
    1. Câu hỏi thường gặp (FAQ)
    2. Go 1 và tương lai của các chương trình Go
    3. Hướng dẫn chuyển đổi sang encoding/json/v2
    4. Hướng dẫn đóng góp
    5. Đóng góp cho frontend gccgo
  11. Phụ lục
    1. Bảng thuật ngữ
Bảo mật (Security)

Thực hành tốt về bảo mật cho lập trình viên Go

Bản dịch từ go.dev/doc/security/best-practices

Quay lại Go Security

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ý.

Nội dung gốc: Go Documentation © The Go Authors, giấy phép CC BY 3.0. Bản dịch và ghi chú: Lê Văn Dũng.