Các truy vấn SQL trong PL / pgSQL được lập kế hoạch giống như các câu lệnh đã chuẩn bị. Miễn là bạn chỉ chuyển giá trị như bạn làm, SQL injection nói chung là không thể . Chi tiết:
Sử dụng SQL động với EXECUTE
và không có xử lý tham số thích hợp để thực sự chứng minh việc đưa vào SQL.
Thích (đây là cách không để làm điều đó!):
CREATE OR REPLACE FUNCTION login_v(em varchar, passwd varchar)
RETURNS SETOF users AS
$func$
BEGIN
RETURN QUERY EXECUTE
'SELECT *
FROM users
WHERE email = $1
AND encrypted_password = crypt(''' || passwd || ''', encrypted_password)'
USING em;
END
$func$ LANGUAGE plpgsql;
Biến đầu tiên em
được chuyển đúng cách với USING
mệnh đề là giá trị và do đó không thể lạm dụng để đưa vào SQL.
Nhưng biến thứ hai passwd
được nối không đúng cách mà không thoát đúng cách. Do đó, đầu vào của người dùng có thể được chuyển đổi thành mã SQL. Chèn SQL.
Không bao giờ sử dụng cái này! Ngoại trừ khi trình bày cách không làm điều đó.
Điều nghịch lý tương tự cũng có thể xảy ra khi nối các chuỗi SQL trong máy khách không đúng cách.