Как исправить функцию с помощью запроса postgres, чтобы предотвратить внедрение SQL - PullRequest
2 голосов
/ 11 июня 2019

Мне нужна помощь в исправлении написанной мной функции (в микросервисе node.js без сервера) для предотвращения внедрения SQL.Я новичок в вопросах безопасности, поэтому любые идеи или указания в правильном направлении были бы замечательными, спасибо!

Вот функция из RecipientAlerts.js:

  updateRecipient(email, body, callback) {
    helper.removeRecipient(this.db, email) // clears old data
      .then(() => {
        const values = Object.keys(body).map(industry => 
          body[industry].map(company => 
            `('${company}', '${industry}', '${email}')`).join(', ')).join(', ');
        const insert =`INSERT INTO recipient_list(company, industry, email_address) VALUES `;
        this.db.queries.none(insert + values)             
          .catch((error) => {
            console.log(error, 'error on insert query', callback);
          });
      })
      .then(() => {
        console.log('successfully updated', null, callback);
      })
      .catch((error) => {
        console.log(error, 'failed to update recipient', callback);
      });
  }

Вот receient.json :

{ 
    "pathParameters": {
        "email": "john@gmail.com"
    },
    "body": {
        "tech": ["Apple"],
        "hospitality": ["McDonalds", "Subway"],
        "banking": ["Citi", "HSBC"]
    }
}

Ожидаемый результат (который я сейчас получаю и хочу остаться прежним): receient_list таблица:

company       |  industry   | email_address
______________|_____________|________________
Apple         | tech        | john@gmail.com
--------------|-------------|---------------
McDonalds     | hospitality | john@gmail.com
--------------|-------------|---------------
Subway        | hospitality | john@gmail.com
--------------|-------------|---------------
Citi          | banking     | john@gmail.com
--------------|-------------|---------------
HSBC          | banking     | john@gmail.com

Ответы [ 2 ]

1 голос
/ 11 июня 2019

После многострочных вставок примеров с pg-обещанием объявите объект ColumnSet один раз:

const cs = new pgp.helpers.ColumnSet([
    'company',
    'industry',
    {name: 'email_address', prop: 'email'}
], {table: 'recipient_list'});

Затем выможно изменить свой код следующим образом:

updateRecipient(email, body, callback)
{
    helper.removeRecipient(this.db, email) // clears old data
        .then(() => {
            const insert = pgp.helpers.insert(body, cs); // generating the INSERT query
            this.db.queries.none(insert) // executing the INSERT query
                .catch((error) => {
                    console.log(error, 'error on insert query', callback);
                });
        })
        .then(() => {
            console.log('successfully updated', null, callback);
        })
        .catch((error) => {
            console.log(error, 'failed to update recipient', callback);
        });
}

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

0 голосов
/ 11 июня 2019

Я настоятельно рекомендую использовать sequelize, он будет обрабатывать его автоматически

Вот документ

...