Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak uciec ze znaków specjalnych mysql za pomocą sockets.io/node.js/javascript

Nie rób tego

Pytasz o niewłaściwe rozwiązanie problemu.

Aby zastąpić apostrofy apostrofami z ukośnikiem odwrotnym, możesz użyć:

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

ale nie powinieneś tego robić . Podaję te informacje tylko dlatego, że o to właśnie pytasz, ale przeczytaj poniżej.

Dlaczego to zły pomysł

Nie powinieneś tego robić po stronie klienta i nie powinieneś robić tego po stronie serwera. Gdyby uniknięcie luk w zabezpieczeniach SQL było prostą kwestią zastąpienia apostrofów apostrofami z odwrotnym ukośnikiem, nie stanowiłoby to problemu. Niestety jest to bardziej skomplikowane.

Mając informacje, które podałeś, nie można nawet stwierdzić, czy apostrof odwrotny ukośnik zrobi to, czego oczekujesz, bez zobaczenia kodu, który faktycznie wykonuje zapytania do bazy danych. Ale to nie ma znaczenia, ponieważ nigdy nie powinieneś tego robić. Nigdy. Zobacz te odpowiedzi, aby zobaczyć, dlaczego — te pytania nie dotyczą wstrzyknięć SQL, ale przykłady kodu zawierają luki w zabezpieczeniach wstrzyknięć SQL, a odpowiedzi wyjaśniają to:

Komiks obowiązkowy

Co powinieneś zrobić zamiast tego

To powiedziawszy, nie powiedziałeś, jakiego modułu używasz do wysyłania zapytań do bazy danych, ale bez względu na to, czy używasz mysql module lub Sequelize lub cokolwiek wartego swojej soli, zawsze powinien istnieć mechanizm interpolacji zmiennych w bezpieczny sposób bez ręcznego unikania i łączenia ciągów.

Przykłady

Nie pokazałeś nawet jednej linii kodu, która jest tutaj istotna, więc nie mogę ci powiedzieć, jak to naprawić, ale rozważ ten przykład:

Niebezpieczne:

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

Wciąż niebezpieczne, złożone, nieczytelne, nie do utrzymania i zawodne:

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

Bezpieczne i proste:

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

Więcej informacji

Więcej informacji znajdziesz w dokumentacji:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konwertuj strftime w żądaniu SQLite na MySQL

  2. Jak zmienić nazwę kolumny w laravelu za pomocą migracji?

  3. Czy JavaScript może łączyć się z MySQL?

  4. Indeksowanie każdej kolumny w tabeli

  5. Google App Engine i Cloud SQL:utracono połączenie z serwerem MySQL podczas „odczytu początkowego pakietu komunikacyjnego”