sql >> Base de Datos >  >> RDS >> Mysql

Cómo escapar de los caracteres especiales de mysql con sockets.io/node.js/javascript

No lo hagas

Estás preguntando sobre la solución incorrecta al problema.

Para reemplazar los apóstrofes con apóstrofes de barra invertida, puede usar:

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

pero no deberías hacer eso . Solo proporciono esa información porque eso es lo que pregunta su pregunta, pero lea a continuación.

Por qué es una mala idea

No debe hacerlo en el lado del cliente y tampoco debe hacerlo en el lado del servidor. Si evitar las vulnerabilidades de inyección SQL fuera una simple cuestión de reemplazar apóstrofes con apóstrofes de barra invertida, entonces no sería un problema. Lamentablemente es más complicado.

Teniendo la información que proporcionó, es incluso imposible saber si la barra invertida-apostrofe haría lo que esperaba en primer lugar sin ver su código que realmente realiza las consultas de la base de datos. Pero no importa porque nunca deberías hacer eso. Nunca. Vea esas respuestas para ver por qué:esas preguntas no son sobre inyecciones de SQL, pero los ejemplos de código incluyen vulnerabilidades de inyección de SQL y las respuestas lo explican:

Tebeo obligatorio

Qué deberías hacer en su lugar

Habiendo dicho eso, no dijiste qué módulo estás usando para consultar la base de datos, pero no importa si estás usando mysql módulo o Sequelize o cualquier cosa que valga la pena, siempre debe haber un mecanismo de interpolación de variables de una manera segura sin escapar manualmente y concatenar las cadenas.

Ejemplos

No mostraste ni una sola línea de código que sea relevante aquí, así que no puedo decirte cómo solucionarlo, pero considera este ejemplo:

Inseguro:

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

Todavía inseguro, complejo, ilegible, imposible de mantener y poco confiable:

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

Seguro y sencillo:

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

Más información

Para obtener más información, consulte los documentos: