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

Sådan undslipper du mysql-specialtegn med sockets.io/node.js/javascript

Lad være med at gøre det

Du spørger om den forkerte løsning på problemet.

For at erstatte apostroferne med backslash-apostroferne kan du bruge:

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

men du bør ikke gøre det . Jeg giver kun disse oplysninger, fordi det er det, dit spørgsmål spørger om, men læs nedenfor.

Hvorfor er det en dårlig idé

Du bør ikke gøre det på klientsiden, og du bør heller ikke gøre det på serversiden. Hvis undgåelse af SQL-injection-sårbarheder var et simpelt spørgsmål om at erstatte apostrof med backslash-apostrof, så ville det ikke være et problem. Desværre er det mere kompliceret.

Med de oplysninger, du har givet, er det endda umuligt at sige, om backslash-apostrof overhovedet ville gøre, hvad du forventer i første omgang uden at se din kode, der rent faktisk laver databaseforespørgsler. Men det gør ikke noget, for du bør aldrig nogensinde gøre det. Aldrig. Se disse svar for at se hvorfor - disse spørgsmål handler ikke om SQL-injektioner, men kodeeksemplerne inkluderede SQL-injektionssårbarheder, og svarene forklarer det:

Obligatorisk tegneserie

Hvad du bør gøre i stedet

Når det er sagt, fortalte du ikke, hvilket modul du bruger til at forespørge i databasen, men uanset om du bruger mysql modul eller Sequelize eller noget, der er salt værd, bør der altid være en mekanisme til at interpolere variabler på en sikker måde uden manuelt at undslippe og sammenkæde strengene.

Eksempler

Du viste ikke en enkelt kodelinje, der er relevant her, så jeg kan ikke fortælle dig, hvordan du løser det, men overvej dette eksempel:

Usikkert:

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

Stadig usikker, kompleks, ulæselig, uvedligeholdelig og upålidelig:

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

Sikkert og enkelt:

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

Flere oplysninger

For mere information se dokumenterne:




  1. MySQL-valg virker meget langsomt, men kan ikke tænke på, hvordan man kan forbedre det?

  2. Forbind mySQL med Android

  3. Funktion eller procedure for en IN-klausul

  4. Hvordan kan jeg indstille en session i codeigniter 3-databasen?