SQL SQL trong các hàm Postgres so với các truy vấn đã chuẩn bị


30

Trong Postgres, các truy vấn được chuẩn bị và các hàm do người dùng xác định có tương đương như một cơ chế để bảo vệ chống lại SQL SQL không?
Có những lợi thế đặc biệt trong một cách tiếp cận so với cách tiếp cận khác?

Câu trả lời:


36

Nó phụ thuộc.

Hàm SQL

Với LANGUAGE sql, câu trả lời thường là có .

Các tham số đã vượt qua được coi là giá trị và SQL-tiêm là không thể - miễn là bạn không gọi các hàm không an toàn từ thân và truyền tham số.

Các hàm PL / pgSQL

Với LANGUAGE plpgsql, câu trả lời thường .

Tuy nhiên , PL / pgSQL cho phép SQL động trong đó các tham số (hoặc phần) được truyền vào được nối với chuỗi truy vấn và được thực thi với EXECUTE. Điều này có thể chuyển đổi đầu vào của người dùng thành mã SQL và làm cho SQL có thể được tiêm . Bạn không thể biết từ bên ngoài liệu cơ thể chức năng xử lý nó đúng cách. Công cụ được cung cấp.

Chỉ sử dụng SQL động khi bạn cần nó. Các câu lệnh SQL đơn giản sử dụng các tham số làm giá trị là an toàn đối với SQL SQL như các hàm SQL.

Đối với SQL động , tốt nhất là chuyển các giá trị dưới dạng các giá trị với:

Làm cho SQL tiêm không thể vào hiệu trưởng.

Nếu bạn nối các giá trị trong chuỗi SQL, hãy sử dụng:

Kết hợp các chuỗi trong dấu ngoặc đơn một cách an toàn, do đó tránh được lỗi cú pháp và SQL SQL.

Các tham số quy trình sẽ được coi là định danh trong chuỗi SQL với:

Bao gồm các chuỗi trong dấu ngoặc kép một cách an toàn khi cần thiết , do đó tránh được lỗi cú pháp và SQL SQL.

Liên quan:

Không bao giờ chỉ xây dựng một chuỗi từ đầu vào của người dùng và thực thi. Điều này bao gồm các định danh, được người dùng truyền trực tiếp hoặc lấy từ danh mục hệ thống. Tất cả phải được đối xử như đầu vào của người dùng và được trích dẫn an toàn khi xây dựng SQL động!

Thông tin thêm về ý nghĩa hiệu suất trong câu trả lời liên quan này:

Khái niệm cơ bản về SQL-tiêm:

Các cân nhắc tương tự áp dụng cho các ngôn ngữ phía máy chủ khác cho phép SQL động.


Vì vậy, tóm lại: Nếu 1) Tôi chỉ sử dụng ngôn ngữ sql, tôi an toàn, 2) nếu tôi sử dụng plpgslq nhưng không thực thi, tôi an toàn, 3) nếu tôi sử dụng plpgsql và thực thi nhưng không có định danh và% s hoặc% L là phù hợp Tôi an toàn hoặc 4) nếu tôi sử dụng plpgsql và thực thi và định danh nhưng% I hoặc quote_ident là phù hợp Tôi an toàn. Chính xác?
mickeyf_supports_Monica

@mickeyf: Về cơ bản là có. Thêm vào đó, sử dụng USINGmệnh đề để truyền giá trị cho EXECUTEbất cứ khi nào có thể. Bạn có thể gọi hàm PL / pgSQL từ bên trong hàm SQL và truyền tham số. Vì vậy, để hoàn toàn chính xác, bạn an toàn miễn là bạn không gọi bất kỳ chức năng không an toàn nào trực tiếp hoặc gián tiếp. Nếu tất cả các chức năng của bạn được thực hiện đúng, điều đó không thể xảy ra.
Erwin Brandstetter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.