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:
- nie można używać znaku wstecznego podczas korzystania z nodejs 7.3.0
- Node js – Ostrzeżenie o odrzuceniu obietnicy podczas przetwarzania dużej ilości danych
- Czy możliwe jest nasłuchiwanie wystąpienia obiektu w Node.js?
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: