[本站首页] [管理页面] [写新日志] [退出]

朝为田舍郎,暮登天子堂,将相本无种,男儿当自强。
首页(178) Hibernate(10) JAVA(19) Web(15) Struts(7) 口水(9) Ides(18) 其它(51) AJAX(6) database(29) 
Blog信息

blog名称:四裤全输的小窝~~
日志总数:178
评论数量:699
留言数量:198
访问次数:1161155
建立时间:2005年10月29日

Blog内搜索



日志更新

谷歌地图定位偏移解决方法
【转】利用Windows内置的命令作端口
WIN2003服务器安全加固方案
[转]sql server 日期比较、日
MediaCoder 一般参数设置
[转]VMware中创建共享磁盘阵列的方
缓解vss共享文件夹的安全隐患问题(转)
Delphi 中调用JavaScript
微软的官方方法:延长Windows Se
cxGrid 过滤 排序后 取选中记录的

最新评论

回复:谷歌地图定位偏移解决方法
回复:谷歌地图定位偏移解决方法
回复:WIN2003服务器安全加固方案
回复:cxGrid 过滤 排序后 取选中
回复:TreeView 父节点 子节点 
回复:[转]Oracle Instead
回复:DWR 官方下载地址
ugg  boots
回复:cxGrid 过滤 排序后 取选中
回复:DWR 官方下载地址

友情链接

biglin's Blog
NoisyRam's Blog
Stone's Blog
Kevin 的小家
『知』治通鉴

留言板




[database][转]深入分析SQL SERVRE注入攻击
文章收藏,  网上资源,  软件技术,  电脑与网络 四裤全输 发表于 2007/2/14 11:33:56

说起Sql Server注入攻击想必大部分网管和Web开发人员都不会感到陌生,这种针对网站和数据的攻击方式可谓是臭名昭著,那么Sql Server注入攻击是如何形成的?又有什么办法有效的防范Sql Server注入攻击呢?这就是一个值得探讨的话题了,其实严格的来说这也不算是一个什么新鲜的话题,不过我在这里要说的,并不是传统的使用编程方式来防止注入攻击,而是探讨相关的数据库安全问题,首先,来说一下Sql Server注入攻击的原理,我们假设有一个安全性比较差的网站,上面有一个可供用户进行搜索的文本框(TextBox1),一般来说,程序员在编写代码的时候都会使用如下方法:     Select ProductNumber,Name,ListPrice From Product Where Name Like "'% TextBox1.Text %'"     现在一个图谋不轨的用户开始对这个网站发动了攻击,它在文本框中输入了如下字段:a' Union Select @@Version,@@ServerName,0;--%,那么上面这段语句会变成什么呢?相信有一定数据库基础的人都知道,代码会变成这样:     Select ProductNumber,Name,ListPrice From Product Where Name Like 'a'    Union    Select @@Version,@@ServerName,0;--%'     如果成功,那么会返回当年使用的数据库服务器名称以及相关的数据库版本,但是这并不是最为重要的东西,最为重要的是他知道了能够在你的网站上运行他需要的代码,从而展开攻击。     知道了原理,那么应该如何防范呢?这里有几种方法:     1、过滤关键字:把含有DDL(数据库操纵语句)的内容全部过滤掉,正常的访问是绝对不需要Insert、Select、Delete、Update和Exec这些代码的,也绝对不需要使用“'”这种符号。     2、使用CInt等转换函数进行转换:这种方法也比较容易实现,也是很多VB编程人员常用的办法,对于网页间的变量传递十分有效,在用户企图输入一个非法数据的时候程序本身会抛出一个异常。     3、使用存储过程:自从进入.Net时代以来,这种方法就经常被人们使用,原因是在.Net编程中这种方法比较容易实现,而且安全性也很高,它能够保证用户输入的数据始终被作为字符串处理,而不会当作是DDL。     4、数据库权限:这种方法是我们要着重讨论的方法,首先我们来回想一下用户攻击网站的全部过程,除了能够插入DDL之外,他还要能够有相关的执行权限,否则的话就算是能够使用DDL但是仍然会被数据拒绝操作,从而引发一个常规错误,现在的Web程序大部分都对Sql Server注入攻击有了很好的防范能力,但是关于数据库权限呢?事实上,我很少见到有关数据库权限设置防范注入攻击的说法,也很少见到有人使用,大部分的编程人员都习惯性的使用sa帐号,然后给相关用户赋予dbo权限,其实这种做法是错误的,sa是Sql Server内置的管理员帐号,这个帐号拥有最高权限,正式因为如此才应当尽量的少使用它,而不是广泛的使用sa帐号,大部分程序,根本就不需要使用sa帐号,很多Web应用程序对数据库的访问只是基于读写操作,那么使用sa帐号干什么?对于大部分网站,只需要赋予db_reader和db_writer两种权限就已经足够了,这两个权限能够满足基本的Select、Insert、Update和Delete操作,同时会拒绝Exec等执行操作,当然,像Sql Server注入攻击这类操作会被理所应当的拒绝,还有一种情况就是需要执行数据库中的存储过程,这个使用可能需要赋予相关用于的db_owner权限,这时你要考虑清楚,db_owner是数据库级的最高权限,能够在当前数据库中执行任何操作,如果你编写的前台代码没有任何问题还好,一旦有问题虽然不会导致整个服务器的不可用,但至少能够造成此数据库的不可访问,所以我还是建议不要轻易使用这种权限,如果要使用存储过程,应该在存储过程上直接赋予某个用户权限,而不是囫囵吞枣的用一个db_owner权限解决问题;另外一种值得注意的情况是,一个用户可能需要同时拥有两个数据库的访问权,这个时候就要看具体的情况而定了,按照总是赋予用户最小权限的理论,应当分出主要访问的数据库和次要访问的数据库,在部署好主要访问的数据库之后,看看需要次要访问的数据库的数据分布情况,如果需要访问的数据主要集中在几张表上,那么应当直接对表赋予相应的DDL权限,比如,一个用户只需要查询一张表的数据,那么就应当给这张表Select权限,而不是把db_reader权限赋予这个用户,如果用户需要访问的数据过多,那么应当尽可能的赋予最小权限,比如赋予db_reader和db_writer权限。     总的来说,对于Sql Server攻击的防范不能仅仅的停留在代码层上,最根本的工作是做好数据库的安全工作,在工作越来越细化的现代化社会中,一个公司分别拥有数据库管理人员和代码编写人员已经不是什么稀奇的事情了,程序编写人员有责任修改程序中出现的Bug而数据库管理人员则应当保障数据库安全。


阅读全文(2304) | 回复(0) | 编辑 | 精华


发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)
站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144796826 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号