制作一个javascript字符串sql友好

时间:2011-10-12 18:43:34

标签: javascript sql string node.js escaping

是否有将javascript字符串传递给NodeJS友好的MySQL?我正在尝试将电子邮件地址传递给我的NodeJS服务器并查询MySQL数据库。使用常用文本(如用户名)工作正常时,但电子邮件地址却没有。明确地使用转义不是正确的答案,因为它不适用于SQL插入。我假设我需要PHP函数mysql_real_escape_string()的内容。

8 个答案:

答案 0 :(得分:53)

事实证明,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
        }
    });
}

注意:我没有通过任何类型的单元测试或安全测试来运行它,但它似乎确实有效 - 而且,作为一个额外的奖励,它逃脱标签,退格,和'%'所以它也可以在LIKE查询中使用,如OWASP's recommendations(与PHP原文不同)。

我知道mysql_real_escape_string()可以识别字符集,但我不确定它会带来什么好处。

对这些问题进行了很好的讨论over here

答案 1 :(得分: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

答案 2 :(得分:7)

很难理解将数字传递给此函数会导致其使用的整个过程安静地死亡。所以我加了一点测试:

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

答案 3 :(得分: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);

答案 4 :(得分:2)

对于从2018年开始接受此答案的任何人,还值得注意的是,许多javascript数据库框架现在包含connection.escape方法。

例如:

var mysql = require('mysql')

var connection = mysql.createConnection( // your connection string here 

var query = "SELECT THING FROM THING WHERE FRED= " + connection.escape( your_string_here ); 

答案 5 :(得分:1)

对前端项目也适用的解决方案

安装sqlstring(由mysqljs维护的库):

npm install sqlstring --save-dev  

如果您使用 TypeScript ,还可以安装键入内容:

npm install @types/sqlstring --save-dev  

然后使用它:

import { escape } from 'sqlstring';

const escapedString = escape(`it's going to be escaped!`);

答案 6 :(得分: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

答案 7 :(得分:0)

为什么不简单地使用内置函数escape 像这样:

var escaped_str = escape(your_unescaped_string);

这在后端使用MySQL对我有用。