代码改变世界

9月19日培训日记

2006-09-20 06:35  java ee spring  阅读(159)  评论(0编辑  收藏  举报
今天复习前面所讲解的JDBC基础知识,因为袁老师前两天刚讲解了SQL Server 2005数据库,所以,今天采用SQL Server 2005作为实验数据库。
首先现场演示如何获得SQL Server 2005的JDBC驱动程序,如何使用该驱动程序连接上目标数据库。接着编写一个较为完善的用户登陆程序:将jdbc连接串、户名、密码和驱动程序参数配置信息从源文件中独立出,在一个属性配置文件中进行设置,用一个Configurer类封装属性文件的信息读取。用一个DbHelper类负责获取连接、关闭结果集、关闭命令、关闭连接。
程序编写完成后,强调在配置文件中不要使用sa帐户连接数据库,而应该创建新帐户分配给客户端使用。采用新帐户以后,总是报告打不开数据库的错误,这需要把用户映射到数据库上。然后报告没有相应的操作权限,这还需要在数据库中设置用户对库中的表进行的操作权限。
演示完sql注入后,课后发现一些学员对sql注入的基本思想明白,但对其中的细节还一时想不太明白,最后让一些明白了的学员上台讲解,发现必须用下面很细致的过程进行分析,才能让所有学员明白:
(1)先讲登陆程序的处理思路
(2)然后分析不知道用户名和密码而能够登入的语句,画出每部分的结果,然后再是两两相与(或)的结果,最后得到整个where条件的结果
(3)最后讲输入怎样的用户名和密码,才能让程序中的sql语句拼凑成上面的语句,我画出框图插入的效果才让一位学员明白。
接着将程序改写成“先查用户名,再比较密码”的方式,这种情况下,无法再使用sql injection方式进行登陆了,并且可以判断出是用户名错误、还是密码错误,但是,这种方式也可以被不法用户利用,可以通过单引号让程序出错。
接着讲解如何对单引号进行替换,但一个新问题产生了:sql server和mysql的转义字符是不同的,这样的处理方式不具有通用性。讲解到这里时,我捕获到了一个很好的讲解举例:stmt,cn的关闭语句在什么时候可能不被执行,什么时候会发生后面的命令执行失败导致要事务回滚:人家采用sql注入导致程序出错,程序跑飞了的时候。
接着改用PreparedStatement改写上面两种登陆方式的程序,这时可以避免sql注入的问题,总结结论:
PreparedStatement可以防止sql injection,在我们脑海里,以后不要再有Statement,应该让Statement彻底从我们脑海里清除掉!
最后,再次讲解如何用模板方法模式和策略模式对程序进行重构。
作业:学员们应借鉴我讲解和实验的步骤,自己编写出这个较完整的登陆程序,并能想人讲解整个程序的设计和编写思路,最好是能将junit,log与ant全部应用起来。