Re: escaping literals (in libpq)
От | Volkan YAZICI |
---|---|
Тема | Re: escaping literals (in libpq) |
Дата | |
Msg-id | 7104a7370504031011207ed759@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: escaping literals (in libpq) (Michael Fuhr <mike@fuhr.org>) |
Список | pgsql-interfaces |
Hi, On Apr 3, 2005 7:33 PM, Michael Fuhr <mike@fuhr.org> wrote: > Here's an excerpt from the PQexecParams() documentation: > > The primary advantage of PQexecParams over PQexec is that > parameter values may be separated from the command string, thus > avoiding the need for tedious and error-prone quoting and > escaping. > > Run some tests: create queries that do simple (but harmless) SQL > injection, submit them unescaped with PQexec() to verify that the > injection works, then escape them and submit them with PQexec() to > verify that escaping prevents the injection, then submit them > unescaped with PQexecParams() and observe what happens, then escape > them and submit them with PQexecParams() and observe what happens. Thanks so much. I engrossed a little bit in my work and forgot the main point in documentation. Here's a little piece of code i scratched: * template1=# SELECT * FROM mytbl; * usernm | passwd | secret * --------+----------+----------------- * volkan| password | Home address...* (1 row)*/ #include <stdio.h> #include <libpq-fe.h> #define BUFLEN 1024 int main(void) { PGconn *conn; PGresult *res; const char user[] = "volkan"; const char passwd[] = "fakepasswd' OR '' = '"; const char *values[2]; char command[BUFLEN]; conn = PQconnectdb("user=postgres dbname=template1"); snprintf(command, BUFLEN, "SELECT secret FROM mytbl WHERE " "user = '%s' AND passwd = '%s'", user, passwd); res = PQexec(conn, command); printf("%d\n", PQntuples(res)); PQclear(res); values[0] = user; values[1] = passwd; res = PQexecParams(conn, "SELECT secret FROM mytbl WHERE " "user = '$1' AND passwd = '$2'", 2, NULL, values, NULL, NULL, 0); printf("%d\n", PQntuples(res)); PQclear(res); return 0; } /* * $ gcc -Wall -lpq execParams.c &&./a.out * 1* 0*/
В списке pgsql-interfaces по дате отправления: