浅析数据库的安全与优化
2010-08-15任莉
任莉
(南京工程高等职业学校,江苏 南京 211135)
浅析数据库的安全与优化
任莉
(南京工程高等职业学校,江苏 南京 211135)
数据库系统的高性能设计且系统管理先进,并支持Windows图形化管理工具以及本地和远程的系统管理和配置。它强壮的事务处理功能,采用各种方法保证数据的完整性,与Internet的紧密集成和开放的系统结构,为广大的用户、开发人员和系统集成商提供了一个出众的数据库平台,因此数据库的安全与优化变得非常重要。
数据库 ;安全;存储
一、数据库技术简介
随着计算机技术与网络通信技术的发展,数据库技术已成为信息社会中对大量数据进行组织与管理的重要技术手段及软件技术,是网络信息化管理系统的基础。数据库技术研究解决了计算机信息处理过程中大量数据有效地组织和存储的问题,在数据库系统中减少数据存储冗余、实现数据共享、保障数据安全以及高效地检索数据和处理数据。
二、数据库安全设计
维护数据库系统的安全是一个长期的工作,是数据库设计工作的延续和提高。通常数据库安全的工作包括以下几个方面:
(1)数据库的安全性。在数据库运行阶段,就应该保证数据的安全,使数据库不受有意或无意的侵犯。
(2)数据库性能的监督、分析和改造。数据库管理员必须利用系统提供的性能监控和分析工具,经常对数据库的运行、存储空间及响应时间进行分析。
(3)数据库的转储和恢复。数据库管理员要定期地把整个数据库复制到磁盘或其他磁盘上保护起来。要指定不同的备份方案,保证一旦发生事故,能很快地将数据库恢复到某种一致性的状态,尽量减少损失。
(4)数据库的重组织与重构造。对数据库进行重组可以调整系统在运行过程中由于不断进行插入、删除和修改操作而造成数据库的物理存储情况变差,数据的存储效率降低、数据库的性能下降的现象,使得系统的性能提高。
三、数据库性能优化
数据访问是Web应用程序最常需要用到的功能,对数据库性能优化,可提高整个系统的性能。
1.数据库链接
操作数据库最经常应用的操作就是创建数据库链接,打开链接,最后在操作结束后关闭链接。这一系列操作过程是非常耗资源的,需要多次与数据库交换信息以通过身份验证。因此这些操作会严重影响应用程序的性能。ASP.NET可以应用链接池来对数据库链接进行操作,减少打开、关闭数据库操作对性能的影响。当开发者创建数据库链接时,系统将为其创建链接池,从链接池中返回开发者要求的数据库链接。当开发者将这个链接关闭时,系统收回链接,将其放回链接池,等下一次对该链接的请求。但是链接池的大小是有限制的,如果超过链接池的最大限度后继续要求创建链接,将会影响性能。因此,要尽量推迟打开数据库链接,在数据操作完成后及时关闭数据库链接,从而减少数据库链接打开的时间,避免超出链接限制的情况出现。
2.数据库查询
在数据操作中,数据查询操作是非常普通的操作。提高数据查询操作的性能将对提高应用程序性能有很大的帮助。ASP.NET提供了多种方式来使用SQL语言对数据库进行操作,下面对这些方法进行简单的介绍。
直接生成SQL语句字符串。应用SqlCommand对象的CommandText属性,直接生成SQL语句字符串进行操作,下面的代码演示了该方式的数据库操作:
SqlCommand comm=new SqlCommand(SqlName,MyConnection);
Stringsql=“Select*Fromstu”;
sql=sql+“where(stuID=”“+txtstu.Text+”“)”;
comm.CommandText=sql;
对于这种查询命令,SQLServer在应用时需要每次对其进行编译,因此性能较差而且还会带来其他一些安全应用问题。
使用带有参数的SQL命令。这种应用的实现效果相同。下面为其应用程序。
SqlCommandComm=new SqlCommand(SqlName,My-Connection);
StringSql=“Select*FromstuWherestuID=@stuID”;
SqkParameterParaID=newSqlParameter(“@stu”,SqlDbType.Int,4);
ParaID=n,Value=3;
Comm.Parameters.Add(ParaID);
Comm.CommandText=Sql;
使用第二种方式对数据库进行查询,SQLServer只对命令编译一次,对于不同的参数重复使用,节省了服务器的应用效能,提供了数据库服务器的性能。
3.使用储存过程
存储过程是一系列被查询处理器预解析和优化的SQL命令,这些命令会被存储起来,以便需要时得到快速的执行。存储过程在应用时具有一次编译多次应用的效果,而且存储过程独立于程序,编译修改和维护。并且存储过程还可以减少网络中的数据传输,进一步提高网络应用性能。多条SQL语句的查询操作只需要由一个存储过程就能够实现,可以避免多次向数据库服务器传送数据。
四、防注入攻击技术
SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,在代码使用存储过程中,而这些存储过程作为包含未筛选的用户输入的字符串来传递时,会发生SQL注入。SQL注入可能导致攻击者使用应用程序登录在数据库中执行命令。如果应用程序使用特权过高的用户链接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态SQL命令,或者作为存储过程的输入参数,这些表单特别容易受到SQL注入的攻击。
SQLServer是一个功能强大的数据库系统,与操作系统也有紧密的联系,这给开发者带来了很大的方便,但另一方面,也为注入者提供了一个跳板,我们先来看看几个具体的例子:
(1)http://localhost:2514/Web/Admin/InStoreStat.aspx?billType=30;exec
master..xp_cmdshell“net user name password/add”______
分号;在SQL Server中表示隔开前后两句语句,——表示后面的语句为注释,所以,这句语句在SQL Server中将被分成两句执行,先是Select出ID=1的记录,然后执行存储过程xp_cmdshell,这个存储过程用于调用系统命令,于是,用net命令新建了用户名为name、密码为password的windows的账号,接着:
(1)http://localhost:2514/Web/Admin/InStoreStat.aspx?billType=30;exec
master…xp_cmdshell“net localgroup name administrators/add”——
将新建的账号name加入管理员组,现在你已经拿到了系统最高权限,当然,这种方法只适用于用sa链接数据库的情况,否则是没有权限调用xp-cmdshell的。
(3)http://localhost:2514/Web/Admin/InStoreStat.aspx?billType=30;
and db-name()>0 and user>0,作用是获取链接用户名,db-name()是另一个系统变量,返回的是连接的数据库名。
(4)http://localhost:2514/Web/Admin/InStoreStat.aspx?billType=30;backup
database数据库名 to disk=’c:inetpubwwwroot1.db’;——
在(3)中可以得到数据库名,加上某些IIS出错暴露出的绝对路径,将数据库备份到Web目录下面,再用HTTP把整个数据库就完完整整地下载回来,所有的管理员及用户密码都一览无佘。
从以上几点可以看出,SQL注入攻击对我们系统的危害有多大。许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是SQL注入就发生了。因此数据库管理员应养成查看IIS日志的习惯,对程序过滤严格审查,认真检查参数,防止SQL注入攻击的发生。
[1]戚建妙.SQL注入攻击与数据库安全[J].有线电视技术,2004,(23).
TN
A
1673-0046(2010)11-0173-02