网络编程
位置:首页>> 网络编程>> 数据库>> SQL Server应用程序的高级Sql注入(11)

SQL Server应用程序的高级Sql注入(11)

作者:Chris Anley luoluo 来源: * 八进制 发布时间:2009-04-11 16:54:00 

标签:SQL,Server,应用程序,Sql注入

[防 范]

这部分讨论一些针对这些攻击的防范措施。输入验证已经讨论过了,一些代码也给出了,后面我们研究SQL-Server防范问题。

[输入验证]

输入验证是一个很复杂的问题。一般在一个开发项目中它很少被注意,因为过度的验证往往使一个程序的某部分被打断,所以输入验证是个难题。输入验证往往不加到程序的功能里,因而在工期将至而赶程序时不会被人注意。

下面是关于验证的简单的讨论附示例代码,这个示例代码当然不能直接用在程序里,但可以很好的说明不同的策略。

各种数据验证的途径可以分类为以下几种:

1)整理数据使之变得有效
2)拒绝已知的非法输入
3)只接受已知的合法的输入

有很多概念上的问题;首先,开发者没有必要知道非法数据由什么组成,因为新形式的非法数据随时都可能产生。第二,改变数据会改变它的长度,这样会导致前面提到的问题。最后,还有需要对系统已有数据的重用的话有二次注入的问题.

解决方案2也会遇到和1的一些相似的问题,了解非法数据会过时,因为新的攻击技术也在发展。

解决方案3可能是三种方法中最好的,但是比较难于执行。

从安全角度来考虑可能最好多解决方法是把解决方案2和3结合起来只允许合法的输入,然后再寻找非法字符。

一个必须结合这两种途径的例子是带有连字符的名字的问题:

Question Bassington-Bassington

我们必须在合法输入里允许连字符号,但是也要明白字符串'--'在SQL-Server里意味着什么。

当数据整理结合了非法字符验证时另一个问题就会发生。假设我们应用“非法字符探测器”来探测'--','select'和'union'”后使用“数据整理过滤器”删除单引号,攻击者就可以指定这样的输入:

uni'on sel'ect @@version-'-

因为单引号被过滤器删除了,攻击者可以把单引号散布于它的已知的非法字符串里来躲避检查。

下面是一些验证的代码:

方法1-躲避单引号

function escape( input ) 
input = replace(input, "'", "''") 
escape = input 
end function 

方法2-抵制已知的非法输入

function validate_string( input ) 
know_bad = array( "select", "insert", "update", "delete", "drop", "--", "'") 
validate_string = true 
for i = lbound( know_bad ) to ubound( known_bad ) 
if( instr( 1, input, known_bad(i), vbtextcompare) <> 0 ) 
validate_string = false 
exit function 
end if 
next 
end function 

方法3-只允许合法输入

function validatepassword( input ) 
good_password_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 
validatepassword = true 
for i = 1 to len( input ) 
c = mid( input, i, 1 ) 
if ( instr( good_password_chars, c ) = 0 ) then 
validatepassword = false 
exit function 
end if 
next 
end function 

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com