一、SQL语句应该考虑哪些安全性?
- 防止SQL注入,对特殊字符进行过滤、转义或者使用预编译的SQL语句绑定变量
- 当SQL语句运行出错时,不要把数据库返回的错误信息全部显示给用户,以防止泄露服务器和数据库相关信息。
二、什么是SQL注入?
举例来说,在后台写的java代码拼的SQL如下:
public List getInfo(String ename){
StringBuffer buf=new StringBuffer();
buf.append("select empno,ename,deptno from emp where ename='").append(ename).append('");
.....
.....
}
假设前端输入ename的是:
'or'1'='1
那么就会涉及到sql注入的问题了。上面的ename与后端的select拼接为:
select empno,ename,deptno from emp where ename=''or'1'='1'
以上的where条件永远成立,如此查询到的结果是所有成员的信息,涉及安全问题。
如果是insert或者是update等语句,会造成不可估计的错误。
上面这种不安全的情况是在SQL语句拼接的情况下发生。
三、解决方法:
1、参数绑定:不用拼接SQL字符串,可以用prepareStatement,参数用set方法进行填装。
2、检查变量的数据类型和格式:
如果是类似where id={$id}这种形式,数据库里所有的id都是数字,在SQL执行前检查确保变量id的类型。
因此,只要有固定格式的变量,在SQL语句执行前,应该严格检查格式,确保变量是预想的格式,可以有效避免SQL注入。
3、所有的SQL语句都封装在存储过程中:可以避免SQL注入,还可以提高性能。