Re: libpq: What can and cannot be bound? How to know?

Поиск
Список
Период
Сортировка
От Laurenz Albe
Тема Re: libpq: What can and cannot be bound? How to know?
Дата
Msg-id 6454cf9a4599cc4983a26613612e110917243ed0.camel@cybertec.at
обсуждение исходный текст
Ответ на libpq: What can and cannot be bound? How to know?  (Dominique Devienne <ddevienne@gmail.com>)
Ответы Re: libpq: What can and cannot be bound? How to know?
Список pgsql-general
On Wed, 2023-06-21 at 11:00 +0200, Dominique Devienne wrote:
> For example with [NOTIFY][1]. The doc states:
>
> > Payload: This must be specified as a simple string literal
>
> Does that mean we cannot bind the payload?
> I.e. the pseudo code:
> ```
> conn.exec(bind(msg), "NOTIFY {} $1", conn.escapeName(channel));
> ```
>  is invalid? And I must use instead
> ```
> conn.exec("NOTIFY {} {}", conn.escapeName(channel), conn.escapeLiteral(msg))`?
> ```
> I can try, of course, but could there be a obvious way to know what can and cannot be bound, just from the doc?
>
> That would make it easier to deal with SQL injection to be able to bind for example.
> And knowing what can be bound would be useful.

This is not adequately documented.

The documentation for PREPARE says:

  Any SELECT, INSERT, UPDATE, DELETE, MERGE, or VALUES statement.

so NOTIFY is not supported.  However, you need some inside knowledge to know
that what you are running is an "unnamed prepared statement" and that the limitation
stated in PREPARE applies.

Yours,
Laurenz Albe



В списке pgsql-general по дате отправления:

Предыдущее
От: Tomas Vondra
Дата:
Сообщение: Re: pb with join plan
Следующее
От: Dominique Devienne
Дата:
Сообщение: Re: libpq: What can and cannot be bound? How to know?