PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Демонстрирайте SQL инжектиране в PL/pgSQL

SQL заявките в PL/pgSQL се планират като подготвени изрази. Стига да предавате само стойности както и вие, SQL инжектирането обикновено е невъзможно . Подробности:

Използвайте динамичен SQL с EXECUTE и без подходящо обработване на параметри за действително демонстриране на SQL инжектиране.

Харесвам (ето какне да го направя!):

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;

Първата променлива em се предава правилно с USING клауза като стойност и следователно не може да се злоупотребява за SQL инжектиране.

Но втората променлива passwd е неправилно свързан без правилно екраниране. По този начин въведеното от потребителя може да бъде преобразувано в SQL код. SQL инжекция.

Никога не използвайте това! Освен когато демонстрирате как не трябва да го правите.

Подобно зло е възможно при неправилно свързване на SQL низове в клиента.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Съхраняване на вложени хешове в PostgreSQL с Rails 4 (и Hstore)

  2. Как да разделим текст с помощта на подниз

  3. Postgres Alter Column Integer на Boolean

  4. Изпълнявайте Sequelize заявки синхронно

  5. Тип връщане на SQL функция:TABLE срещу SETOF записи