ASP.NET中如何防范SQL注入式攻击

ASP.NET中如何防范SQL注入式攻击,第1张

ASP.NET中如何防范SQL注入式攻击,第2张

一、什么是sql注入攻击?
所谓sql注入攻击,就是攻击者将sql命令插入到web表单的输入字段或者页面请求的查询字符串中,诱骗服务器执行恶意的sql命令。在某些形式中,用户输入的内容直接用于构造(或影响)动态sql命令,或者用作存储过程的输入参数。这种表单特别容易受到sql注入攻击。常见的sql注入攻击如下:
⑴一个ASP.NET Web应用有一个登录页面,这个页面控制着用户是否有权限访问该应用,它要求用户输入用户名和密码。
⑵登录页面中输入的内容将直接用于构造动态sql命令或作为存储过程的参数。下面是一个ASP.NET应用构造查询的例子:
system . text . stringbuilder
query = new system . text . stringbuilder(

" select * from users where login = ' ")

。append(txtlogin.text)
。追加("'和密码= ' ")

。append(txtpassword.text)。追加(“”);


⑶攻击者在用户名和密码输入框中输入类似“'或' 1'='1 '的内容。
⑶用户的输入提交给服务器后,服务器运行上面的ASP.NET代码构造sql命令来查询用户。但由于攻击者的输入非常特殊,最终的sql命令变成了:
select * from users where
log in = '或' 1' =' 1 '和
password。


⑸服务器执行查询或存储过程,将用户输入的身份信息与服务器中存储的身份信息进行比较。
[6]由于sql命令实际上已经被注入攻击修改,用户的身份已经无法得到真正的验证,所以系统会错误地授权给攻击者。
如果攻击者知道表单中输入的内容将直接用于身份验证的查询中,他会试图输入一些特殊的sql字符串来篡改查询以改变其原有功能,欺骗系统授予访问权限。
攻击者可能造成的损害因系统环境而异,主要由应用程序访问数据库的安全权限决定。如果用户的帐户具有管理员或其他更高级别的权限,攻击者可以对数据库的表执行他想要的各种操作,包括添加、删除或更新数据,甚至直接删除表。
二、如何防范
好在防止ASP.NET应用被sql注入攻击入侵并不是一件特别困难的事情。在使用它们来构造sql命令之前,只需过滤所有的输入内容。对输入内容的过滤可以有多种方式⑴对于sql查询的动态构造,可以使用以下技巧:
一、替换单引号,即将所有单独出现的单引号改为两个单引号,防止攻击者修改sql命令的含义。看前面的例子,“select * from users where log in = ' or ' 1 ' = ' 1 ' and password = ' or ' 1 ' = ' 1 '”显然会得到与“select * from users where log in = ' or ' 1 ' = ' 1 ' and”
相同的结果第二:删除用户输入内容中的所有连字符,防止攻击者构造诸如“select * from users where log in = ' MAS '-and password = ' '”这样的查询,因为这类查询的后半部分已经被注释掉,不再有效。只要攻击者知道一个合法的用户登录名,他就可以在完全不知道用户密码的情况下成功获得访问权限。
第三:限制用于执行查询的数据库帐户的权限。使用不同的用户帐户执行查询、插入、更新和删除操作。因为可以由不同帐户执行的操作是隔离的,所以防止了最初用于执行select命令的位置被用于执行insert、update或delete命令。
⑵使用存储过程执行所有查询。sql参数的传递方式将防止攻击者使用单引号和连字符。此外,它还允许将数据库权限限制为只允许执行特定的存储过程,并且所有用户输入必须符合被调用存储过程的安全上下文,这样注入攻击就很难再次发生。
⑶限制输入表单或查询字符串的长度。如果用户的登录名最多只有10个字符,那么就不要识别表单中输入的10个以上的字符,这样会大大增加攻击者在sql命令中插入有害代码的难度。
(4)检查用户输入的合法性,确保输入内容只包含合法数据。数据校验要在客户端和服务器端都进行——之所以要进行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。
在客户端,攻击者完全有可能获取网页的源代码,修改验证合法性的脚本(或者直接删除脚本),然后通过修改后的表单将非法内容提交给服务器。因此,确保验证操作已经实际执行的唯一方法是也在服务器端执行验证。
您可以使用许多内置的验证对象,如regularexpressionvalidator,它可以自动生成用于验证的客户端脚本。当然,也可以插入服务器端的方法调用。如果找不到现成的验证对象,可以通过customvalidator自己创建一个。
⑸加密保存用户登录名、密码等数据。对用户输入的数据进行加密,然后与数据库中存储的数据进行比对,相当于对用户输入的数据进行了“消毒”,用户输入的数据对数据库不再有任何特殊意义,从而防止了攻击者注入sql命令。系统。web . security . forms authentiation类有一个hashpasswordforstorningconfigfile,非常适合输入数据的消毒。
[6]检查提取数据的查询返回的记录数。如果程序只要求返回一条记录,但实际返回的记录不止一行,则视为错误。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » ASP.NET中如何防范SQL注入式攻击

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情