Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment échapper les caractères spéciaux mysql avec sockets.io/node.js/javascript

Ne le fais pas

Vous demandez la mauvaise solution au problème.

Pour remplacer les apostrophes par des apostrophes antislash, vous pouvez utiliser :

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

mais vous ne devriez pas faire cela . Je ne fournis ces informations que parce que c'est ce sur quoi porte votre question, mais lisez ci-dessous.

Pourquoi c'est une mauvaise idée

Vous ne devriez pas le faire côté client et vous ne devriez pas non plus le faire côté serveur. Si éviter les vulnérabilités d'injection SQL consistait simplement à remplacer les apostrophes par des apostrophes antislash, cela ne poserait pas de problème. Malheureusement c'est plus compliqué.

Avec les informations que vous avez fournies, il est même impossible de dire si l'apostrophe antislash ferait même ce que vous attendez en premier lieu sans voir votre code qui effectue réellement les requêtes de base de données. Mais cela n'a pas d'importance car vous ne devriez jamais faire cela. Jamais. Consultez ces réponses pour comprendre pourquoi - ces questions ne concernent pas les injections SQL, mais les exemples de code incluaient des vulnérabilités d'injection SQL et les réponses l'expliquent :

Bande dessinée obligatoire

Ce que vous devriez faire à la place

Cela dit, vous n'avez pas indiqué quel module vous utilisez pour interroger la base de données, mais peu importe si vous utilisez le mysql module ou Sequelize ou tout ce qui vaut son sel, il devrait toujours y avoir un mécanisme d'interpolation des variables de manière sûre sans échapper et concaténer manuellement les chaînes.

Exemples

Vous n'avez même pas montré une seule ligne de code pertinente ici, donc je ne peux pas vous dire comment y remédier, mais considérez cet exemple :

Non sécurisé :

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

Toujours dangereux, complexe, illisible, non maintenable et non fiable :

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

Sûr et simple :

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

Plus d'infos

Pour plus d'informations, consultez la documentation :