SQLserver安全设置攻略

日前SQLINJECTION的攻击测试愈演愈烈,很多大型的网站和论坛都相继被注入。这些网站一般使用的多为SQLSERVER数据库,正因为如此,很多人开始怀疑SQLSERVER的安全性。其实SQLSERVER2000已经通过了美国政府的C2级安全认证-这是该行业所能拥有的最高认证级别,所以使用SQLSERVER还是相当的安全的。当然和ORCAL、DB2等还是有差距,但是SQL
SERVER的易用性和广泛性还是能成为我们继续使用下去的理由。那怎么样才能使SQLSERVER的设置让人使用的放心呢?第一步肯定是打上SQLSERVER最新的安全补丁,现在补丁已经出到了SP3。下载地址:http://www.microsoft.com/sql/downloads/2000/sp3.asp
。如果这一步都没有做好,那我们也没有继续下去的必要了。第二步是修改默认的1433端口,并且将SQLSERVER隐藏。这样能禁止对试图枚举网络上现有的SQLServer
客户端所发出的广播作出响应。另外,还需要在TCP/IP筛选中将1433端口屏蔽掉,尽可能的隐藏你的SQLSERVER数据库。这样子一但让攻击创建了SQLSERVER的账号,也不能马上使用查询分析器远程登陆来进行下一步的攻击。单从ASP,PHP等页面构造恶意语句的话,还有需要查看返回值的问题,总比不上直接查询分析器来得利落。所以我们首先要做到即使让别人注入了,也不能让攻击者下一步做得顺当。修改方法:企业管理器
-->你的数据库组-->属性-->常规-->网络配置-->TCP/IP-->属性
,在这儿将你的默认端口进行修改,和SQLSERVER的隐藏。第三步是很重要的一步,SQLINJECTION往往在WEBCODE中产生。而做为系统管理员或者数据库管理员,总不能常常的去看每一段代码。即使常常看代码,也不能保证我们在上面的疏忽。那怎么办?我们就要从数据库角色着手,让数据库用户的权限划分到最低点。SQLSERVER的默认权限让人真的很头疼,权限大得非常的高,权限小的又什么都做不了,SYSADMIN和db_owner真是让人又爱又恨。攻击者一但确认了网站存在SQLINJECTION漏洞,肯定有一步操作步骤就是测试网站的SQLSERVER使用者具有多大的权限。一般都会借助selectIS_SRVROLEMEMBER('sysadmin'),或者selectIS_MEMBER('db_owner'),再或者用user=0(让字符和数字进行比较,SQLSERVER就会提示了错误信息,从该信息中即可知道一些敏感信息)等语句进行测试。方法还有,我也不敢多说了。其一怕错,其二怕联盟中的人扁。在当前,如果网站的数据库使用者用的是SA权限,再加上确认了WEB所处在的绝对路径,那么就宣告了你的网站的OVER。db_owner权限也一样,如果确认了绝对路径,那么有50%的机会能给你的机器中上WEB方式的木马,如海阳等。所以这儿我们确认了一点,我们必须要创建自已的权限,让攻击者找不着下嘴的地方。在这儿引用一个SQLSERVER联机帮助中的例子:创建SQLServer数据库角色的方法(企业管理器)
创建SQLServer数据库角色
1.展开服务器组,然后展开服务器。
2.展开"数据库"文件夹,然后展开要在其中创建角色的数据库。
3.右击"角色",然后单击"新建数据库角色"命令。
4.在"名称"框中输入新角色的名称。
5.单击"添加"将成员添加到"标准角色"列表中,然后单击要添加的一个或多个用户。(可选)
只有选定数据库中的用户才能被添加到角色中。对象权限
处理数据或执行过程时需要称为对象权限的权限类别:
·select、insert、update和delete语句权限,它们可以应用到整个表或视图中。
·select和update语句权限,它们可以有选择性地应用到表或视图中的单个列上。
·select权限,它们可以应用到用户定义函数。
·insert和delete语句权限,它们会影响整行,因此只可以应用到表或视图中,而不能应用到单个列上。
·EXECUTE语句权限,它们可以影响存储过程和函数。语句权限
创建数据库或数据库中的项(如表或存储过程)所涉及的活动要求另一类称为语句权限的权限。例如,如果用户必须能够在数据库中创建表,则应该向该用户授予
createTABLE语句权限。语句权限(如createDATABASE)适用于语句自身,而不适用于数据库中定义的特定对象。
语句权限有:
·BACKUPDATABASE
·BACKUPLOG
·createDATABASE
·createDEFAULT
·createFUNCTION
·createPROCEDURE
·createRULE
·createTABLE
·createVIEW暗示性权限
暗示性权限控制那些只能由预定义系统角色的成员或数据库对象所有者执行的活动。例如,sysadmin固定服务器角色成员自动继承在SQL
Server安装中进行操作或查看的全部权限。
数据库对象所有者还有暗示性权限,可以对所拥有的对象执行一切活动。例如,拥有表的用户可以查看、添加或删除数据,更改表定义,或控制允许其他用户对表进行操作的权限。db_owner在数据库中有全部权限。
db_accessadmin可以添加或删除用户ID。
db_securityadmin可以管理全部权限、对象所有权、角色和角色成员资格。
db_ddladmin可以发出ALLDDL,但不能发出GRANT、REVOKE或DENY语句。
db_backupoperator可以发出DBCC、CHECKPOINT和BACKUP语句。
db_datareader可以选择数据库内任何用户表中的所有数据。
db_datawriter可以更改数据库内任何用户表中的所有数据。
db_denydatareader不能选择数据库内任何用户表中的任何数据。
db_denydatawriter不能更改数据库内任何用户表中的任何数据。在这儿把新建的数据库角色的权限配置好,比如需要使用哪个表、视图、存储过程等。然后把Db_owner和db_securityadmin、db_backupoperator取消,不给攻击者BACKUP
DATABASE和create
TABLE的机会,一但攻击者具有这两个权限,那么你的网站就还处在十分危险的状态。还有注意一下,在创建数据库账号时,千万不能对服务器角色进行选择。
第四步是修改SQLSERVER内置存储过程。SQLSERVER估计是为了安装或者其它方面,它内置了一批危险的存储过程。能读到注册表信息,能写入注册表信息,能读磁盘共享信息等等……各位看到这儿,心里可能会在想,我的网站中有其它的代码,又不像查询分析器那样能查接将结果输出。给你这个权限,又不能怎么样,还是看不到信息。如果各位这样想就大错特错了。提示一下,如果攻击者有createTABLE的权限,那么创建一个临时表,然后将信息insert到表中,然select出来,接着跟数字进行比较,让SQLSERVER报错,那么结果就全出来了……所以我们要报着宁错杀,不放过的态度进行修补。先来列出危险的内置存储过程:
xp_cmdshell
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwriteActiveX自动脚本:sp_OAcreate
sp_OADestroy
sp_OAMethod
sp_OAGetProperty
sp_OASetProperty
sp_OAGetErrorInfo
sp_OAStop以上各项全在我们封杀之列,例如xp_cmdshell屏蔽的方法为:sp_dropextendedproc
'xp_cmdshell',如果需要的话,再用sp_addextendedproc'xp_cmdshell',
'xpsql70.dll'进行恢复。如果你不知道xp_cmdshell使用的是哪个.dll文件的话,可以使用sp_helpextendedproc
xp_cmdshell来查看xp_cmdshell使用的是哪个动态联接库。另外,将xp_cmdshell屏蔽后,我们还需要做的步骤是将xpsql70.dll文件进行改名,以防止获得SA的攻击者将它进行恢复。我们做到这儿,你的SQLSERVER就基本上安全了。但是信息还是能一样的外泄。毕竟select我们是无法取消的,除非你的网站用的是HTML。SQLINJECTION的防范还需要我们这些程序员来注意,这才是治本之法。我们在高级设置篇再接着对SQLSERVER的安全做下一步的分析。该篇文章如果有什么错漏,请大家多多包涵。谢谢……另外推荐一下,SQLINJECTION的测试工具NBSI2,这是由联盟中小竹同志开发,对SQLINJECTION的注入有代表性的作用,另外一个就是小弟的NBWEBSHELL了。这些工具都可以到联盟网站进行下载NB联盟-jadesun(裤衩)QQ:280155
NB网站:54nb.com
SQL注入防御方法-程序员篇作者:NB联盟-小竹  SQL注入越来越多的被利用来入侵网站,部分WEB程序员也开始关注这方面的知识,但由于对入侵的方法一知半解,导致在过滤的时候漏掉某些字符,造成安全漏洞;或者是草木皆兵,把一些合法的用户请求都拒之门外,试想一下,当用户想输入个I'm
aboy的时候,却给你臭骂一顿,他还会愿意再上你的网站吗?下面,我从程序方面介绍一下SQL注入的防御方法,首先看这三句最简单SQL语句
1.SQL="select*fromUserswhereUserID="&Request("ID")
2.SQL="select*fromUserswhereUserID='"&Request("ID")&"'"
3.SQL="select*fromUserswhereUserNamelike'%"&Request("Name")
&"%'"第一句,参数是数字型,这个很明显。第二句,如果字段UserID是int型,就有些人分不清楚了。其实,区分第数字弄和字符型参数,只要看SQL语句参数两边有没有单引号即可,很明显,第一句没单引号,是数字型;第二第三句有单引号,是字符型。
  对于数字型变量,传入的参数都会直接附加到SQL语句上执行,而因为参数是数字型,所以用isNumeric判断是很安全的,我曾经试过用之类试图断开参数,但结果都是失败。
  对于字符型变量,传入的参数都是做为常量,比如你传1and1=1进去,SQL语句就是UserID=?and
1=1',在单引号界定范围里面的值永远都只是一个常量,要打破这个范围,唯一的字符就是界定的字符:单引号。所以,字符型变量只要过滤了'号就完全安全了,至于如何过滤,最好是把一个单引号替换成两个单引号,因为SQL语句里面规定,'常量'这样表示的常量里面,常量里面如果要有单引号,可以用两个单引号代替。这样,既可以保持用户输入的原貌,又可以保证程序的安全。
  下面是两个函数,大家可以Copy过去直接调用就行了。'---------------------------------------------------------------
'NB联盟防注入函数ReqNum/ReqStr
'---------------------------------------------------------------
FunctionReqNum(StrName)
ReqNum=Request(StrName)
ifNotisNumeric(ReqNum)then
Response.Write"参数必须为数字型!"
Response.End
Endif
EndFunctionFunctionReqStr(StrName)
ReqStr=Replace(Request(StrName),"'","''")
EndFunction
以上面三句SQL语句,说明一下调用方法:
1.SQL="select*fromUserswhereUserID="&ReqNum("ID")
2.SQL="select*fromUserswhereUserID='"&ReqStr("ID")&"'"
3.SQL="select*fromUserswhereUserNamelike'%"&ReqStr("Name")
&"%'"  重申一点:上面的方法无论对SQLServer库还是Access或是其它数据库,都是绝对适用、绝对安全,但注意一点,SQLServer的存储过程是个例外,该情况下要把单引号替换成四个单引号,以保安全。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLServer安全及性能优化 修补漏洞 安装程序补丁修补漏洞 随时关注微软官方网站补丁升级 关闭不必要的端口 关闭联必要的服务 数据库引擎 SQL Server Analysis Services SQL Server Reporting Services SQL Server Integration Services SQL Server 代理 SQL Full-text Filter Daemon launcher SQL Server Browser 同时开启所有服务系统性能会变得很差,根据需要手动启动或者禁用某个服务 DTC: Distributed Transaction Coordinator(分布式事务处理协调器),用于协调多个数据库、消息队列、文件系统等等资源管理器的事务,由于内部开发中并不使用这个功能,远程数据库服务器上也并不经常使用,因此建议关闭这个服务 禁用不使用的协议 Shared Memory 默认为已启用状态,这个协议只能用于本地连接,不能用于远程连接,一般用于其它协议出问题的时候管理作诊断使用 TCP/IP 禁用不需要使用的协议,减少网络攻击对象 减少监听的网卡和IP地址 改变监听端口号 安全设置账户 Windows身份验证[微软推荐的方式] 优势: 1.访问SqlServer时速度更快,不用输入用户名和密码 2.可以利用Windows系统的自身工具和安全策略管理账户 3.安全确认和口令加密、审核、口令失效、最小口令长度和账号锁定 SqlServer身份验证 1.将sa账户名更改为其它账户名比如nocial,防止黑客利用sa进行攻击 2.删除不使用的账户 3.对已有账户设置安全密码[强制密码规则] 4.限制登录->远程登录、匿名登录 5.限制用户角色和权限,一般将权限设置到最低。设置角色的时候不要为public角色授予任何权限,并且从sysadmin这个角色中删除windows的administrators组,提高系统安全性。 删除不必要的数据库对象 删除危险的存储过程 xp_cmdshell:执行操作系统命令,这是一个系统后门[可以移动文件位置、创建用户、提升用户权限],建议不需要则删除掉。 ole自动化存储过程 任务管理存储过程 强化文件和目录安全 数据库最终以文件的形式存储在文件系统中 使用NTFS设置权限 限制共享【不能设置为完全控制】 及时审核日志 sqlserver的审核机制可以帮助跟踪并且阻止系统中没有授权的用户他的行为。比如没有授权的用户登录系统会阻止这次登录,并且把这次操作给记录下来。审核机制既能跟踪失败记录也能跟踪成功记录。所有的数据库平台均在不同程度上提供了审查功能。 跟踪用户行为 保护数据库 数据库性能优化 数据库的性能优化主要有两个方面:减少查询比较次数、减少资源的征用。 使用工具Sql Server Profiler优化数据库的性能,减少资源的征用 SqlServer Profiler的功能 Sql Server Profiler的用法  定义跟踪  登录连接、失败和断开  Select、Insert、Update和Delete语句  SQL批处理的开始或结束  写入到Sql server错误日志的错误  安全权限检查  Profiler执行的事件 让Profiler监视我们感兴趣的事件,可以监视的事件太多,监视太多会大大降低性能和增大表数据,只监视与数据库的性能密切相关的哪些事件。常见的感兴趣的事件:  执行查询的性能  单个用户或应用程序的活动  逻辑磁盘的读写  语句级别上的CPU占用  Standart模板的事件类 优化数据库性能可以从五个层次来进行:  优先级一:减少数据的访问【减少磁盘访问】  优先级二:返回更少数据【减少网络传输或磁盘访问】  优先级三:减少交互次数【减少网络传输或磁盘访问】  优先级四:减少开销【减少CPU及内存开销】  优先级五:利用更多资源【增加资源】 技术上从四个方面来解决性能优化问题 1、调整数据库结构设计 2、调整应用程序结构设计 3、调整数据库SQL语句 4、调整服务器内存分配 如果不熟悉sqlserver可以使用数据库引擎优化顾问来对数据库提出优化建议,然后通过系统管理的修改达到目的。 数据库引擎优化顾问  数据库引擎优化顾问介绍  分析一个或多个数据库的工作负荷和物理实现,工作负荷可以是优化的sql语句或者sqlserver profiler的跟踪文件和数据表。我们可以在运行引擎优化顾问前运用sqlserver profiler记录一些事件,然后将跟踪结果存储为文件或者数据表,然后把这些提供给数据库引擎优化顾问,让它去分析。  提出合理的物理设计结构,物理设计结构包括数据库中的索引、索引视图、非聚集索引、聚集索引视图等等。对工作负荷进行分析后,数据库优化顾问会建议添加删除修改数据库的物理设计结构。推荐一组合理的物理结构以降低工作负荷的开销。从而提高数据库的性能 数据库性能优化的常见问题 如何发现问题,如何分析导致性能降低的原因仍然是数据库管理员要掌握的知识。 事务占用资源的时间过长,造成阻塞 许多用户同时访问数据库的时候会产生大量事务,许多用户同时竞争一个资源导致占用资源的时间过长,造成阻塞。从而降低了数据库执行效率。产生这样的现象的原因如下: 1、多表连接查询,查询期间占用多个表 2、事务需要占用太多资源,容易出现多个事务占用对方资源的状况。从而导致死锁 解决之道: 1、避免多表连接查询,联合过多的表会在查询中占用过多的资源。很容易因为别的事务占用资源而相互等待。 2、使用统一的SQL语句规范,特别是访问表的顺序要保持一致,这样可以避免互相占用资源而导致的死锁。 不合理的数据文件设置,影响事务处理的性能 当事务处理产生大量数据的时候,数据文件的大小如果设置不合理将导致数据文件的不断扩展,这也会影响到事务处理的性能,进而影响到整个数据库的性能。 1、频繁操作数据库,导致日志文件增长的过快,因为日志文件记录数据库的原始操作。所以它的增长速度比数据文件要快得多。当日志文件的增长大小设置不合理的时候会导致频繁地扩展文件。从而影响性能 2、查询操作比较频繁,系统数据Tempdb的大小设置不合理。 查询操作比较频繁的时候系统数据Tempdb增长得会比较快,因为查询所产生的临时数据都存放在这个数据库上。如果Tempdb过小当查询数据量较大的时候Tempdb会自动扩展,如果遇到频繁的查询会导致Tempdb不断扩展,从而影响系统性能。这种情况我尽可能地使查询的返回结果比较小 3、大量插入数据,导致数据文件增长过快。不要设置数据文件的自动收缩,它会在忙碌的系统上导致不必要的性能开销。所以如果没有特别需要不要设置数据库的自动收缩。最好采用手动收缩。 磁盘数据组织不合理,导致磁盘的访问次数过多 数据库的磁盘访问都是按照页来访问数据的,无论访问的数据再少都是以页为单位读取,1页为8K。所以如果将经常访问的数据放在一起,数据库读取尽量少的页面就能够完成读取操作。这样效率自然就提高了。也减少了磁盘头的来回移动。否则会多次读取硬盘页面导致访问的效率降低。 对于表A和表B、表C、表D,如果经常查询表A和表B中的数据,那么可以将他们放在同一个文件组M中;如果经常访问表C和表D中的数据可以将他们放在同一个文件组N中。这样读取效率就比较高,因为一次读取就可能包含了两个表中的数据,因此提高了查询效率。要解决“磁盘数据组织不合理,导致磁盘的访问次数过多”这个问题,我们可以将经常读写的数据放置在不同的磁盘上,也就是将经常在一起被多表连接查询的表放在同一个文件组上。这里强调:这里反复提到的“不同的磁盘”指的的是不同的磁盘,而不是同一个硬盘的不同分区。 批量导入数据的时候,要进行特殊设置 当用户需要大批量导入数据的时候会突然增加很多日志记录,并且如果数据表上有索引,数据表每增加一条记录就会在索引上增加一条数据从而降低插入的性能。解决方案: 1、大批量导入数据的时候设置数据库的恢复模式为“大容量日志恢复模式” 2、导入前禁用索引,导入完毕后重建索引。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值