ASP网页编程之怎样提防SQl注进
对于中小型web应用来说,php有很强的竞争力,linux+apache+mysql+php(lamp)的组合几乎可以胜任绝大多数网站的解决方案,对于大型应用来讲,对于系统架构要求更高,需要有成熟的框架支持,jsp的struts是个不错的框架,国内介绍它的资料也非常多,应用逐渐广泛起来。asp就不用说了,sql 在计划大概保护Web网站时,你大概忧虑它们会遭到某些下游用户的歹意打击。切实其实,现在的Web网站开辟者们针对其站点地点操纵体系平台或Web服务器的平安性而睁开的会商其实太多了。不错,IIS服务器的平安毛病大概招致歹意打击;但你的平安反省清单不该该仅唯一IIS平安性这一条。有些代码,它们一般是专门为数据驱动(data-driven)的Web网站而计划的,实践上常常同别的IIS毛病一样存在严峻的平安隐患。这些埋伏于代码中的平安隐患就有大概被称为“SQL指令植进式打击”(SQLinjection)的手腕所使用而招致服务器遭到打击。SQL指令植进式打击手艺使得打击者可以使用Web使用程序中某些疏于提防的输出时机静态天生特别的SQL指令语句。举一个罕见的例子:
某Web网站接纳表单来搜集会见者的用户名和暗码以确认他有充足权限会见某些保密信息,然后该表单被发送到Web服务器举行处置。接上去,服务器真个ASP剧本依据表单供应的信息天生SQL指令语句提交到SQL服务器,并经由过程剖析SQL服务器的前往了局来判别该用户名/暗码组合是不是无效。
为了完成如许的功效,Web程序员大概会计划两个页面:一个HTML页面(Login.htm)用于登录,另外一个ASP页面(ExecLogin.asp)用于考证用户权限(即向数据库查询用户名/暗码组合是不是存在)。详细代码大概象如许:
Login.htm(HTML页面)代码:
<formaction="ExecLogin.asp"method="post">
Username:<inputtype="text"name="txtUsername"><br>
Password:<inputtype="password"name="txtPassword"><br>
<inputtype="submit"></form>
ExecLogin.asp(ASP页面)代码:
<%
Dimp_strUsername,p_strPassword,objRS,strSQL
p_strUsername=Request.Form("txtUsername")
p_strPassword=Request.Form("txtPassword")
strSQL="SELECT*FROMtblUsers"&_"WHEREUsername="&p_strUsername&_"andPassword="&p_strPassword&""
SetobjRS=Server.CreateObject("ADODB.Recordset")
objRS.OpenstrSQL,"DSN=..."
If(objRS.EOF)Then
Response.Write"Invalidlogin."
Else
Response.Write"Youareloggedinas"&objRS("Username")
EndIf
SetobjRS=Nothing
%>
乍一看,ExecLogin.asp的代码仿佛没有任何平安毛病,由于用户假如不给出无效的用户名/暗码组合就没法登录。但是,这段代码恰恰不平安,并且它恰是SQL指令植进式打击的幻想方针。详细而言,计划者把用户的输出间接用于构建SQL指令,从而使打击者可以自行决意行将被实行的SQL指令。比方:打击者大概会在表单的用户名或暗码栏中输出包括“or”和“=”等特别字符。因而,提交给数据库的SQL指令便可能是:代码:SELECT*FROMtblUsersWHEREUsername=or=andPassword=or=
如许,SQL服务器将前往tblUsers表格中的一切纪录,而ASP剧本将会因而而误以为打击者的输出切合tblUsers表格中的第一笔记录,从而同意打击者以该用户的名义登进网站。
SQL指令植进式打击另有另外一种情势,它产生在ASP服务器依据querystring参数静态天生网页时。这里有一个例子,此ASP页面从URL中提掏出querystring参数中的ID值,然后依据ID值静态天生后继页面:
代码:
<%Dimp_lngID,objRS,strSQL
p_lngID=Request("ID")
strSQL="SELECT*FROMtblArticlesWHEREID="&p_lngID
SetobjRS=Server.CreateObject("ADODB.Recordset")
objRS.OpenstrSQL,"DSN=..."
If(NotobjRS.EOF)ThenResponse.WriteobjRS("ArticleContent")
SetobjRS=Nothing
%>
在一样平常情形下,此ASP剧本可以显现具有特定ID值的文章的内容,而ID值是由URL中的querystring参数指定的。比方:当URL为http://www.ckuyun.com/Article.asp?ID=1055时,ASP就会依据ID为1055的文章供应的内容天生页面。
好像前述登录页面的例子一样,此段代码也向SQL指令植进式打击关闭了年夜门。某些歹意用户大概会把querystring中的文章ID值掉包为“0or1=1”等外容(也就是说,把URL换成http://www.ckuyun.com/Article.asp?ID=0or1=1)从而诱使ASP剧本天生不平安的SQL指令如:
代码:SELECT*FROMtblArticlesWHEREID=0or1=1
因而,数据库将会前往一切文章的内容。
固然了,本例服务器所受的打击纷歧定会引发甚么严峻成果。但是,打击者却大概无以复加,好比用一样的手腕发送DELETE等SQL指令。这只必要复杂地修正前述URL中的querystring参数就能够了!比方:任何人都能够经由过程“http://www.ckuyun.com/Article.asp?ID=1055;DELETEFROMtblArticles”之类的URL来会见Web网站。
SQL指令植进式打击的伤害
SQL指令植进式打击大概引发的伤害取决于该网站的软件情况和设置。当Web服务器以操纵员(dbo)的身份会见数据库时,使用SQL指令植进式打击便可能删除一切表格、创立新表格,等等。当服务器以超等用户(sa)的身份会见数据库时,使用SQL指令植进式打击便可能把持全部SQL服务器;在某些设置下打击者乃至能够自行创立用户帐号以完整利用数据库地点的Windows服务器。
根绝SQL指令植进式打击
根绝SQL指令植进式打击的第一步就是接纳各类平安手腕监控来自ASPrequest工具(Request、Request.QueryString、Request.Form、Request.Cookies和Request.ServerVariables)的用户输出,以确保SQL指令的牢靠性。详细的平安手腕依据你的DBMS而异,上面给出的都是基于MSSQLServer的例子。
在前述登录页面的例子中,剧本希冀失掉的两个输出变量(txtUserName和txtPassword)均为字符串范例。不管用户在哪一个参数中拔出单引号,他都大概让数据库实行单引号中的SQL指令。为了根绝此类SQL指令植进式打击,我们能够借助Replace函数剔除单引号,好比:
代码:p_strUsername=Replace(Request.Form("txtUsername"),"","")
p_strPassword=Replace(Request.Form("txtPassword"),"","")
在第二个例子中,剧本希冀的输出变量是长整型变量(ID)。用户能够经由过程在ID参数中拔出特别字符来运转不平安的SQL指令。为了为了根绝此类SQL指令植进式打击,我们只必要借助CLng函数限定ID值为长整型变量,好比:
代码:p_lngID=CLng(Request("ID"))
当用户试图在ID中包括特别字符时,CLng就会发生一个毛病。
为了进一步削减SQL指令植进式打击的危胁,请务必扫除客户端毛病信息文本中的一切手艺材料。某些毛病信息常常保守了手艺细节,从而让打击者能够看出服务器的平安毛病地点。这里指的毛病信息不仅包含使用程序天生的动静框,还包含来自IIS的堕落提醒。为此,你能够克制由IIS发送的具体毛病信息,而改用自界说的堕落页面。(关于创立自界说的堕落页面的更多信息,请务必参阅《CreatingCustomASPErrorPages》。)
最初,为了加重SQL指令植进式打击的伤害,请限定Web使用程序所用的数据库会见帐号权限。一样平常来讲,使用程序没有需要以dbo大概sa的身份会见数据库。记着,给它的权限越少,你的网站越平安!你还能够思索分离给每一个必要会见数据库的工具分派只具有必须权限的帐号,以分离平安毛病。比方:同是前端用户界面,当用于公开场合时就比用于具有当地内容办理机制的平台时加倍必要严厉限定数据库会见权限。
相干材料
在Internet上有许很多多关于本话题的有效资本。我想以下毗连大概会对你有所匡助:
*SQLInjectionFAQ(http://www.sqlsecurity.com/)
*AdvancedSQLInjectionWhitePaper(http://www.nextgenss.com/research.html)
*PreventingSQLInjection
http://www.owasp.org/asac/input_validation/sql.shtml)想法是和程序员的想法不一样的.至于为什么.大家去想一想.跟心理学有关的 我们必须明确一个大方向,不要只是停留在因为学而去学,我们应有方向应有目标. 虽然ASP也有很多网络教程。但是这些都不系统。都是半路出家,只是从一个例子告诉你怎么用。不会深入讨论,更不会将没有出现在例子里的方法都一一列举出来。 Application:这个存储服务端的数据,如果不清除,会直到web应用程序结束才清除(例如重启站点) 先学习用frontpage熟悉html编辑然后学习asp和vbscript建议买书进行系统学习 哪些内置对象是可以跳过的,或者哪些属性和方法是用不到的? 运用ASP可将VBscript、javascript等脚本语言嵌入到HTML中,便可快速完成网站的应用程序,无需编译,可在服务器端直接执行。容易编写,使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行。 另外因为asp需要使用组件,所以了解一点组件的知识(ADODB也是组件) 哪些内置对象是可以跳过的,或者哪些属性和方法是用不到的?
页:
[1]