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?
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:
Nó phụ thuộc.
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ố.
Với LANGUAGE plpgsql
, câu trả lời thường là có .
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:
USING
khoản. Ví dụ .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:
format()
với định dạng định dạng%I
. Ví dụ .quote_ident()
. Ví dụ .regclass
cho tên bảng: _tbl::regclass
. Ví dụ .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.
USING
mệnh đề để truyền giá trị cho EXECUTE
bấ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.