海妖 发表于 2015-1-16 22:18:38

ASP教程之进修ASP之编写平安的ASP代码

使用filesystemobject,可以对服务器上的文件进行操作,浏览、复制、移动、删除等。有ado的支持,asp对数据库的操作非常得心应手。你甚至可以像使用本地数据库那样,管理远程主机上的数据库,对表格、记录进行各种操作。平安ASP中数据库的平安是一个很严厉的成绩。良多代码的编写者意想到了这类成绩,而且不寒而栗地对他们以为有成绩的中央做了弥补,但罕见的情形是要末没有穷尽一切的可疑地址,要末这类弥补逻辑上有误。关于一个耐烦且嗅觉敏捷的打击者来讲,这类意义上的弥补措施和没有任何弥补措施没有实质上区分。

上面排列的是一些大概呈现的成绩:有些是罕见易犯的毛病,有些基本就是逻辑上有成绩。看看你是否是也如许写过?关于打击者而言,倒着看这些器材,应当对寻觅毛病有点匡助,更加完全一点的检测办法,请等我的关于黑/白盒剖析和主动化测试文章。

1、使人困惑的过滤体例

典范例子是不论掉臂地对一切的输出变量都往失落单引号,大概是把单引号交换成正当的两个单引号,比方:

id=replace(request.querystring("id"),"","")

str=replace(request("someinput"),"","")

如今很了然的是,第一个做法很有多是毛病的。由于引发SQLInjection的不老是单引号,再扩展一点,引发成绩的不是任何独自的标记,如许子的过滤,有些冤枉单引号了。准确的使用注进,主要的一点是闭合后面的一句SQL查询语句――常常是得先准确地闭合后面一个前提,由于我们大概会在统一句内里引进新的前提,弥补措施只需损坏注进前提应当就能够了,可是思索到其庞大性(上面会说),最好仍是较为完全的限定一下输出的字符品种。

第二个看起来是没有甚么成绩的,但潜伏的会带来一些隐患。这很简单给天然成的一个错觉是,我对输出的字符串已很无效的做过处置了,今后利用没有甚么成绩。这句话没有错,对字符串来讲如许做也是很准确的,可是他饰演了一个不但彩的脚色,试想一下,假如过滤后的字符串放进了数据库,尔后续的语句有间接拿出来利用的,这类对后面过滤的依附性,是否是准确的呢?

大概较好的做法应当是,针对详细的情形来断定过滤的原则。

罕见的输出变量有三种:数字,字符串另有汇合。关于数字型的输出变量,复杂挪用一下判别函数便可,见失掉的代码中,但凡反省了这类变量的,几近都准确。关于字符串型的来讲,基础上在拔出到天生的SQL语句时,前后都有单引号,假如仅从损坏注进前提来看,把单引号交换成两个单引号应当成绩不年夜。同理的,假如是一个字符串的汇合,也能够复杂的用这类办法。而假如是数字的汇合,情形大概略微贫苦一点,最少你得同意数字、逗号也许另有空格之类的标记在输出中一般呈现,如许子的过滤划定规矩大概显得庞大,不外你能够自创一下dvBBS6.1打过补钉后的版本,总的来讲,关于已发明的过滤毛病而言,他们仍是补得对照好的。

关于第二句话,最少如今不克不及说它说错的,我们留待前面办理。

2、猎取的数据值得信任吗?

实在如许子说局限显得有点年夜,一会儿触及到良多方面,一个例子一个例子地举来看好了。

起首是关于选择过滤数据的成绩。一向以来,我们以为但凡用户输出的器材,都要经由得当的处置。没错,但真实的是不是都做到呢?任意找个抓包的工具,好比Ethereal,看看在你用IE提交表单大概是翻开毗连的时分,都提交了甚么。大概,复杂一些,翻开NetAnt编纂一个义务,在协定标签中,看看谁人“自界说提交者”和“用户代办署理”的选项。

我想你已分明了,对方能够本人定制的器材不单单是GET或POST过去的数据!假如一切的用户都规行矩步地用扫瞄器,的确不必戒备这么严,假如对方不这么厚道,在取服务端变量或Cookie的时分可要当心了,没有任何人可以包管你取得的数据是正当的。关于Cookie而言,良多程序都出干涉题,以是之前夸大得对照多,至于别的的,存眷的人大概对照少一点,但你是不是看过大概写过如许的代码:

sql="ShowHOT_COM_inst_online_char2,"&statuserid&","&membername&","&memberclass&","&Request.ServerVariables("REMOTE_HOST")&","&boardid&","&Request.ServerVariables("HTTP_USER_AGENT")&","&replace(stats,"","")&","&Request.ServerVariables("HTTP_X_FORWARDED_FOR")&","&UserGroupID&","&actCome&","&userhidden&","&userid&""

Request.ServerVariables("HTTP_USER_AGENT")就是你在NetAnt中看到的用户代办署理选项,也就是说你能够假造,一样能够假造的另有Request.ServerVariables("HTTP_REFERER"),也就是你在NetAnt中看到的提交者选项等等。在做一些项目标时分,很有大概要将这一类的变量增加进数据库,这时候候要万万当心,这个中央的疏忽,引发的成果和其他范例变量未过滤招致的成果是一样的。

在Google上搜刮Referer和Request.ServerVariables两个关头字,还能够看到良多有成绩的写法,大概往看看蒲月份摆布的关于动网论坛进侵的文章,大概你的了解会加倍深入一点。

然后是一个埋没得略微深一点的成绩,不是用户的间接输出要不要过滤?

这就回到了我们后面留下的谁人成绩,单引号换成两个单引号的潜伏威逼。在第二次机关SQL语句的时分,倘使数据是从数据库内里间接往掏出来用的,多半情形下人们会以为后面已处置过的器材看起来仿佛并没有需要再处置,大概爽性就是没无意识到应当处置。这是极为毛病的!从两个方面来看,起首你进库的时分对提交数据中的单引号处置,仅仅是包管了单次SQL语句机关的准确性,并没有与日俱增地办理成绩;再说了,前面掏出数据用的时分,对数据平安性反省的依附并没有失掉包管,由于这类依附干系没有传送上去,并且依附干系自己还不是可传的。

就replace(request("someinput"),"","")而言,它的不安宁性在于这类过滤体例只是一种让步,换句话说只是在无限的局限内掩饰了大概呈现的成绩,而没有永世性的处置失落。它另有一个厌恶的中央在于给人一种错觉,仿佛是处置过的数据已平安了,简单让后继的代码编写者发生虚幻的平安感。对这两个缺点,不是靠换一个写法就可以办理的,由于假如你把单引号爽性往失落,又会引来别的一个成绩,输出数据中的确有必要并且准确的单引号怎样办?从一入手下手我就说,单引号自己是无罪的,过滤它只是一种办理手腕罢了,以是我们仍是就如许写吧,不外要在后继的部分增强一下反省。

这一类的成绩,假如仍然用动网论坛做例子,我倡议看一下六月八号的毛病文章。

另有就是过滤器的地位,这个搀杂了逻辑成绩在内的庞大成绩。

我已经十分惊异地发明乔客论坛对外分布的版本中一段让人以为难以想象的成绩代码,假如你对照感乐趣的话,翻翻gallery.asp就可以看到一个特定的举措序列(action=flash_view),绕过了一切对id的反省。

实在提及来,这一类代码不太大概有太庞大的逻辑布局,对代码举行检察的时分,举行一切的分支掩盖是能够手工完成的,只需略微想一想就会发明对变量的反省是不是可以无效地抵达你的目标地――天生SQL语句的中央。

关于过滤器的地位,假如要深切下往,即刻就会出来一些让人头昏眼花的器材,两头的剖析很贫苦并且很情势化,固然的确有算法能够包管地位拔取的准确性,可是我想这里仍是给出一些结论性的器材吧。倘使你很有乐趣,我想你能够来信和我交换。

过滤的地位,取决于两个方面:你取得变量的来历,和你必要包管到的天生SQL语句的地位。后面一个,不管是来自于间接仍是直接输出,先想一想大概的输出字符;关于前面一个,你要包管不管程序运转情形如何,经由了过滤语句的流程必定会经由你必要包管到的天生SQL语句的地位(包管其是无效过滤语句的后向必经节点)。假如你不很分明流程的判别,我的倡议是if中仅仅判别,if嵌套间不要有过剩的器材,过滤语句后紧接天生SQL语句。

再回到后面提到的潜伏成绩,我们终究能够在这里办理了:在掏出数据后仍然起首举行判别。由于依据后面说的,这一种直接输出仍然有大概呈现伤害。

说到这里,插一句另类的过滤地位成绩:不要把对输出的过滤放到客户端办理,那是能够绕过的!谁能包管你的VBScript/JavaScript能起感化,假如他人间接用NC大概一个不撑持剧本的扫瞄器呢?

上述两个年夜的方面,以软件测试的眼光来熟悉,明显是没有穷尽一切的分支所招致。在利用对方提交的数据之前,先做一个对方一切大概进进字符的剖析列表,然后就每种输出分支情形举行范例的考核,这是每一个代码编写者都应当做的事变。这是一件很复杂的事变,由于只是范例上的考核还好,碰上语义的成绩就贫苦了……

3、范例准确意味着放行?

触及到语义的成绩,如果大概的话,我选择最好仍是避开。

比如关于一个整型数字,你输出切实其实实是一个整型,经由过程了过滤器,潜伏的成绩是你的输出内容上正当吗,大概基本就不该该从你这里取得信息?良多年前就有人提出来,有些注册的模块存在成绩:它内里的id是经由过程一个type=hidden掩饰后隐式提交的,可是我在第一步创建了用户,第二步仍就有大概经由过程提交内容分歧法的id来修正别人的信息。这类异类的成绩都长短常难发明,并且几近都只要靠履历而不是某一个详细的算法来处置。我们在接洽一下后面的,连起来想一想也许可以加倍分明,关于输出的字符串,感到上没有过滤也不会有错,由于对照数字之类汇合来讲,字符串所能包容的几近是全体大概输出的汇合。现实上,罕见的是没有过滤形成单引号的毛病婚配,进而招致了SQLInjection。严厉提及来,这也是一个语义上的成绩,不外关于如许子的特别情形而言,能够经由过程处置输出中的单引号来包管语义的某种水平上的准确。以是我也几回再三夸大,单引号自己是无罪的,不外是背了语义的黑锅罢了。

使人遗憾的是,假如是整型数据出了语义上的成绩,没有甚么器材能够替语义背黑锅了,以是没有了一个必定水平上通用的办理计划。不外也不要失望,后面就已说过,能避开就避开,釜底抽薪不要让大概有语义成绩的变量作为输出好了。

仅仅思索数据库平安的话,一切有威逼的语义成绩都几近出在对数据库的操纵上,那末,我们只需注重update/insert等语句就能够了,假如思索数据内容的平安性的话,select也得算上。一样平常来讲,出格存眷的是天生的where前面的前提语句,总以为前提的语义应当是由服务器端决意的,而不是说用户的输出是甚么就是甚么。我的倡议是关于一切的大概呈现语义成绩的整型变量,最好都是Session,固然,没有举行十分深切的研讨,也许有人可以提出像凑合字符串的语义成绩一样的无效办法也说纷歧定。不外话又说返来,在语义层面上看对字符串的过滤,不克不及证实它不平安,可是更主要的没有人可以证实它平安,只是人人如今用着没有成绩,也就默许了而已。

若要深切的剖析语义,也会俄然冒出一年夜堆奇异的器材,以是仍是就此打住吧,逼真的但愿偕行之间可以多一些这方面的交换!

后面说的大概更多地会用在一些对既有代码的弥补上,假如是重新入手下手构架一个软件的话,下面的仅仅是计划上一些参考。一切的毛病都是源于计划上的缺点,一个好的软件应当被证实其模子是准确的,这很难可是能够做到。假如你一入手下手就证实了软件的准确性,我想也不会有漏子能够给他人钻了。Windows本身的所有问题都会一成不变的也累加到了它的身上。安全性、稳定性、跨平台性都会因为与NT的捆绑而显现出来;

小魔女 发表于 2015-1-19 07:58:13

代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。

小妖女 发表于 2015-1-24 15:20:33

Session:这个存储跟客户端会话过程的数据,默认20分钟失效

若相依 发表于 2015-2-1 19:04:51

Application:这个存储服务端的数据,如果不清除,会直到web应用程序结束才清除(例如重启站点)

灵魂腐蚀 发表于 2015-2-7 14:41:57

作为IE上广为流传的动态网页开发技术,ASP以它简单易学博得了广大WEB程序爱好这的青睐,而且它对运行环境和开发品台的不挑剔,以及有大量有效的参考手册,极大的推广了它的发展。

再现理想 发表于 2015-2-22 11:00:20

ASP主要是用好六个对象,其实最主要的是用好其中两个:response和request,就可以随心所欲地控制网页变换和响应用户动作了。

金色的骷髅 发表于 2015-3-7 00:11:36

最近在学asp,不要问我为什么不直接学.net,因为公司网站是asp做的所以有这个需要,卖了本书asp入门到精通,对里面的六大内置对象老是记不住,还有很多属性和方法看的头晕。

飘飘悠悠 发表于 2015-3-13 23:16:39

掌握asp的特性而且一定要知道为什么。

变相怪杰 发表于 2015-3-20 23:08:01

以HTML语言整合(HTML负责界面上,ASP则负责功能上)形成一个B/S(浏览器/服务器)模式的网页程序。
页: [1]
查看完整版本: ASP教程之进修ASP之编写平安的ASP代码