所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域□□□□或页面请求的◉查询字符串,欺骗服务器执□□□□行恶意的SQL命令。在某些表单中,用户输入的内※容直接用来构◎造(或者影响)动态SQL命令,或作为存储过□□□□程的输入参数,这类表单特别□□□容易受到SQL注入式攻击。启凡大连网站建设公司总结常见的SQL注入式攻击过▽程类如:
1、某个ASP.NET Web应用有一个登□□□□录页面,这个登录页面◥控制着用户是□□否有权访问应□□用,它要求用户输★入一个名称和▼密码。
2、用户输入的内★容提交给服务◇器之后,服务器运行上○面的ASP.NET代码构造出查□□□询用户的SQL命令,但由于攻击者□□□输入的内容非□□常特殊,所以后得到的SQL命令变成:SELECT * from Users WHERE login = ’’ or ’1’=’1’ AND password = ’’ or ’1’=’1’.
3、服务器执行查□□询或存储过程,将用户输入的▼身份信息和服◎务器中保存的•身份信息进行□□对比。
4、登录页面中输□□入的内容将直□□□□接用来构造动●态的SQL命令,或者直接用作□□存储过程的参□□□数。下面是ASP.NET应用构造查询□□□的一个例子:
System.Text.StringBuilder query = new System.Text.StringBuilder("SELECT * from Users WHERE login = ’")。Append(txtLogin.Text)。Append("’ AND password=’")。Append(txtPassword.Text)。Append("’");
5、攻击者在用户※名字和密码输□□□入框中输入"’或’1’=’1"之类的内容。
6、由于SQL命令实际上已□□□被注入式攻击□□修改,已经不能真正○验证用户身份,所以系统会错□□□误地授权给攻□□□□击者。
如果攻击者知□□道应用会将表□□□单中输入的内□□□容直接用于验□□□□证身份的查询,他就会尝试输◎入某些特殊的SQL字符串篡改查•询改变其原来□□□的功能,欺骗系统授予◇访问权限。
系统环境不同,攻击者可能造□□成的损害也不□□□同,这主要由应用◆访问数据库的✦安全权限决定。如果用户的帐□□户具有管理员□□或其他比较高♦级的权限,攻击者就可能□□□对数据库的表□□□□执行各种他想□□□□要做的操作,包括添加、删除或更新数△据,甚至可能直接◉删除表。
如何防止SQL注入?
好在要防止ASP.NET应用被SQL注入式攻击闯□□□□入并不是一件□□□□特别困难的事□□□□情,只要在利用表※单输入的内容□□□□构造SQL命令之前,把所有输入内○容过滤一番就□□□可以了。过滤输入内容□□可以按多种方□□□□式进行。
1、对于动态构造SQL查询的场合,可以使用下面□□□□的技术:
先进:替换单引号,即把所有单独□□出现的单引号□□改成两个单引□□号,防止攻击者修□□□□改SQL命令的含义。再来看前面的□□例子,“SELECT * from Users WHERE login = ’’’ or ’’1’’=’’1’ AND password = ’’’ or ’’1’’=’’1’”显然会得到与“SELECT * from Users WHERE login = ’’ or ’1’=’1’ AND password = ’’ or ’1’=’1’”不同的结果。
第二:删除用户输入□□内容中的所有◉连字符,防止攻击者构□□造出类如“SELECT * from Users WHERE login = ’mas’ —— AND password =’’”之类的查询,因为这类查询□□□的后半部分已□□□经被注释掉,不再有效,攻击者只要知□□□道一个合法的□□用户登录名称,根本不需要知□□□□道用户的密码□□就可以顺利获□□□得访问权限。
第三:对于用来执行❖查询的数据库□□□□帐户,限制其权限。用不同的用户□□帐户执行查询、插入、更新、删除操作。由于隔离了不◎同帐户可执行▼的操作,因而也就防止❖了原本用于执□□行SELECT命令的地方却□□□被用于执行INSERT、UPDATE或DELETE命令。
2、用存储过程来□□□执行所有的查□□□询。SQL参数的传递方□□□式将防止攻击□□□者利用单引号□□□□和连字符实施●攻击。此外,它还使得数据□□库权限可以限◣制到只允许特◈定的存储过程□□□执行,所有的用户输◎入必须遵从被□□□调用的存储过□□□□程的安全上下□□□文,这样就很难再□□发生注入式攻□□击了。
3、检查提取数据□□的查询所返回✦的记录数量。如果程序只要□□□求返回一个记◈录,但实际返回的□□□□记录却超过一□□行,那就当作出错□□处理。
4、 检查用户输入□□□的合法性,确信输入的内□□□□容只包含合法◎的数据。数据检查应当□□□在客户端和服□□□务器端都执行——之所以要执行▽服务器端验证,是为了弥补客□□□户端验证机制□□□□脆弱的安全性。
在客户端,攻击者完全有□□□可能获得网页□□的源代码,修改验证合法□□性的脚本(或者直接删除□□□脚本),然后将非法内◢容通过修改后△的表单提交给◥服务器。因此,要保证验证操□□□□作确实已经执□□行,专属的办法就◇是在服务器端※也执行验证。你可以使用许□□□多内建的验证□□对象,例如RegularExpressionValidator,它们能够自动•生成验证用的□□□客户端脚本,当然你也可以□□□插入服务器端□□的方法调用。如果找不到现□□□□成的验证对象,你可以通过CustomValidator自己创建一个。
5、将用户登录名□□称、密码等数据加□□密保存。加密用户输入◇的数据,然后再将它与□□□□数据库中保存□□□□的数据比较,这相当于对用□□户输入的数据□□□进行了“消毒”处理,用户输入的数□□□据不再对数据♦库有任何特殊♦的意义,从而也就防止□□□了攻击者注入SQL命令。 System.Web.Security.FormsAuthentication类有一个 HashPasswordForStoringInConfigFile,非常适合于对□□□输入数据进行□□消毒处理。
6、限制表单或查□□□询字符串输入▽的长度。如果用户的登▲录名字多只有10个字符,那么不要认可□□□表单中输入的10个以上的字符,这将大大增加□□□攻击者在SQL命令中插入有□□害代码的难度。
扫一扫
关注k8凯发一触即发
全国咨询热线
135-9299-6491