Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да избягате от специалните символи на mysql с sockets.io/node.js/javascript

Не го правете

Питате за грешното решение на проблема.

За да замените апострофите с обратна наклонена черта-апострофи, можете да използвате:

str = msg.replace(/'/g, '\\\'');

но не трябва да правите това . Предоставям само тази информация, защото това е въпросът ви, но прочетете по-долу.

Защо това е лоша идея

Не трябва да го правите от страна на клиента и не трябва да го правите от страна на сървъра. Ако избягването на уязвимости при инжектиране на SQL беше прост въпрос на замяна на апострофите с обратна наклонена черта-апострофи, това нямаше да е проблем. За съжаление е по-сложно.

Имайки информацията, която сте предоставили, дори е невъзможно да се каже дали обратната наклонена черта-апостроф би направил това, което очаквате на първо място, без да видите вашия код, който всъщност прави заявки към базата данни. Но това няма значение, защото никога не трябва да правите това. никога. Вижте тези отговори, за да разберете защо - тези въпроси не са за SQL инжекции, но примерите за код включват уязвимости при инжектиране на SQL и отговорите го обясняват:

Задължителен комикс

Какво трябва да направите вместо това

След като казахме това, не казахте какъв модул използвате, за да отправяте заявки към базата данни, но няма значение дали използвате mysql module или Sequelize или нещо, което си заслужава, винаги трябва да има механизъм за интерполиране на променливи по безопасен начин без ръчно избягване и конкатениране на низовете.

Примери

Не сте показали дори един ред код, който е подходящ тук, така че не мога да ви кажа как да го поправите, но разгледайте този пример:

Опасно:

connection.query(
  "SELECT * FROM player WHERE nick = '"
  + data.login + "' AND pass = '" + data.pass + "'",
  function (err, rows) {
    //...
  }
);

Все още опасно, сложно, нечетливо, неподдържащо се и ненадеждно:

connection.query(
  "SELECT * FROM player WHERE nick = '"
  + data.login.replace(/'/g, '\\\'') + "' AND pass = '" + data.pass.replace(/'/g, '\\\'') + "'",
  function (err, rows) {
    //...
  }
);

Безопасно и просто:

connection.query(
  "SELECT * FROM player WHERE nick = ? AND pass = ?", [data.login, data.pass],
  function (err, rows) {
    // ...
  }
);

Повече информация

За повече информация вижте документите:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Много състояния на края на заявката в MySQL, всички връзки се използват за броени минути

  2. MYSQL заявката се изпълнява много бавно

  3. MySQL Присъединете множество редове като колони

  4. Внедряване в няколко облака за MySQL репликация

  5. Какво е поведението на оператора минус между две дати и времена в MySQL?