PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Trình diễn SQL injection trong PL / pgSQL

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Độ phân giải mili giây của DateTime trong Ruby

  2. Nhóm các bản ghi có liên quan, nhưng chỉ chọn các trường nhất định từ bản ghi đầu tiên

  3. Làm cách nào để sử dụng UUID trong SQLAlchemy?

  4. Cách đơn giản hóa một truy vấn chọn có chứa nhiều lựa chọn bên trong và tăng hiệu suất trong PostgreSQL

  5. chmod og-rwx server.key trong windows