通常情况下,可以使用预编译解决sql注入问题,当有特殊业务场景必须使用拼接时,我们要对sql进行过滤
解决方案
- 只允许ASCII 码(0~128),超过128认为是恶意字符
- 过滤危险字符,防止逃逸
'
"
\
\r
\n
\0
例如如下语句:
select * from table where name='text';
假设此时text的值为
1' or '1'='1
那么这个sql语句就变成了
select * from table where name='1' or '1'='1';
那么这个sql语句将永远查询所有的行而不用管name的值
- 过滤退出等危险字符
0x1a
- 要求编码中必须用单双引号包含需要拼接内容
举个例子
select * from table where name=text;
如果text的值为:
1 or 1=1
那么语句变成了:
select * from table where name=1 or 1=1;
那么我们过滤单引号双引号就没有意义了