前面这篇文章介绍了SQL注入,并且主要就PHP的内容做了实验:
http://www.cnblogs.com/charlesblc/p/5987951.html
还有这篇文章对处理方案做了介绍(PreparedStatement in PDO or mysqli)
http://www.cnblogs.com/charlesblc/p/5988919.html
那么对于Java是怎样的情况呢?
首先,尽量避免sql拼接,并且参数加引号。使用正则过滤,前端过滤。使用字符串转换,转义处理。
最终,尽量采用预编译语句集 PreparedStatement。
分析得出,PreparedStatement相比Statement基本解决了SQL注入问题,而且效率也有一定提升。
PreparedStatement对参数都做了转义,不允许引号的直接传递;
不允许传参过程中改变sql的逻辑结构,不允许在不同的插入时间改变查询的逻辑结构;
使用PreparedStatement提供的传参接口setXXX,在类型有误时会直接报错。
基本SQL注入就被过滤了(用基本,是因为现在也预测不到后面攻击技术是否有突破或者新的漏洞发现)。
另外,WEB层我们可以过滤用户的输入来防止SQL注入比如用Filter来过滤全局的表单参数。
Java连接数据库基本使用Mybatis(之前也用Hibernate)。裸JDBC调用,基本很少用了。所以就不实验了。