nodejs+mysql
以下代码是否可以彻底防止sql注入呢?如果不能,请详细说明!
var CHARS_GLOBAL_REGEXP = /[\0\b\t\n\r\x1a\"\'\\]/g;
var CHARS_ESCAPE_MAP = {
'\0' : '\\0',
'\b' : '\\b',
'\t' : '\\t',
'\n' : '\\n',
'\r' : '\\r',
'\x1a' : '\\Z',
'"' : '\\"',
'\'' : '\\\'',
'\\' : '\\\\'
};
function escapeString(val) {
var chunkIndex = CHARS_GLOBAL_REGEXP.lastIndex = 0;
var escapedVal = '';
var match;
while ((match = CHARS_GLOBAL_REGEXP.exec(val))) {
escapedVal += val.slice(chunkIndex, match.index) + CHARS_ESCAPE_MAP[match[0]];
chunkIndex = CHARS_GLOBAL_REGEXP.lastIndex;
}
if (chunkIndex === 0) {
return "'" + val + "'";
}
if (chunkIndex < val.length) {
return "'" + escapedVal + val.slice(chunkIndex) + "'";
}
return "'" + escapedVal + "'";
}
let sql = 'select * from admin where user ='+escapeString(浏览器传入的参数值);
var res = this.query(sql);
仍存在SQL注入漏洞。主要问题在于它使用了字符串拼接的方式来构造SQL查询语句,而没有使用参数化查询。这使得攻击者可以通过构造特定的输入来改变查询的含义,从而执行恶意的操作。
例如,假设浏览器传入的参数值为 '; DROP TABLE admin;',则最终构造的SQL查询语句为:
select * from admin where user = ''; DROP TABLE admin;''
快速创建user表的SQL语句命令如下:
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID,自动递增',
`name` varchar(32) NOT NULL COMMENT '姓名',
`sex` int(11) NOT NULL COMMENT '性别:0 - 男 1 - 女',
`age` varchar(10) NOT NULL COMMENT '年龄',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;