sql >> Database >  >> RDS >> Mysql

Hoe te ontsnappen aan speciale tekens van mysql met sockets.io/node.js/javascript

Niet doen

U vraagt ​​naar de verkeerde oplossing voor het probleem.

Om de apostrofs te vervangen door backslash-apostrofs kunt u het volgende gebruiken:

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

maar dat moet je niet doen . Ik geef alleen die informatie omdat dat is waar uw vraag over gaat, maar lees hieronder.

Waarom het een slecht idee is

Je zou het niet aan de client-kant moeten doen en je zou ook niet aan de server-kant moeten doen. Als het vermijden van kwetsbaarheden door SQL-injectie een kwestie was van het vervangen van apostrofs door backslash-apostrofs, dan zou het geen probleem zijn. Helaas is het ingewikkelder.

Met de informatie die je hebt verstrekt, is het zelfs onmogelijk om te zeggen of backslash-apostrof zelfs zou doen wat je verwacht in de eerste plaats zonder je code te zien die de databasequery's daadwerkelijk maakt. Maar dat maakt niet uit, want dat zou je nooit moeten doen. Nooit. Bekijk die antwoorden om te zien waarom - die vragen gaan niet over SQL-injecties, maar de codevoorbeelden bevatten kwetsbaarheden voor SQL-injectie en de antwoorden leggen het uit:

Verplichte strip

Wat u in plaats daarvan moet doen

Dat gezegd hebbende, je hebt niet verteld welke module je gebruikt om de database te doorzoeken, maar het maakt niet uit of je de mysql gebruikt module of Sequelize of iets dat de moeite waard is, er moet altijd een mechanisme zijn om variabelen op een veilige manier te interpoleren zonder handmatig te ontsnappen en de strings aaneen te schakelen.

Voorbeelden

Je hebt zelfs geen enkele regel code getoond die hier relevant is, dus ik kan je niet vertellen hoe je dit kunt oplossen, maar beschouw dit voorbeeld:

Onveilig:

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

Nog steeds onveilig, complex, onleesbaar, onhoudbaar en onbetrouwbaar:

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

Veilig en eenvoudig:

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

Meer info

Zie de documenten voor meer informatie:




  1. Verbinding maken met MySQL vanaf de opdrachtregel

  2. MySQL:wat is een pagina?

  3. Gebruik van SqlParameter in SQL LIKE-clausule werkt niet

  4. Gefilterde indexen en INBEGREPEN kolommen