sql >> Databáze >  >> RDS >> Mysql

Jak uniknout speciálním znakům mysql pomocí sockets.io/node.js/javascript

Nedělejte to

Ptáte se na špatné řešení problému.

Chcete-li nahradit apostrofy zpětným lomítkem-apostrofy, můžete použít:

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

ale neměli byste to dělat . Tyto informace poskytujem pouze proto, že se jich týká vaše otázka, ale přečtěte si je níže.

Proč je to špatný nápad

Neměli byste to dělat na straně klienta a neměli byste to dělat ani na straně serveru. Pokud by vyhýbání se zranitelnostem vkládání SQL bylo jednoduchou záležitostí nahrazení apostrofů zpětným lomítkem-apostrofy, pak by to nebyl problém. Bohužel je to složitější.

S informacemi, které jste poskytli, je dokonce nemožné říct, zda by zpětné lomítko-apostrof vůbec udělal to, co očekáváte, aniž byste viděli váš kód, který ve skutečnosti dělá databázové dotazy. Ale na tom nezáleží, protože byste to nikdy neměli dělat. Nikdy. Podívejte se na tyto odpovědi a zjistěte proč – tyto otázky se netýkají injekcí SQL, ale příklady kódu zahrnovaly zranitelnosti vkládání SQL a odpovědi to vysvětlují:

Povinný komiks

Co byste měli udělat místo toho

Jak již bylo řečeno, neřekli jste, jaký modul používáte k dotazování databáze, ale bez ohledu na to, zda používáte mysql modul nebo Sequelize nebo cokoli, co stojí za jeho sůl, by měl vždy existovat mechanismus pro bezpečnou interpolaci proměnných bez ručního escapování a zřetězení řetězců.

Příklady

Neukázali jste ani jeden řádek kódu, který je zde relevantní, takže vám nemohu říci, jak to opravit, ale zvažte tento příklad:

Nebezpečné:

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

Stále nebezpečné, složité, nečitelné, neudržovatelné a nespolehlivé:

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

Bezpečné a jednoduché:

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

Další informace

Další informace naleznete v dokumentech:




  1. Funkce LENGTH() v Oracle

  2. Jak automatizovat Galera Cluster pomocí ClusterControl CLI

  3. Vyhledávání v poli utf8_bin v MYSQL rozlišuje velká a malá písmena

  4. Mysql se nemůže připojit - Přístup odepřen (pomocí hesla ano)