使javascript字符串成为sql友好的

b1uwtaje  于 2022-10-30  发布在  Java
关注(0)|答案(9)|浏览(133)

有没有办法让传递给NodeJS的javascript字符串对MySQL友好呢?我正在尝试将一个电子邮件地址传递给我的NodeJS服务器,并查询MySQL数据库。当使用常规文本(如用户名)时,效果很好,但电子邮件地址没有。使用escape显然不是正确的答案,因为它不适用于SQL插入。我假设我需要PHP函数mysql_real_escape_string()的代码行。

ut6juiuv

ut6juiuv1#

事实证明,mysql_real_escape_string()是非常微不足道的。According to the documentation

**mysql_真实的_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
            default:
                return char;
        }
    });
}

注意:我还没有通过任何类型的单元测试或安全测试来运行它,但它似乎确实工作了--而且,作为一个额外的好处,它转义了制表符、退格和'%',所以它也可以用于LIKE查询,这是OWASP的建议(与PHP原始版本不同)。

我确实知道mysql_real_escape_string()是字符集感知的,但我不确定这会增加什么好处。
有一个很好的讨论这些问题over here

6yoyoihd

6yoyoihd2#

我知道了一个很难的方法,即向这个函数传递数字会导致使用它的整个过程安静地结束。所以我添加了一个小测试:

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

wgeznvg73#

对于那些从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 );
pjngdqdw

pjngdqdw4#

如果有人正在查找,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驱动程序的内容。

s6fujrry

s6fujrry5#

使用数组而不是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);
vjhs03f7

vjhs03f76#

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

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

npm install sqlstring

如果您使用TypeScript,您还可以安装类型:

npm install @types/sqlstring

然后使用它:

import { escape } from 'sqlstring';

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

omjgkv6w7#

如果你正在玩中日韩字符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
anauzrmj

anauzrmj8#

为什么不简单地使用内置函数escape呢?

var escaped_str = escape(your_unescaped_string);

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

t98cgbkg

t98cgbkg9#

这是在JavaScript代码中编写SQL查询简单方法
常量查询= INSERT INTO users (firstName, lastName) VALUES ( "${firstName}", "${lastName}")

相关问题