SIMS已经完工一段时间了,但是对其的学习还远远不够。通过自己的调试和龙哥的验收,这里出现了很多问题,在这里我从问题的角度出发,总结一下SIMS,因为错误是我们的短板,是我们的不足,我们可以犯错误,但是不要重复犯错误就行。当然一些问题可以扩延到更多的系统,它不仅仅是针对SIMS系统的,而是一些做项目的一些共性的问题,希望对大家有所帮助!
这里我把问题大概归结为了三大方面:
一,数据安全方面:以后我们做的软件一般都和数据库连接,这样对于数据库的安全性问题就是非常需要重视了。在这个系统中,遇到最严重的一个问题就是,SQL语句注入。因为在这个系统的主体部分就是对数据库数据的增删改查,但是这是需要不同权限用户才可以对其进行操作呢。下边我举个简单例子:
大家看这个界面,一般情况,我们是通过已经存储的用户和密码才能进入管理系统界面。
我们这阶段访问数据库的代码:
txtSQL = "select* from user_Info where user_ID = '" & txtusername.text & _"'and密码='" & txtpassword.text & "'"
SQL注入:在对应的输入框中输入 '_'or'_'='_'其中_代表任意字符我们就可以登录进去。
原因:txtSQL = "select * from user_Info where user_ID = '" &'1'or'1'='1' & _"'and 密码='" & '1'or'1'='1' &"'"
大家注意看这是我通过SQL server2008查询得到的结果:
他是把你数据库中的所有数据全部查出,当然能进去!而根本原因就是出在or这个字眼上,意思是查询的信息满足账户=2或者2=2,当然2=2为真值,所以会查出所有结果。
解决方法:1,因为通过这样的查询,他是查询出来符合2=2的结果,也就是所有的结果,这里我们可以限制其查出结果的数量,来防止SQL注入:语法如下
If mrc.RecordCount > 1 Then’如果查出来的条数多以1,则弹出提示框!
MsgBox "非法登陆!"
Exit Sub
End If
2,因为在使用SQL语句注入时,他用到了很多标点符号,例如,单引号 ',等号=……而我们在输入框的输入一般不会出现这种情况,这里我们就可以利用replace函数把输入这些符号给替换掉,这样也就可以避免了:语法如下:
Public Function inputstring(ByVal mystr As String) As String’定义一个替换函数,替换掉里边的符号
mystr = Trim(mystr)
mystr = Replace(mystr, "'", "''")
mystr = Replace(mystr, "or", " ")
mystr = Replace(mystr, "and", " ")
mystr = Replace(mystr, "=", " ")
mystr = Replace(mystr, ";", " ")
End Function
将需要替换的文本写成inputstring(*****)的形式,就可以防止这些字符的输入,当然我认为这并不是根本的。
更过关于SQL语句注入的文章,看龙哥的博客:
http://blog.csdn.net/xiaoxian8023/article/details/6720018
http://blog.csdn.net/xiaoxian8023/article/details/6720031
http://blog.csdn.net/xiaoxian8023/article/details/6720040
当然数据的安全,还包括很多,这里我遇到了这点,就拿这点谈谈,这要我们考虑到这些情况才会防止黑客的攻击。
二,方便用户角度:
1,必须要用软件的说明,即使软件再简单,也要有帮助。因为帮助就是用户使用这款软件的指南针。
2,对于一些确定,取消等按钮需要我们添加快捷键;
3,对于一些重要的操作(如,删除,退出等),需要我们给以提示框提示,给用户一个思考的机会。
4,对于listbox的一些选择,不仅需要单击添加或删除按钮,双击对象我们也应该实现添加删除,因为很多用户觉得这样方便。
…………
总而言之,就是为了使用户用着软甲更容易上手,更方便操作,需要我们多思考思考,尤其站在用户的角度去想一些问题。
三,从合理,符合常规的角度:
1,对于,一些说明帮助等,我们要做到的是用户不能给以修改,这些东西应该是只读类型的。
2 ,对于用户的登录密码我们要考虑到空格等一些特殊的字符。要是那些不能用的话,要给出说明。
3,对于一些姓名,设定好的班号,年级号,我们要做到的限定这些输入框,只能是选择,例如性别只能选择男女,而不能输入别的内容。
4,另外,每个输入框,显示框,他会对应数据库中 某个表格,这里我们要做的根基实际情况限定输入的字符长度,字符类型,否则出现类型错误,或者数据过长,而引起软件崩溃。
5,对于数据库中没有数据的特殊情况我们也要考虑到,这里我们可以利用记录集mrc的recordcount属性来判断一下,如果是空可以给出提示!
……
总之,对于一些软件,一些常规的合理的,符合大众的东西,我们要给出,这是先把最基本的实现,对于创新是我们实现这个以后的事!
SIMS完工了,不代表我们学习这个工程已经好了,我们要做的是不断的反复,不断从一个工程找更多的相同点,使之对我们以后的学习也好,做工程也好,产生一定的影响,积累一定个经验!