Mysql
 sql >> Database >  >> RDS >> Mysql

Come sfuggire ai caratteri speciali di MySQL con sockets.io/node.js/javascript

Non farlo

Stai chiedendo la soluzione sbagliata al problema.

Per sostituire gli apostrofi con apostrofi backslash potresti usare:

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

ma ​​non dovresti farlo . Sto fornendo queste informazioni solo perché è quello che chiede la tua domanda, ma leggi di seguito.

Perché è una cattiva idea

Non dovresti farlo sul lato client e non dovresti nemmeno farlo sul lato server. Se evitare le vulnerabilità dell'iniezione SQL fosse una semplice questione di sostituzione degli apostrofi con apostrofi backslash, non sarebbe un problema. Purtroppo è più complicato.

Avendo le informazioni che hai fornito è persino impossibile dire se backslash-apostrophe farebbe anche quello che ti aspetti in primo luogo senza vedere il tuo codice che effettivamente esegue le query del database. Ma non importa perché non dovresti mai farlo. Mai. Guarda queste risposte per capire perché:quelle domande non riguardano le iniezioni SQL, ma gli esempi di codice includevano vulnerabilità di SQL injection e le risposte lo spiegano:

Fumetto obbligatorio

Cosa dovresti fare invece

Detto questo, non hai detto quale modulo stai usando per interrogare il database, ma non importa se stai usando mysql modulo o Sequelize o qualsiasi altra cosa degna di nota, dovrebbe esserci sempre un meccanismo per interpolare le variabili in modo sicuro senza eseguire manualmente l'escape e concatenare le stringhe.

Esempi

Non hai mostrato nemmeno una singola riga di codice rilevante qui, quindi non posso dirti come risolverlo, ma considera questo esempio:

Non sicuro:

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

Ancora pericoloso, complesso, illeggibile, non manutenibile e inaffidabile:

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

Sicuro e semplice:

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

Maggiori informazioni

Per maggiori informazioni vedere i documenti: