2011-10-12 35 views
35

是否有必要將JavaScript字符串傳遞給NodeJS友好的MySQL?我試圖將電子郵件地址傳遞給我的NodeJS服務器並查詢到MySQL數據庫。當做常規文本,如用戶名工作正常,但電子郵件地址沒有。顯然使用轉義不是正確的答案,因爲它不適用於SQL插入。我假設我需要PHP函數mysql_real_escape_string()的一些東西。製作一個javascript字符串sql友好

+0

你需要沿着正確的MySQL庫,它允許你在鍵/值對傳遞給插入函數 – Raynos

+0

我的線消毒輸入,然後什麼東西線使用工作正常的NodeJS MySQL庫。我將如何正確地進行消毒? – Bobby

+0

運行電子郵件正則表達式,如果失敗,則將錯誤消息發送回客戶端。 – Raynos

回答

44

事實證明,mysql_real_escape_string()非常簡單。 According to the documentation

mysql_real_escape_string()調用MySQL的庫函數mysql_real_escape_string,其中前添加反斜槓以下字符:\ X00,\ n,\ r,\,」,「和\ X1A

聽起來很簡單,其實你可以做這樣的事情:

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 
     } 
    }); 
} 

注意:我沒有經過任何的run這個單元測試或安全測試,但它似乎工作 - 並且,作爲額外的獎勵,它逃脫選項卡,退格和'%',因此它也可以在LIKE查詢中使用,按照OWASP's recommendations(不同於PHP原創)。

我知道mysql_real_escape_string()是字符集意識,但我不確定增加什麼好處。

對這些問題有很好的討論over here

+0

這真是太棒了@Paul那真的很有用。 – Bobby

+0

@Bobby好吧,我和你一樣驚訝!我只希望它在所有情況下都很安全:-) –

+1

@Bobby不要忘記可能引發錯誤的表情符號。類似於 'var m = m.replace(/([\ uE000- \ uF8FF] | \ uD83C [\ uDF00- \ uDFFF] | \ uD83D [\ uDC00- \ uDDFF])/ g,'');' 可以加入 – zipp

8

萬一有人在CUBRID RDBMS作品尋找的escapeString()如下:

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; 
}; 

這是CUBRID Node.js driver的摘錄。

0

如果您使用的是CJK字符http://en.wikipedia.org/wiki/CJK_characters或iOS/Android /其他手機的某些特殊情感圖標(如「 ‡‰™©」或decodeURIComponent(「\ xF3 \ xBE \ xAD \ xA0」)) 。

您將需要設置你的my.cnf這樣

[client] 
default-character-set = utf8mb4 

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

使用數組,而不是一個case語句:

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

我覺得有一些比我的答案中的switch語句更直接的方法,我懷疑它比我的效率更高,但我當然沒有做過比較請參閱。感謝您提供了一種替代方法! –

+1

在不得不另外寫一套病例陳述的情況下,更換兩者更容易。在我看來,它更具功能性,更多Javascript的精神,最有可能會大大改善。 – Justin

5

學到了艱辛的方式,通過數字來此功能使整它被用於安靜地死亡。所以我添加了一個小測試:

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

這是一個非常好的除了接受的答案。謝謝。 – Dave

相關問題