Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So entkommen Sie mysql-Sonderzeichen mit sockets.io/node.js/javascript

Tu es nicht

Sie fragen nach der falschen Lösung des Problems.

Um die Apostrophe durch Backslash-Apostrophe zu ersetzen, könnten Sie Folgendes verwenden:

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

aber das sollten Sie nicht tun . Ich stelle diese Informationen nur bereit, weil Ihre Frage darum geht, aber lesen Sie weiter unten.

Warum es eine schlechte Idee ist

Sie sollten es nicht auf der Clientseite tun und Sie sollten es auch nicht auf der Serverseite tun. Wenn das Vermeiden von SQL-Injection-Schwachstellen einfach darin bestehen würde, Apostrophe durch Backslash-Apostrophe zu ersetzen, wäre dies kein Problem. Leider ist es komplizierter.

Mit den von Ihnen bereitgestellten Informationen ist es sogar unmöglich zu sagen, ob Backslash-Apostroph überhaupt das tun würde, was Sie erwarten, ohne Ihren Code zu sehen, der tatsächlich die Datenbankabfragen durchführt. Aber es spielt keine Rolle, weil Sie das niemals tun sollten. Niemals. Sehen Sie sich diese Antworten an, um zu sehen, warum - diese Fragen beziehen sich nicht auf SQL-Injections, aber die Codebeispiele enthielten SQL-Injection-Schwachstellen und die Antworten erklären es:

Obligatorischer Comic

Was Sie stattdessen tun sollten

Davon abgesehen haben Sie nicht gesagt, welches Modul Sie verwenden, um die Datenbank abzufragen, aber egal, ob Sie mysql verwenden Modul oder Sequelize oder irgendetwas Wertvolles, es sollte immer einen Mechanismus geben, um Variablen sicher zu interpolieren, ohne die Strings manuell zu maskieren und zu verketten.

Beispiele

Sie haben nicht einmal eine einzige Codezeile gezeigt, die hier relevant ist, daher kann ich Ihnen nicht sagen, wie Sie das Problem beheben können, aber betrachten Sie dieses Beispiel:

Unsicher:

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

Immer noch unsicher, komplex, unlesbar, nicht wartbar und unzuverlässig:

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

Sicher und einfach:

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

Weitere Informationen

Weitere Informationen finden Sie in den Dokumenten: