Есть ли в SQL механизм для экранирования переменной? - PullRequest
0 голосов
/ 13 декабря 2018

Я напишу хранимую процедуру в PostgreSQL, которая принимает переменную (мои знания SQL близки к нулю, поэтому я прошу прощения, если вопрос очевиден).Поскольку эта переменная будет использоваться дословно в вызове, я хотел убедиться, что она правильно экранирована, чтобы избежать внедрения.

Есть ли функция, в которую я могу обернуть переменную, которая бы правильно выполняла экранирование?

Я специально хотел бы сделать это в SQL, в отличие от очистки входных данных (этой переменной) в коде, который вызывает запрос SQL (что, возможно, было бы проще).

Я удивлен, не обнаружив какой-либо заметной документации о такой функциональности, что заставляет меня полагать, что это не стандартная практика.Наиболее близким я мог быть к исходному коду lexer Postgresql , но я не могу понять, упоминается ли это правильное экранирование (и которое приведет к использованию string в качестве u&’stringuescape’’’, что выглядит довольно варварски)

1 Ответ

0 голосов
/ 13 декабря 2018

В PostgreSQL есть несколько функций цитирования, задокументированных на https://www.postgresql.org/docs/current/functions-string.html

quote_ident(string text)    text    Return the given string suitably quoted to be used as an identifier in an SQL statement string. Quotes are added only if necessary (i.e., if the string contains non-identifier characters or would be case-folded). Embedded quotes are properly doubled. See also Example 40-1.   quote_ident('Foo bar')  "Foo bar"
quote_literal(string text)  text    Return the given string suitably quoted to be used as a string literal in an SQL statement string. Embedded single-quotes and backslashes are properly doubled. Note that quote_literal returns null on null input; if the argument might be null, quote_nullable is often more suitable. See also Example 40-1.    quote_literal(E'O\'Reilly') 'O''Reilly'
quote_literal(value anyelement) text    Coerce the given value to text and then quote it as a literal. Embedded single-quotes and backslashes are properly doubled. quote_literal(42.5) '42.5'
quote_nullable(string text) text    Return the given string suitably quoted to be used as a string literal in an SQL statement string; or, if the argument is null, return NULL. Embedded single-quotes and backslashes are properly doubled. See also Example 40-1.    quote_nullable(NULL)    NULL
quote_nullable(value anyelement)    text    Coerce the given value to text and then quote it as a literal; or, if the argument is null, return NULL. Embedded single-quotes and backslashes are properly doubled.   quote_nullable(42.5)    '42.5'

Но если вы разрабатываете процедуры, которые подготавливают SQL из строки, вы должны вместо этого использовать параметры запроса.

PREPARE fooplan (int, text, bool, numeric) AS
    INSERT INTO foo VALUES($1, $2, $3, $4);
EXECUTE fooplan(1, 'Hunter Valley', 't', 200.00);

Подробнее в https://www.postgresql.org/docs/current/sql-prepare.html

...