NodeJS MySQL模块的escape()/escapeId()方法是如何工作的?
我试图理解NodeJS模块的转义方法(为了构建该模块的我的版本),它只是删除了元字符/特殊字符,还是做了一些不同的事情?pacakge使用package进行NodeJS MySQL模块的escape()/escapeId()方法是如何工作的?,mysql,node.js,Mysql,Node.js,我试图理解NodeJS模块的转义方法(为了构建该模块的我的版本),它只是删除了元字符/特殊字符,还是做了一些不同的事情?pacakge使用package进行转义和转义方法 你可以看看它是如何工作的 转义: 数字保持不变 布尔值被转换为true/false 日期对象转换为'YYYY-mm-dd HH:ii:ss'字符串 缓冲区转换为十六进制字符串,例如X'0fa5' 绳子安全地逃脱了 数组转换为列表,例如['a','b']转换为'a','b' 嵌套数组被转换成分组列表(用于批量插入),例如,[[
转义
和转义
方法
你可以看看它是如何工作的
转义
:
- 数字保持不变
- 布尔值被转换为
/true
false
- 日期对象转换为
字符串'YYYY-mm-dd HH:ii:ss'
- 缓冲区转换为十六进制字符串,例如
X'0fa5'
- 绳子安全地逃脱了
- 数组转换为列表,例如
转换为['a','b']
'a','b'
- 嵌套数组被转换成分组列表(用于批量插入),例如,
转换成[[['a',b',]['c',d']
('a','b'),('c','d')
- 具有
方法的对象将调用toSqlString
,并将返回值用作原始SQL.toSqlString()
- 对于对象上的每个可枚举属性,对象被转换为
对。如果属性的值是函数,则跳过它;如果属性的值是对象,则对其调用toString(),并使用返回的值key='val'
转换为未定义/null
null
保持原样。MySQL不支持这些,尝试将它们作为值插入将触发MySQL错误,直到它们实现支持为止NaN/Infinity
转义ID
:
- 数组转换为列表,例如
转换为['a','b']
'a','b'
- 绳子安全地逃脱了
{
'\0' : '\\0',
'\b' : '\\b',
'\t' : '\\t',
'\n' : '\\n',
'\r' : '\\r',
'\x1a' : '\\Z',
'"' : '\\"',
'\'' : '\\\'',
'\\' : '\\\\'
};
如果您谈论的是package,它将package用于
escape
和escapeId
方法。你也可以用它来构建你的模块,而不是自己实现。是的,但这也是一项个人研究,我想知道这背后是什么。我在node_模块中搜索了SqlString模块,没有发现任何内容,因此,我决定在这里提问。为什么要为这样一个关键组件创建自己的版本,而不是使用经过良好测试的版本?@t.niese这个问题也是个人研究,我想知道它是如何工作的,不仅仅是为了构建我的模块版本,所以它只是读取传入的数据,然后以MySQL可接受的格式重写它,对吗?这是防止SQL注入的最佳方法吗?是的,并且还可以转义所有的SQL
——重要的语法,如结束引号(,“
)、注释(--
,*/
)等。@Stecco可以准备语句(取决于它们的实现方式)更安全,因为查询和值的组合步骤由SQL server完成,而不是由第三方库完成。(假设SQL server是最新的,并且维护良好)@t.niese是正确的。@Stecco准备的语句是模块TODO的基石。