Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como escapar caracteres especiais do mysql com sockets.io/node.js/javascript

Não faça isso


Você está perguntando sobre a solução errada para o problema.

Para substituir os apóstrofos por apóstrofos de barra invertida, você pode usar:
str = msg.replace(/'/g, '\\\'');

mas você não deve fazer isso . Estou apenas fornecendo essa informação porque é sobre isso que sua pergunta pergunta, mas leia abaixo.

Por que é uma má ideia


Você não deve fazer isso no lado do cliente e também não deve fazer no lado do servidor. Se evitar vulnerabilidades de injeção de SQL fosse uma simples questão de substituir apóstrofos por apóstrofos de barra invertida, então não seria um problema. Infelizmente é mais complicado.

Tendo as informações que você forneceu, é até impossível dizer se o apóstrofo de barra invertida faria o que você espera em primeiro lugar sem ver seu código que realmente faz as consultas ao banco de dados. Mas não importa, porque você nunca deve fazer isso. Nunca. Veja essas respostas para ver o porquê - essas perguntas não são sobre injeções de SQL, mas os exemplos de código incluem vulnerabilidades de injeção de SQL e as respostas explicam isso:

Tirinha obrigatória



O que você deve fazer em vez disso


Dito isto, você não disse qual módulo está usando para consultar o banco de dados, mas não importa se está usando o mysql module ou Sequelize ou qualquer coisa que valha a pena, sempre deve haver um mecanismo de interpolação de variáveis ​​de maneira segura sem escapar manualmente e concatenar as strings.

Exemplos


Você não mostrou nem uma única linha de código relevante aqui, então não posso dizer como corrigi-lo, mas considere este exemplo:

Inseguro:

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

Ainda inseguro, complexo, ilegível, insustentável e não confiável:

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

Seguro e simples:

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

Mais informações


Para mais informações consulte os documentos: