介绍
在nodejs中使用sequlize库来查询mysql数据库, 提供了常用的方法有两种:
直接查询sql语句: sequelize.query();
通过接口,如Project.findAll();
sequelize的第2种查询方法在实现上做了防注入处理, 但该方法使用并不是很灵活, 对于经常使用原生sql语句的人来说, 总有一种不适应, 感觉手脚被束缚; 而对于使用方法1, 则必须注意防sql注入;
这里我测试前面提到的两种查询方式如何做到初步的防sql注入功能;
sql注入
产生原因
下面的查询语句, 加入了用户输入的时间项: begin, end, 正常情况是:
begin = 20161101;
SELECT .. FROM tbl WHERE pdate>=20161101 AND ...;
而如果有人故意输入如下的参数, 则就会出现sql注入:
begin = '20161101 AND 1=1; -- hack';
SELECT .. FROM tbl WHERE pdate>=20161101 AND 1=1; -- hack ...;
解决办法
解决上面的办法, 通常有两种:
1. 对输入的参数进行转义, 因为sql注入通常需要'符号来闭合前面的', 这样如果位面在输入的参数中的'全部转义为\', 则查询时就不会出现中断(执行两条sql语句), 参看下面的例子;
2. 设置mysql只能一次执行一条sql语句;
测试
sequelize.query()与Project.findAll()对比
先看代码
var tblName = 'tbl_test', begin