ASP.NET网站程序防SQL注进式攻击方法
核心提示:所谓SQL注进式攻击,就是攻击者把SQL命令插进到Web表单的输进域或页面要求的查询字符串,欺骗服务器履行恶意的SQL命令。在某些表单中,用户输进的内容直接用来构造(或影响)动态SQL命令...
1、甚么是SQL注进式攻击?
所谓SQL注进式攻击,就是攻击者把SQL命令插进到Web表单的输进域或页面要求的查询字符串,欺骗服务器履行恶意的SQL命令。在某些表单中,用户输进的内容直接用来构造(或影响)动态SQL命令,或作为存储进程的输进参数,这类表单特别轻易遭到SQL注进式攻击。常见的SQL注进式攻击进程类如:
⑴ 某个ASP.NET Web利用有1个登录页面,这个登录页面控制着用户是否是有权访问利用,它要求用户输进1个名称和密码。
⑵ 登录页面中输进的内容将直接用来构造动态的SQL命令,或直接用作存储进程的参数。下面是ASP.NET利用构造查询的1个例子:
System.Text.StringBuilder query = new System.Text.StringBuilder(
"SELECT * from Users WHERE login = '")
.Append(txtLogin.Text).Append("' AND password='")
.Append(txtPassword.Text).Append("'");
⑶ 攻击者在用户名字和密码输进框中输进"'或'1'='1"之类的内容。
⑷ 用户输进的内容提交给服务器以后,服务器运行上面的ASP.NET代码构造出查询用户的SQL命令,但由于攻击者输进的内容非常特殊,所以最后得到的SQL命令变成:SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'。
⑸ 服务器履行查询或存储进程,将用户输进的身份信息和服务器中保存的身份信息进行对照。
⑹ 由于SQL命令实际上已被注进式攻击修改,已不能真正验证用户身份,所以系统会毛病地授权给攻击者。
假设攻击者知道利用会将表单中输进的内容直接用于验证身份的查询,他就会尝试输进某些特殊的SQL字符串篡改查询改变其原来的功能,欺骗系统授与访问权限。
系统环境不同,攻击者可能酿成的侵害也不同,这主要由利用访问数据库的安全权限决定。假设用户的帐户具有治理员或其他比较高级的权限,攻击者便可能对数据库的表履行各种他想要做的操纵,包括添加、删除或更新数据,乃至可能直接删除表。
2、如何防范?
好在要避免ASP.NET利用被SQL注进式攻击闯进其实不是1件特别困难的事情,只要在利用表单输进的内容构造SQL命令之前,把所有输进内容过滤1番便可以够了。过滤输进内容可以按多种方式进行。
1 2 下1页
核心提示:所谓SQL注进式攻击,就是攻击者把SQL命令插进到Web表单的输进域或页面要求的查询字符串,欺骗服务器履行恶意的SQL命令。在某些表单中,用户输进的内容直接用来构造(或影响)动态SQL命令...
⑴ 对动态构造SQL查询的场合,可使用下面的技术:
第1:替换单引号,即把所有单独出现的单引号改成两个单引号,避免攻击者修改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'”不同的结果。
第2:删除用户输进内容中的所有连字符,避免攻击者构造出类如“SELECT * from Users WHERE login = 'mas' -- AND password =''”之类的查询,由于这类查询的后半部份已被注释掉,不再有效,攻击者只要知道1个正当的用户登录名称,根本不需要知道用户的密码便可以够顺利取得访问权限。
第3:对用来履行查询的数据库帐户,限制其权限。用不同的用户帐户履行查询、插进、更新、删除操纵。由于隔离了不同帐户可履行的操纵,因此也就避免了本来用于履行SELECT命令的地方却被用于履行INSERT、UPDATE或DELETE命令。
⑵ 用存储进程来履行所有的查询。SQL参数的传递方式将避免攻击者利用单引号和连字符实行攻击。另外,它还使得数据库权限可以限制到只答应特定的存储进程履行,所有的用户输进必须遵从被调用的存储进程的安全上下文,这样就很难再产生注进式攻击了。
⑶ 限制表单或查询字符串输进的长度。假设用户的登录名字最多只有10个字符,那末不要认可表单中输进的10个以上的字符,这将大大增加攻击者在SQL命令中插进有害代码的难度。
⑷ 检查用户输进的正当性,确信输进的内容只包括正当的数据。数据检查应当在客户端和服务器端都履行——之所以要履行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。
在客户端,攻击者完全有可能取得网页的源代码,修改验证正当性的脚本(或直接删除脚本),然后将非法内容通过修改后的表单提交给服务器。因此,要保证验证操纵确切已履行,唯1的办法就是在服务器端也履行验证。你可使用很多内建的验证对象,例如RegularExpressionValidator,它们能够自动天生验证用的客户端脚本,固然你也能够插进服务器真个方法调用。假设找不到现成的验证对象,你可以通过CustomValidator自己创建1个。
⑸ 将用户登录名称、密码等数据加密保存。加密用户输进的数据,然后再将它与数据库中保存的数据比较,这相当于对用户输进的数据进行了“消毒”处理,用户输进的数据不再对数据库有任何特殊的意义,从而也就避免了攻击者注进SQL命令。System.Web.Security.FormsAuthentication类有1个HashPasswordForStoringInConfigFile,非常合适于对输进数据进行消毒处理。
⑹ 检查提取数据的查询所返回的记录数目。假设程序只要求返回1个记录,但实际返回的记录却超过1行,那就当作出错处理。
上1页 1 2 http://www.fw8.net/TAG:用户,内容,攻击者,命令,表单
评论加载中...
|