sql >> Databasteknik >  >> RDS >> Mysql

Hur man undkommer mysql specialtecken med sockets.io/node.js/javascript

Gör inte det

Du frågar om fel lösning på problemet.

För att ersätta apostroferna med snedstreck-apostroferna kan du använda:

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

men du bör inte göra det . Jag ger bara den informationen eftersom det är vad din fråga frågar om, men läs nedan.

Varför det är en dålig idé

Du ska inte göra det på klientsidan och du ska inte göra det på serversidan heller. Om att undvika SQL-injektionssårbarheter var en enkel fråga om att ersätta apostrof med backslash-apostrof så skulle det inte vara ett problem. Tyvärr är det mer komplicerat.

Med den information du gav är det till och med omöjligt att avgöra om backslash-apostrophe ens skulle göra vad du förväntar dig i första hand utan att se din kod som faktiskt gör databasens frågor. Men det spelar ingen roll för det ska du aldrig göra. Aldrig. Se dessa svar för att se varför - de frågorna handlar inte om SQL-injektioner men kodexemplen inkluderade SQL-injektionssårbarheter och svaren förklarar det:

Obligatorisk serietidning

Vad du bör göra istället

Som sagt, du berättade inte vilken modul du använder för att fråga databasen men oavsett om du använder mysql modul eller Sequelize eller något som är värt sitt salt, bör det alltid finnas en mekanism för att interpolera variabler på ett säkert sätt utan att manuellt fly och sammanfoga strängarna.

Exempel

Du visade inte ens en enda kodrad som är relevant här så jag kan inte berätta för dig hur du fixar det men tänk på det här exemplet:

Osäkert:

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

Fortfarande osäker, komplex, oläsbar, ohållbar och opålitlig:

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

Säkert och enkelt:

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

Mer information

För mer information se dokumenten:




  1. Funktion för att få antal veckodagar mellan två datum exklusive helgdagar

  2. Användarkontohantering, roller, behörigheter, autentisering PHP och MySQL - Del 2

  3. MySQL:Hur återställer eller ändrar jag MySQL root-lösenordet?

  4. MySQL installation