2011-10-12 9 views
35

Czy jest tam, aby ciąg znaków javascript był przekazywany do NodeJS przyjaznego dla MySQL? Próbuję przekazać adres e-mail do mojego serwera NodeJS i wysłać zapytanie do bazy danych MySQL. Robiąc zwykły tekst, taki jak nazwa użytkownika, działa dobrze, ale adres e-mail nie działa. Używanie ewakuacji wyraźnie nie jest właściwą odpowiedzią, ponieważ nie jest przeznaczone do wstawiania SQL. Zakładam, że potrzebuję czegoś na linii funkcji PHP mysql_real_escape_string().Tworzenie javascript string sql friendly

+0

Trzeba coś wzdłuż linii odkażania wejście i wtedy coś na wzór właściwej biblioteki mysql, który pozwala przechodzić w par klucz/wartość do funkcji insert – Raynos

+0

jestem przy użyciu biblioteki NodeJS MySQL, która działa dobrze. Jak powinienem to właściwie oczyścić? – Bobby

+0

Uruchom na nim wyrażenie regexp, jeś li zawiedzie, wyś lij komunikat o błĘ ... dach do klienta. – Raynos

Odpowiedz

44

Okazuje się, że mysql_real_escape_string() jest dość trywialne. According to the documentation:

mysql_real_escape_string() wywołuje funkcję biblioteki MySQL mysql_real_escape_string, która poprzedza backslashy do następujących znaków: \ x00 \ n, \ r, \”" i \ X1A

.

Brzmi dość proste, w rzeczywistości mógłby zrobić coś takiego:.

function mysql_real_escape_string (str) { 
    return str.replace(/[\0\x08\x09\x1a\n\r"'\\\%]/g, function (char) { 
     switch (char) { 
      case "\0": 
       return "\\0"; 
      case "\x08": 
       return "\\b"; 
      case "\x09": 
       return "\\t"; 
      case "\x1a": 
       return "\\z"; 
      case "\n": 
       return "\\n"; 
      case "\r": 
       return "\\r"; 
      case "\"": 
      case "'": 
      case "\\": 
      case "%": 
       return "\\"+char; // prepends a backslash to backslash, percent, 
            // and double/single quotes 
     } 
    }); 
} 

UWAGA: nie mam uruchomić ten wszelkimi s test jednostkowy lub test bezpieczeństwa, ale wydaje się, że działa - i, tak jak dodatkowy bonus, wymyka się z kart, spacji i "%", więc może być również używany w zapytaniach LIKE, zgodnie z OWASP's recommendations (w przeciwieństwie do Oryginał PHP).

Wiem, że mysql_real_escape_string() jest świadomy zestawu znaków, ale nie jestem pewien, jakie korzyści dodać.

Istnieje dobra dyskusja na te tematy: over here.

+0

To całkiem niesamowite @Paul To faktycznie działało. – Bobby

+0

@Bobby Cóż, jestem zaskoczony jak ty! Mam nadzieję, że jest bezpieczna we wszystkich sytuacjach :-) –

+1

@Bobby Nie zapomnij o emotkach, które mogą powodować błąd. coś 'var m = m.replace (/ ([\ uE000- \ uF8FF] | \ uD83C [\ uDF00- \ uDFFF] | \ uD83D [\ uDC00- \ uDDFF])/g ');' może zostać dodany – zipp

8

W przypadku gdy ktoś szuka, ten escapeString() w CUBRID RDBMS działa następująco:

var _escapeString = function (val) { 
    val = val.replace(/[\0\n\r\b\t\\'"\x1a]/g, function (s) { 
    switch (s) { 
     case "\0": 
     return "\\0"; 
     case "\n": 
     return "\\n"; 
     case "\r": 
     return "\\r"; 
     case "\b": 
     return "\\b"; 
     case "\t": 
     return "\\t"; 
     case "\x1a": 
     return "\\Z"; 
     case "'": 
     return "''"; 
     case '"': 
     return '""'; 
     default: 
     return "\\" + s; 
    } 
    }); 

    return val; 
}; 

Jest to fragment CUBRID Node.js driver.

0

Jeśli grasz ze znakami CJK http://en.wikipedia.org/wiki/CJK_characters lub niektórych specjalnych ikon emocjonalnych iOS/Android/Inne ... telefonów komórkowych, takich jak "‡ ‰ ™ ©" lub decodeURIComponent ("\ XF3 \ xBE \ XAD \ xA0") .

Musisz ustawić my.cnf jak ten

[client] 
default-character-set = utf8mb4 

[mysqld] 
character-set-server = utf8mb4 
skip-character-set-client-handshake 
4

Używanie tablic zamiast oświadczenie koperty:

var regex = new RegExp(/[\0\x08\x09\x1a\n\r"'\\\%]/g) 
var escaper = function escaper(char){ 
    var m = ['\\0', '\\x08', '\\x09', '\\x1a', '\\n', '\\r', "'", '"', "\\", '\\\\', "%"]; 
    var r = ['\\\\0', '\\\\b', '\\\\t', '\\\\z', '\\\\n', '\\\\r', "''", '""', '\\\\', '\\\\\\\\', '\\%']; 
    return r[m.indexOf(char)]; 
}; 

//Implementation 
"Some Crazy String that Needs Escaping".replace(regex, escaper); 
+2

Pomyślałem było kilka prostych sposobów, aby to zrobić niż switch w mojej odpowiedzi podejrzewam, że to bardziej efektywne niż ja też, ale oczywiście nie robiłem porównania do zobacz dzięki za przyczynienie się do alternatywnego podejścia –

+1

Łatwiej jest zamienić dwa w przypadku konieczności pójścia w drugą stronę zamiast konieczności pisania innego zestawu instrukcji case.Myślę, że jest również bardziej funkcjonalny i bardziej w duch Javascript. Najprawdopodobniej można by go znacznie poprawić. – Justin

5

nauczkę, że przechodząc numerów do tej funkcji powoduje, że całość proces jest używany do umrzeć po cichu. Więc dodam mały test:

function mysql_real_escape_string (str) { 
    if (typeof str != 'string') 
     return str; 

    return str.replace(/[\0\x08\x09\x1a\n\r"'\\\%]/g, function (char) { 
     switch (char) { 
      case "\0": 
       return "\\0"; 
      case "\x08": 
       return "\\b"; 
      case "\x09": 
       return "\\t"; 
      case "\x1a": 
       return "\\z"; 
      case "\n": 
       return "\\n"; 
      case "\r": 
       return "\\r"; 
      case "\"": 
      case "'": 
      case "\\": 
      case "%": 
       return "\\"+char; // prepends a backslash to backslash, percent, 
            // and double/single quotes 
     } 
    }); 
} 
+0

To jest naprawdę dobre dodatek do zaakceptowanej odpowiedzi. Dzięki. – Dave