Предотвращение SQL-инъекций с Nodejs и Postgres - PullRequest
0 голосов
/ 30 сентября 2019

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

Это функция, которую я использую для запроса данных:

var pg = require("pg");

var client = new pg.Client(connectionString);
client.connect();

module.exports = async function newQuery(query) {
        var result = await client.query({
        rowMode: 'array',
        text: query
        });
        return result.rows
}

А вот некоторые стандартные запросы, использующие эту функцию (query()):

SELECT

query("SELECT profilename, profiledescription, approved FROM profiledb 
WHERE usercompany='"+ req.query.userCompany +"';").then(data => {
        res.send(data)
    })

ОБНОВЛЕНИЕ

query("UPDATE profiledb SET approved='Approved' WHERE id='"+ req.query.id +"';").then(data =>
    res.send(data)
  )

INSERT

query("INSERT INTO profiledb (profilename, profiledescription, approved) VALUES ('"+ 
req.query.profileTitle +"', '"+ req.query.profileBody +"', 'Pending');");

Какой код можно использовать для запроса данных без риска атаки SQL-инъекцией.

Спасибо !!!

Ответы [ 2 ]

3 голосов
/ 30 сентября 2019

Используйте параметризованный запрос и передайте аргументы запроса как values.

module.exports = async function newQuery(query, values) {
    var result = await client.query({
        rowMode: 'array',
        text: query,
        values
    });
    return result.rows
}

query("SELECT profilename, profiledescription, approved FROM profiledb WHERE usercompany=$1;", [req.query.userCompany]).then(data => {
    res.send(data)
});

query("UPDATE profiledb SET approved='Approved' WHERE id=$1;", [req.query.id]).then(data => {
    res.send(data)
})

query("INSERT INTO profiledb (profilename, profiledescription, approved) VALUES ($1, $2, 'Pending');", [req.query.profileTitle, req.query.profileBody]);
2 голосов
/ 30 сентября 2019

Вы должны использовать параметризованные запросы или подготовленные операторы, просто никогда не объединяйте строки самостоятельно. документы этой конкретной библиотеки хороши, поэтому я предлагаю вам прочитать их более подробно.

примеры запросов: документы и подпись client.query: пример

Ваш запрос может быть написан так:

query("SELECT profilename, profiledescription, approved FROM profiledb 
WHERE usercompany = $1", [req.query.userCompany]).then(...)

то же самое для обновлений, вставок и т. Д., Или вы можете просто передать объект со свойствами: текст и значения, подобные этому

const queryOpts = {
  text: "SELECT profilename, profiledescription, approved FROM profiledb WHERE usercompany = $1",
  values: [req.query.userCompany]
}
query(queryOpts).then(...)
...