powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / не воспринимает quote_literal
8 сообщений из 8, страница 1 из 1
не воспринимает quote_literal
    #34385541
neoweb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
create or replace function select_active_delete (text, text)
returns smallint as
'SELECT active FROM mailbox WHERE username=$1 AND domain=quote_literal($2)
'
language sql VOLATILE RETURNS NULL ON NULL INPUT SECURITY DEFINER;


Запрос select select_active_delete('dd@new.ru', 'new.ru');
Не возвращает условие, хотя если в функции не указать quote_literal - все работает;

Пробовал и так:
create or replace function select_active_delete (text, text)
returns smallint as
'SELECT active FROM mailbox WHERE username=$1 AND domain='|| quote_literal($2) ||
'
language sql VOLATILE RETURNS NULL ON NULL INPUT SECURITY DEFINER;
И так
'SELECT active FROM mailbox WHERE username=$1 AND domain='|| quote_literal($2) '
'

Результат одинаковый! В ем грабли? Спасибо.
...
Рейтинг: 0 / 0
не воспринимает quote_literal
    #34385622
BlackDan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
функцию quote_literal надо использовать при составлении динамического запроса
Поэтому
Код: plaintext
1.
2.
3.
4.
create or replace function select_active_delete (text, text)
returns smallint as
'SELECT active FROM mailbox WHERE username=$1 AND domain=$2
'
language sql VOLATILE RETURNS NULL ON NULL INPUT SECURITY DEFINER;
ИМХО, правильный вариант
...
Рейтинг: 0 / 0
не воспринимает quote_literal
    #34385705
neoweb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
select select_active_delete('dd@new.ru', 'new.ru');
Пользователь может менять параметры 'dd@new.ru' и 'new.ru' на любые другие. Не опасна ли тогда такая хп будет в плане sql инъекции?
...
Рейтинг: 0 / 0
не воспринимает quote_literal
    #34386189
BlackDan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
neowebselect select_active_delete('dd@new.ru', 'new.ru');
Пользователь может менять параметры 'dd@new.ru' и 'new.ru' на любые другие. Не опасна ли тогда такая хп будет в плане sql инъекции?
инъекции возможны, если запрос строится динамически. Здесь этого я не наблюдаю.
А что мешает попробовать сделать инъекцию и на основании полученного результата сделать выводы?
...
Рейтинг: 0 / 0
не воспринимает quote_literal
    #34396070
neoweb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И все таки:
create or replace function used_script (text)
returns text as
$$
declare
res text;
name text;
begin
name:=quote_literal($1);
select into res domain from mailbox where username = name;
return res;
end;
$$
language plpgsql VOLATILE RETURNS NULL ON NULL INPUT SECURITY DEFINER;

запрос из php:
...select used_script($var1)...

c quote_literal оно не работает. Сама строка(в нормальном виде) не содержит спецсимволов. Уже пробовал заменить select into res domain from mailbox where username = name; на select into res domain from mailbox where username = '||name||';
и так name:=quote_literal("$1");

Сделал return name, чтоб посмотреть что в этой переменной - там строка, которая и должна быть....
Как быть?
...
Рейтинг: 0 / 0
не воспринимает quote_literal
    #34396293
jaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А может попробовать

declare
some_val alias for $1
...
begin
name:=quote_literal(some_val);
...
...
Рейтинг: 0 / 0
не воспринимает quote_literal
    #34396617
BlackDan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Переменные не надо экранировать
Пример
Код: plaintext
1.
2.
3.
4.
5.
6.
DECLARE
  _param ALIAS FOR $ 1 ;
  _result INT4;
BEGIN
  SELECT table_id INTO _result FROM table WHERE field = _param;
  RETURN _result;
END

Переменные надо экранировать
Пример
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE
  _param ALIAS FOR $ 1 ;
  _query TEXT;
  _result INT4;
BEGIN
  _query := 'SELECT table_id FROM table WHERE field = ' || quote_literal(_param);
  RAISE LOG 'Query: %', _query;
  --RAISE EXCEPTION 'Query: %', _query;
  EXECUTE _query INTO _result;
  RETURN _result;
END
...
Рейтинг: 0 / 0
не воспринимает quote_literal
    #34396632
BlackDan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С помощью RAISE LOG / RAISE EXCEPTION можно посмотреть, какой будет сформирован запрос (_query) с использованием quote_literal и без её использования
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / не воспринимает quote_literal
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]