Очищает ли pg (node-postgres) данные автоматически?

Я использую node-postgres для производственного приложения, и мне интересно, есть ли что-то, о чем я должен беспокоиться? Данные автоматически дезинфицируются node-postgres?

Я ничего не нашел об этом на странице github: https://github.com/brianc/node-postgres


person Luke Schlangen    schedule 04.01.2017    source источник


Ответы (3)


Это зависит от того, как вы выполняете свои запросы:

Форматирование через Prepared Statements выполняется сервером, который, в свою очередь, очищает ваш запрос от любых SQL-инъекций. Но у него есть и другие ограничения, например, вы не можете выполнять более одного запроса за раз, и вы не можете предоставлять очищенные имена сущностей, когда это необходимо.

Форматирование запроса на стороне клиента, подобное реализованному в pg-promise, очищает значения, плюс предлагает гибкость в форматировании имен объектов и множественных запросов.

person vitaly-t    schedule 04.01.2017
comment
Глупый вопрос - можно ли считать форматированный строковый запрос подготовленным оператором, если он передается в .query? где документы по этому поводу? - person Vincent Buscarello; 16.05.2020
comment
или это должен быть такой синтаксис? var queryText = 'INSERT INTO users(password_hash, email) VALUES($1, $2) RETURNING id' client.query(queryText, ['841l14yah', '[email protected]' - person Vincent Buscarello; 16.05.2020
comment
получил это здесь github.com/brianc/node-postgres/wiki/FAQ - person Vincent Buscarello; 16.05.2020
comment
@VincentBuscarello Запрос выполняется как Подготовленное заявление, когда он передается в метод запроса как {name, text, values}. - person vitaly-t; 16.05.2020

Абсолютно! Поддержка параметризованных запросов в node-postgres является первоклассной. Все экранирование выполняется сервером postgresql, обеспечивающим правильное поведение на диалектах, кодировках и т. д. Например, это не будет внедрять sql:

client.query("INSERT INTO user(name) VALUES($1)", ["'; DROP TABLE user;"], function (err, result) {
  // ...
});

Это из их документации.

person Tuan Anh Tran    schedule 04.01.2017

В основном это зависит от того, как вы выполняете свои запросы, как описано @vitaly-t

Предположим, вы определите запрос в строке и выполните его следующим образом:

var query = `SELECT * FROM table where username='${username}' and password='${password}`;
        
pool.query(query, (error, results) => {
});

В этом случае, если бы я передал username=' 'или 1=1; -- и пароль=' 'или 1=1; --

Затем он вернет все записи из таблицы (означает, что SQL-инъекция работает)

Но если бы я выполнил следующий запрос

pool.query('SELECT * FROM table where username=$1 and password=$2', [username, password], (error, results) => {
});

Тогда SQL-инъекция никогда не сработает, потому что pg очистит данные.

Так что это зависит от того, как вы выполняете запросы.

person Ankit    schedule 25.02.2019
comment
Разве это не должно быть query = "SELECT * FROM table where username='${username}' and password='${password}'" ? PS: не удалось добавить ` - person Madeo; 04.12.2020