Лучший способ избежать массива данных по запросу MysQl nodeJS

Таким образом, у меня есть следующий объект с данными, предоставленными пользователем для регистрации:

  var dataToInsert = { 
  userName: 'Wilson J',
  userEmail: 'WilsonJ@gmail.com',
  userAddress: '2020 St.',
  userCellPhone: '95587412',
  }

И я использую следующий запрос, чтобы вставить его:

 var insertQuery = `INSERT INTO users ( ${Object.keys(dataToInsert).toString()} ) VALUES( '${Object.values(dataToInsert).join("','")}' )`;

Который в конце принимается как:

INSERT INTO
  users (
    userName,
    userEmail,
    userAddress,
    userCellPhone
  )
VALUES
  (
    'Wilson J',
    'WilsonJ@gmail.com',
    '2020 St',
    95587412
  )

Пока мне трудно понять, как работает экранирование данных. Я был бы очень признателен, если бы кто-нибудь показал мне, как SQL-инъекция может происходить с этим кодом и как его предотвратить.

Я использую модуль MysQl npm, и у него есть этот метод: mysql.escape() но я хотел бы найти более автоматизированный подход вместо того, чтобы избегать каждого отдельного значения вручную.

2 ответа

Решение

В наше время активно не рекомендуется делать что-либо кроме привязки переменных к вашему запросу. Смотрите это для получения дополнительной информации о других способах экранирования данных:

connection.query(`
    INSERT INTO users ( ${Object.keys(dataToInsert).toString()} ) VALUES (?)`, 
    Object.values(dataToInsert),
    function (error, results, fields) {
      if (error) throw error;
      // ...
    }
);

Предостережение: вы не сможете связать переменные с именами столбцов, поэтому, к сожалению, эта часть запроса необходима. Убедитесь, что ваши ключи вашего dataToInsert являются либо статическими, либо не из какого-либо пользовательского ввода.

В качестве альтернативы вы можете использовать? символы в качестве заполнителей для значений, которые вы хотели бы экранировать следующим образом: [...]

Есть выход. https://github.com/mysqljs/mysql

Другие вопросы по тегам