Ngăn chặn SQL Injection trong Go Postgresql

Oct 02 2020

Tôi nghiên cứu xung quanh diễn đàn về tiêm postgresql trong Go và tôi tìm thấy một số thông tin hữu ích trong SQL injection như bên dưới:

Làm thế nào để thực hiện tra cứu IN trong SQL bằng Golang?

Làm cách nào để ngăn chặn các cuộc tấn công SQL injection trong Go khi sử dụng "database / sql"?

nhưng tôi vẫn cần một số lời khuyên vì mã của tôi trong Go đang sử dụng một loại mã và cách sử dụng khác. một số usecase / câu hỏi tôi cần tư vấn là như thế này

  1. Sử dụng vòng lặp truy vấn để chèn nhiều như INSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s)sử dụng fmt.Sprintf, tôi biết sử dụng sprinft là không tốt. vậy có giải pháp nào cho truy vấn vòng lặp này để chèn không? Ví dụ:INSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s),(%d,%d,%s),(%d,%d,%s)
  2. Có an toàn không khi sử dụng fmt.Sprintf để tạo truy vấn nếu tham số đang sử dụng %dthay vì %s?
  3. Sử dụng câu lệnh Chuẩn bị và Truy vấn là an toàn, nhưng nếu tôi đang sử dụng hàm Chọn (sử dụng $1,$2) và hàm NamedQuery (sử dụng struct có tên.) Ví dụ: Select * from a where text = $1-> is using this $1safe? và Ví dụ: Select * from a where text = :text-> điều này có an toàn trong hàm NamedQuery không?

Vui lòng cần lời khuyên của bạn guys. Cảm ơn bạn!

Trả lời

5 KennyGrant Oct 02 2020 at 18:20

Thứ nhất, thường thích sử dụng trình giữ chỗ db? $ 1, v.v.

  1. Có, thật an toàn khi sử dụng fmt.Sprintf với các tham số nguyên để xây dựng SQL, mặc dù đáng để tránh nếu bạn có thể, nhưng tham số thứ ba của bạn là% s - hãy tránh điều đó và sử dụng?
  2. Có, sẽ an toàn khi sử dụng fmt.Sprintf với các tham số nguyên, nhưng% s hoặc% v rủi ro hơn nhiều và tôi sẽ tránh, không thể nghĩ tại sao bạn cần nó.
  3. Sử dụng trình giữ chỗ ở đây, sau đó có nó là an toàn.

Quy tắc chung:

  • Sử dụng trình giữ chỗ theo mặc định, hiếm khi sử dụng% d (như trong truy vấn IN của bạn chẳng hạn)
  • Phân tích cú pháp các tham số thành các loại như số nguyên trước khi xác thực hoặc sử dụng
  • Tránh nối chuỗi nếu bạn có thể và đặc biệt cảnh giác với các tham số chuỗi
  • Luôn viết mã những thứ như tên cột và bảng, không bao giờ tạo chúng từ đầu vào của người dùng (ví dụ: sort = mystringcolname)
  • Luôn xác thực rằng các thông số bạn nhận được chỉ là những thông số được ủy quyền cho người dùng đó