注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

asp.net防止sql语句的注入  

2011-02-25 17:34:18|  分类: asp.net |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

1、sql注入角力计较难防,必要更换select,delete等一打字符

原来对付字符型更换再多都没有更换单引号为两个单引号来的好!对付数字型更换再多都没有效,肯定要类别转换。

2、疏忽DropDownList传来的用具

原来是过错的,一概客户真个用具都是弗成相信的,select下拉框也是!由于可以自己做一个htm提交到供职器。

3、access比sqlserver担心好

安好担心好要害看怎么用,假使sqlserver依旧像access一样用,一个sa帐户的话,很清楚,sqlserver比access担心好,可以直接得到表名和字段名!access反而倒安好点了,由于只能议决逐位猜解得到。

4、网站没有显现失足信息就阐明网站是安好的

当有记载的时辰显现记载,没有记载的时辰显现找不到任何记载,议决这两种状态就可以猜解字段名了,因此网页不失足不克阐明是安好的

5、疏忽post提交的信息

许多人对url上转达的用具过滤严厉,对付post的用具不睬不理是过错的,post的用具特别加倍简单被注入,由于普通字段角力计较多

在asp.net中猛烈倡议议决参数来实现sql而不是sql拼接,由于就算你每一个都过滤百密难有疏

歧:

SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSe ttings.AppSettings["conn"]);

SqlCommand comm=new SqlCommand("update tb1 set vName=@vName,iAge=@iAge where ID=@id",conn);

SqlParameter parm1=new SqlParameter("@vName",SqlDbType.NVarChar,50);

parm1.Value=((TextBox)e.Item.FindControl("name")). Text;

SqlParameter parm2=new SqlParameter("@iAge",SqlDbType.Int);

parm2.Value=((TextBox)e.Item.FindControl("age")).T ext;

SqlParameter parm3=new SqlParameter("@id",SqlDbType.Int);

parm3.Value=this.DataGrid1.DataKeys[e.Item.ItemInd ex];

comm.Parameters.Add(parm1);

comm.Parameters.Add(parm2);

comm.Parameters.Add(parm3);

conn.Open();

comm.ExecuteNonQuery();

conn.Close();

这样的代码看起来舒服并且又安好,何乐不为? 【导读】本文引见了五种多见的ASP.NET应用步骤安好缺陷

一、不克盲目信任用户输入

在Web应用开拓中,开拓者最大的失误时常是无条件地相信用户输入,假定用户(纵使是恶意用户)总是受到阅读器的限定,总是议决阅读器和供职器交互,从而打开了进攻Web应用的大门。现实上,黑客们进攻和操纵Web网站的器材许多,基础不用范围于阅读器,从最低级的字符模式的原始界面(比如telnet),到CGI剧本扫描器、Web代办、Web应用扫描器,恶意用户或者采纳的进攻模式和方法许多。

因此,只有严实地验证用户输入的正当性,能力有用地抵抗黑客的进攻。应用步骤可以用多种要领(乃至是验证范畴重叠的要领)执行验证,比如,在承认用户输入之前执行验证,确保用户输入只蕴涵正当的字符,并且全部输入域的内容长度都没有超出范畴(以防备或者出现的缓冲区溢出进攻),在此根本上再执行其他验证,确保用户输入的数据不只正当,并且公道。须要时不只可以选拔强迫性的长度限定战略,并且还可以对输入内容依照明了界说的特性集执行验证。下面几点倡议将帮助你正确验证用户输入数据:

⑴ 始终对全部的用户输入执行验证,且验证务必在一个可靠的平台上实行,应当在应用的多个层上实行。

⑵ 除了输入、输出效用必须的数据之外,不要许可其他任何内容。

⑶ 建立"相信代码基地",许可数据进来相信境况之前执行彻底的验证。

⑷ 登录数据之前先搜检数据类别。

⑸ 仔细地界说每一种数据式样,比如缓冲区长度、整数类别等。

⑹ 严厉界说正当的用户央求,拒绝全部其他央求。

⑺ 测试数据是否餍足正当的条件,而不是测试不正当的条件。这是由于数据不正当的状况许多,难以仔细罗列。

二、五种多见的ASP.NET安好缺陷

下面给出了五个例子,论述怎样依照上述倡议增强应用步骤的安好性。这些例子树范了代码中或者出现的缺陷,以及它们带来的安好危机、怎样改写最少的代码来有用地低沉进攻危机。

2.1 修改参数

◎ 操纵ASP.NET域验证器

盲目相信用户输入是保险Web应用安好的第一仇敌。用户输入的主要来历是HTML表单中提交的参数,假使不克严厉地验证这些参数的正当性,就有或者危及供职器的安好。

下面的C#代码盘问后端SQL Server数据库,假设user和password变量的值直接取自用户输入:

SqlDataAdapter my_query = new SqlDataAdapter(

"SELECT * FROM accounts WHERE acc_user='" + user + "' AND acc_password='" + password, the_connection);

从外观上看,这几行代码毫无题目,现实上却或者引来SQL注入式进攻。进攻者只要在user输入域中输入"OR 1=1",就可以顺遂登录编制,或许只要在盘问之后加上妥当的挪用,就可以执行随意Shell号召:

'; EXEC master..xp_cmdshell(Oshell command here')--

■ 危机剖析

在编写这几行代码时,开拓者有时之中作出了这样的假定:用户的输入内容只蕴涵"正常的"数据--合乎人们通常民风的用户名字、暗码,但不会蕴涵引号之类的格外字符,这正是SQL注入式进攻也许得逞的基础因为。黑客们可以借助一些具有格外寄义的字符转变盘问的本意,进而挪用随意函数或进程。

■ 处分方案

域验证器是一种让ASP.NET开拓者对域的值践诺限定的机制,比如,限定用户输入的域值务必配合特定的表达式。

要防备上述进攻行动得逞,第一种方法是阻止引号之类的格外字符输入,第二种方法更严厉,即限定输入域的内容务必属于某个正当字符的齐集,比如"[a-zA-Z0-9]*"。

2.2 修改参数之二
◎ 制止验证操纵的缺点

然而,只是为每个输入域引入验证器还不克防备全部议决修改参数践诺的进攻。在执行数值范畴搜检之时,还要指定正确的数据类别。

也便是说,在操纵ASP.NET的范畴搜检控件时,应当依据输入域要求的数据类别指定妥当的Type属性,由于Type的默认值是String。

<!-- 要求输入值务必是1-9之间的数字 -->

<asp:RangeValidator ... MinimumValue="1" MaximumValue="9" .../>

■ 危机剖析

由于没有指定Type属性值,上面的代码将假定输入值的类别是String,因此RangeValidator验证器只能确保字符串由0-9之间的字符开始,"0abcd"也会被承认。

■ 处分方案

要确保输入值确实是整数,正确的方法是将Type属性指定为Integer:

<!-- 要求输入值务必是1-9之间的数字 -->

<asp:RangeValidator ... MinimumValue="1"

MaximumValue="9" Type="Integer"

2.3 信息走漏

◎ 让藏匿域特别加倍安好

在ASP.NET应用中,险些全部HTML页面的__VIEWSTATE藏匿域中都可以找到相关应用的信息。由于__VIEWSTATE是BASE 64编码的,因此频频被疏忽,但黑客可以方便地解码BASE 64数据,用不着花什么力气就可以得到__VIEWSTATE提供的细致资料。

■ 危机剖析

默认状况下,__VIEWSTATE数据将蕴涵:

⑴ 来自页面控件的动态数据。

⑵ 开拓者在ViewState中显式存储的数据。

⑶ 上述数据的暗码署名。

■ 处分方案

配置EnableViewStatMAC="true",启用__VIEWSTATE数据加密效用。然后,将machineKey验证类别配置成3DES,要求ASP.NET用Triple DES对称加密算法加密ViewState数据。

2.4 SQL注入式进攻

◎ 操纵SQL参数API

正如前文"修改参数"局部形容的,进攻者可以在输入域中插入格外字符,转变SQL盘问的本意,欺诈数据库供职器执行恶意的盘问。

■ 危机剖析

恶意盘问有或者获取后端数据库存储的任何信息,比如客户名誉卡号码的清单。

■ 处分方案

除了前方引见的方法--用步骤代码确保输入内容只蕴涵有用字符,另一种特别加倍强健的方法是操纵SQL参数API(比如ADO.NET提供的API),让编程境况的底层API(而不是步骤员)来结构盘问。

操纵这些API时,开拓者或许提供一个盘问模板,或许提供一个存储进程,然后指定一系列的参数值,由底层API将参数值嵌入到盘问模板,然后将结构出来的盘问提交给供职器盘问。这种方法的益处是确保参数也许正确地嵌入,比如,编制将对引号实行转义治理,从基础上杜绝SQL注入式进攻的产生。同时,在表单中引号还是一个许可输入的有用字符,这也是操纵底层API的一个长处。

依照这种思绪修改前文"修改参数"局部的例子,完结如下:

SqlDataAdapter my_query = new SqlDataAdapter("SELECT * FROM accounts

WHERE acc_user= @user AND acc_password=@pass", the_connection);

SqlParameter userParam = my_query.Select_Command.Parameters.Add(

"@user",SqlDb.VarChar,20);

userParam.Value=user;

SqlParameter passwordParam = my_query.Select_Command.Parameters.Add(

"@",SqlDb.VarChar,20);

passwordParam.Value=password;

2.5 跨站剧本执行

◎ 对外发的数据实行编码

跨站剧本执行(Cross-site scripting)是指将恶意的用户输入嵌入到应答(HTML)页面。比如,下面的ASP.NET页面固然简略,却蕴涵着一个重大的安好缺陷:

<%@ Page Language="vb" %>

<asp:Label id="Label1" runat="server">

标签笔墨

</asp:Label>

<form method="post" runat="server" ID="Form1">

请在此处输入反馈信息<br>

<asp:Textbox ID="feedback" runat="server"/><br>

<asp:Button id="cmdSubmit" runat="server"

Text="提交!" OnClick="do_feedback">

</asp:Button>

</form>

<script runat="server">

Sub do_feedback(sender As Object, e As System.EventArgs)

Label1.Text=feedback.Text

End Sub

</script>

■ 危机剖析

进攻者可以用JavaScript代码结构一个恶意的盘问,点击链接时JavaScript就会运行。举例来说,剧本可以议决下面的用户输入来嵌入:

<script>alert(document.cookie)

</script>

■ 处分方案

在一个双层的安好体系中,对HTML页面中出现的外发用户数据执行输入验证和HTML编码,确保阅读器只把用户输入数据当成纯粹的文本,而不是其他具有格外寄义的内容,比如HTML代码、JavaScript剧本。

对付本例,只要参与一个HtmlEncode挪用即可:

Label1.Text=Server.HtmlEncode(feedback.Text)

这样,应答HTML流将蕴涵用户输入内容的HTML编码版本,也便是说,阅读器不会执行用户输入的JavaScript代码,由于基础不存在HTML的"<SCRIPT>"标帜,用户输入的"<"和">"字符已经被更换成HTML编码版本,即"<"和">"。

三、操纵自动安好测试器材

由于客户需求不停改变,一些单元均匀每三个月就要安排新的应用,同时由于职员滚动,因此对开拓者快速开拓强健的、高质量的代码寄予很高的指望。固然对全部开拓者实行代码安好技能的培训好坏常须要的,但不克否定,自动检测代码安好缺点的器材也有助于快速开拓安好的应用步骤。
到现在为止,开拓者常用的器材只能涵盖效用测试的特定方面,比如性能测试,BUG/阻碍点侦查。人工搜检代码有着很多与生俱来的范围,并且要求开拓者具有丰裕的代码安好体验,因此对付编写高质量的应用来说,面向应用步骤安好及其在恶意境况下行动的器材也好坏常要害的。

要敏捷抬高应用的质量和安好性,最有用的方法是给开拓者提供一个自动测试应用的器材。假使在单位测试时期,器材也许检测出应用的安好缺陷,并将修补倡议嵌入到代码之中,开拓者就能立刻找出代码中存在的谬误,不只方便了现有谬误的修改,并且也有助于制止未来再犯同样的谬误,不停地抬高代码防守进攻的本领。

完毕语:Web供职应用正在爆炸式增长,越来越多的应用被推出到防火墙之外,安好性脆弱的Web应用面对的危机也只会有增无减。同时,为了在紧急的时限之前快速完成应用开拓,开拓者面对的压力也越来越大。注重编写代码时的安好题目,同时投入须要的资源,这样能力为将来的Web供职应用做好准备,同时确保当前应用的高质量。只有从应用的出生之日开始就选拔正确的办法来确保其安好性,能力结构出高质量、安好的应用。 ⑴ 某个ASP.NET Web应用有一个登录页面,这个登录页面控制着用户是否有权访问应用,它要求用户输入一个名称和暗码。

⑵ 登录页面中输入的内容将直接用来结构动态的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();

⑶ 进攻者在用户名字和暗码输入框中输入或1=1之类的内容。

⑷ 用户输入的内容提交给供职器之后,供职器运行上面的ASP.NET代码结构出盘问用户的SQL号召,但由于进攻者输入的内容非凡格外,因此最后得到的SQL号召酿成:SELECT * from Users WHERE login = or 1=1 AND password = or 1=1。

⑸ 供职器执行盘问或存储进程,将用户输入的身份信息和供职器中存储的身份信息实行比拟。

⑹ 由于SQL号召现实上已被注入式进攻修改,已经不克真正验证用户身份,因此编制会谬误地授权给进攻者。 假使进攻者知道应用会将表单中输入的内容直接用于验证身份的盘问,他就会测试输入某些格外的SQL字符串修改盘问转变其原来的效用,欺诈编制付与访问权限。

编制境况差异,进攻者或者造成的伤害也差异,这主要由应用访问数据库的安好权限决定。假使用户的帐户具有治理员或其他角力计较高级的权限,进攻者就或者对数据库的表执行各样他想要做的操纵,包罗增加、删除或更新数据,乃至或者直接删除表。

怎样防备?

幸亏要防备ASP.NET应用被SQL注入式进攻突入并不是一件格外困难的事项,只要在使用表单输入的内容结构SQL号召之前,把全部输入内容过滤一番就可以了。过滤输入内容可以按多种格式实行。

⑴ 对付动态结构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号召。

⑵ 用存储进程来执行全部的盘问。SQL参数的转达格式将防备进攻者使用单引号和连字符践诺进攻。别的,它还使得数据库权限可以限定到只许可特定的存储进程执行,全部的用户输入务必遵从被挪用的存储进程的安好上下文,这样就很难再产生注入式进攻了。

⑶ 限定表单或盘问字符串输入的长度。假使用户的登录名字最多只有10个字符,那么不要承认表单中输入的10个以上的字符,这将大大增加进攻者在SQL号召中插入有害代码的难度。

⑷ 搜检用户输入的正当性,确信输入的内容只蕴涵正当的数据。数据搜检应当在客户端和供职器端都执行--之因此要执行供职器端验证,是为了填充客户端验证机制脆弱的安好性。

在客户端,进攻者完全有或者得到网页的源代码,修改验证正当性的剧本(或许直接删除剧本),然后将非法内容议决修改后的表单提交给供职器。因此,要担保验证操纵确实已经执行,唯一的方法便是在供职器端也执行验证。你可以操纵很多内建的验证目标,比如RegularExpressionValidator,它们也许自动天生验证用的客户端剧本,固然你也可以插入供职器真个要领挪用。假使找不到现成的验证目标,你可以议决CustomValidator自己创建一个。

⑸ 将用户登录名称、暗码等数据加密存储。加密用户输入的数据,然后再将它与数据库中存储的数据角力计较,这相当于对用户输入的数据实行了"消毒"治理,用户输入的数据不再对数据库有任何格外的意义,从而也就防备了进攻者注入SQL号召。System.Web.Security.FormsAuthentication类有一个HashPasswordForStoringInConfigFile,非凡得当于对输入数据实行消毒治理。

⑹ 搜检提取数据的盘问所返回的记载数目。假使步骤只要求返回一个记载,但现实返回的记载却超出一行,那就看成失足治理

  评论这张
 
阅读(658)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017