学生管理系统常见错误总结
学生管理系统就算告一段落吧.在写代码调试的过程中遇到了各种问题,总结了一下
①SQL注入
问题描述 :在学生管理系统的登录窗口,用户名输入"or ''=" 这样就可以直接进入系统,这就是系统的一个漏洞
概念:
所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.
产生背景:
当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。相关的SQL注入可以通过测试工具pangolin进行。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态sql命令,或者作为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。
防止SQL注入:
1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双"-"进行转换等。
2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取
。
3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
6.最小权限原则。特别是不要用dbo或者sa账户,为不同的类型的动作或者组建使用不同的账户,最小权限原则适用于所有与安全有关的场合对用户输入进行检查。
7.对一些特殊字符,比如单引号,双引号,分号,逗号,冒号,连接号等进行转换或者过滤;使用强数据类型,比如你需要用户输入一个整数,就要把用户输入的数据转换成整数形式;限制用户输入的长度等等。这些检查要放在server运行,client提交的任何东西都是不可信的使用存储过程,如果一定要使用sq语句,那么用标准的方式组建sql语句,比如可以利用parameters对象,避免用字符串直接拼sq命令。
8.当sql运行出错时,不要把数据库返回的错误信息全部显示给用户,错误信息经常会透露一些数据库设计的细节针对常用的sql注入式攻击方式对症下药
②: 数据库中无数据点击系统会崩
上面的错误相信都会遇到吧 . 这就是由于数据库中,没有数据,执行相应的操作时就会出现这个错误,这也是学生管理系统中最典型的错误了 .对此 问题 我们需要先了解BOE, EOF 的属性
BOF指示当前记录位置位于 Recordset 对象的第一个记录之前。
EOF指示当前记录位置位于 Recordset 对象的最后一个记录之后
使用 BOF和 EOF 属性可确定 Recordset 对象是否包含记录,或者从一个记录移动到另一个记录时是否超出 Recordset 对象的限制。
如果当前记录位于第一个记录之前,BOF属性将返回 True (-1),如果当前记录为第一个记录或位于其后则将返回 False (0)。
如果当前记录位于Recordset 对象的最后一个记录之后 EOF 属性将返回 True,而当前记录为 Recordset 对象的最后一个记录或位于其前,则将返回False。
如果 BOF或 EOF 属性为 True,则没有当前记录。
了解了BOF EOF 在我们队上面的错误进行修改的时候,就可以利用这个性质进行判断 . 例如 :
PrivateSub firstCommand_Click() '第一个记录 If mrc.EOF = False Then mrc.MoveFirst Call viewData Else MsgBox "没有记录!,请添加记录!",vbOKOnly + vbExclamation, "警告" Exit Sub End IfEndSub
这段代码是学生管理系统中当单机第一条记录按钮时的代码,若不利用EOF 判断当前记录是否存在,那当数据库中无记录时就会报错,这样处理后就不会出问题了 .. 对当前记录存在进行判断,在写相应的代码 .
③ Recordset 游标问题
当我们写好系统后,打包发布 ,也许就会遇到这样的问题
对已这个问题 ,我们在定义记录集和连接数据库的变量的时候,设置了游标类型为adopenkeyse,我们写代码的时候:
Dim Rs as ADODB. Recordset
Dim Cnn as ADODB.Connection
Rs.opentrim$(SQL),cnn,adopenkeyset,odlockoptimic
记录集默认的属性一般默认的是adUseServer,在SQL2000无法实现该功能(注:,但在SQL2008中可以直接使用,不用申明) 这时在我们定义Bookmark并调用时就会出现上图中的问题,我们就需要修改记录集的cursorlocation属性
例:Rs.cursorlocation=aduseclient
原因是由于adUseServer使用数据提供者的或驱动程序提供的游标。这些游标有时非常灵活,对于其他用户对数据源所作的更改具有额外的敏感性。但是,Microsoft Client CursorProvider(如已断开关联的记录集)的某些功能无法由服务器端游标模拟,通过该设置将无法使用这些功能。而 adUseClient使用由本地游标库提供的客户端游标。本地游标服务通常允许使用的许多功能可能是驱动程序提供的游标无法使用的,因此使用该设置对于那些将要启用的功能是有好处的。AdUseClient 具有向后兼容性,也支持同义的 。因此在我们写代码时一定要注意这方面的问题
④数据库连接字符串
数据库连接不成功,就会这样(如下图)
对于不同版本的数据库也许连接的字符串并不相同 ,我在做学生管理系统的时候,由于当时用的是SQL2000版本,而且还涉及到了实例名,这对我后来连接数据库都造成了麻烦。例如我在配置好数据源后我需要运行系统,这时数据库就连接不上
连接的代码
我是这样写的:connectString = "driver={sqlserver};server=192.168.24.74;uid=sa;pwd=123456;Database=student" 这是由于,我的SQL 2000不是默认的实例名,这时我就需要在IP后面加上实例名,才能连接上connectString= "driver={sql server};server=192.168.24.74\YDD;uid=sa;pwd=123456;Database=student" 即使这样有的时候还是连接不上, (因此在安装数据库的时候 尽量不要写实例名了)
另外如果我们写的系统不发布,那么在本机上连接也可以这样写connectString ="FileDSN=studentinfo.dsn;uid=sa;pwd=123456(但这样写在发布后,其他机器上绝对连接不上你自己的服务器) 对于数据库我们也要一些设置远程连接需要打开,才能找到你的服务器 。
⑤ 用户输入超出限制
在我进行输入用户名和密码的时候,如果输入的过长,就会报错,对此,我自己改了数据库对数据长度的限制,同时也对输入框允许输入的最大长度进行了限制,这样尽量能避免那些错误吧
⑥多用户异地登陆问题
对于系统,如果一个用户同时在不同的地方登陆,并对数据进行操作,系统就会报错。
原因是由于数据库中只有这一个记录,就像一张纸上写下了数据,你把这个数据给删除了,也就是把这张纸扔了,那另外一个用户也对你删除的数据进行删除,数据库将找不到这个数据。 因此会报错 。 我们可以采取写入的方式,把数据直接给数据库,而不是通过记录集 。这样我想会好吧 。
⑦ 多用户修改同一个密码
如果你修改密码后,而另外一个用户也修改,这样你就无法再次登录这个用户了,因为你不知道密码被改成什么了
对此我们可以采取添加原始密码判断,这样只有知道原始密码,才能修改 否则无法修改
⑧数据不完整(删除了班级,该班级下的学生可能还有)
这就是我们主键和外键没有设置好,才会出现这个问题
⑨:防火墙问题
我在连接数据库的时候,发布到其他电脑上就无法成功的连接数据库 。这里就涉及到了我们WINDOWS的防火墙,由于防火墙会阻碍远程连接到我们的服务器,因此才无法连接。这时你只需要将你的windows防火墙关闭了就可以成功的连接数据库了
以上就是我在学生管理系统中遇到的一些问题以及解决的办法