大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> CGI专区 -> CGI教学:CGI安全问题(六)

CGI教学:CGI安全问题(六)

时间: 2021-07-31 作者:daque

2.10 处置外部过程  结果,cgi剧本怎样与带有外部进程的用户输出打交道是该当警告的另一地区。由于实行一个坐落本人的cgi剧本除外的步调表示着没辙遏制它做什么,必需尽最大全力在实行发端前考证发送给它的输出。  比方,shell剧本常常缺点地将一个吩咐路途序和表单输出合在一道实行。即使用户输出适合诉求,十足都挺平常,然而有大概会介入其它吩咐并不法实行。  底下即是一个爆发了这种缺点的剧本的例子: finger_output='finger$user_input' echo $finger_output  即使用户很规则地给finger输出了或人的e-mail地方,十足城市平常处事,然而即使他输出了一个e-mail地方,反面再跟一个分号和另一条吩咐,那么该吩咐也会被实行,即使用户输出了webmaster@www.server.com;rm-rf/,那烦恼可就大了。  纵然没有什么湮没的吩咐被介入用户数据,偶尔的输出缺点也大概带来烦恼。比方,底下的代码行会爆发一个预见除外的截止——列出目次中的一切文献——即使用户输出是一个对号的话。 echo "your input:"$user_input  当经过shell发送用户数据时,就象前方的代码片断所做的那么,最佳查看一下shell的meta-character(元字符)——那些大概会引导不料的动作。  那些字符囊括分号(承诺一条龙中有多条吩咐),对号和问号(实行文献配合),感触号(在csh下指运转的功课),单引号(实行一条包括个中的吩咐)之类。就像过滤文献名一律,保护一个承诺的字符清单普遍要较量图找到每个不承诺的字符简单少许。底下的perl代码片断考证一个e-mail地方: if ($email_address ~= /[^a-za-z0-9_\-\+\@\.]) { #lllegal character! } else { system("finger $email_address"); }  即使确定在输出中承诺shell元字符,也有方法让它们安定少许。纵然不妨大略地给未考证的用户输出加上引号免得shell按特出字符举行操纵,但这本质上不起什么效率。请看下的语句: echo"finger information:<hr><pre>" finger"$user_input echo"</pre>  纵然$user_input上的引号不妨使shell不复证明一个分号,进而不承诺黑客大略地插进入一条吩咐,但该剧本仍有很多安定上面的缺点。比方,输出大概是'rm-rf/',个中单引号不妨引导以至在finger不领会的情景下实行黑客的吩咐。  一种处置特出字符的较好的方法是对它们举行换码,如许剧本不过取它们的值而迷惑释它们。经过对用户输出举行换码,一切的shell元字符都被忽视并动作减少的数据传给步调。底下的perl代码即对非假名数字字符实行这种处置。 $user_input=~s/([^w])/\\\1/g;  此刻,即使用户输出加在某条吩咐之后,每个字符——即使是特出字符——城市由shell传递给finger。  然而请记取,考证用户输出——不断定发送给本人的任何消息——会使本人的代码更易读而且实行起来更安定。最佳不是在仍旧实行了吩咐之后再去周旋黑客,而应在门口就对数据举行一次性的查看。 -------------------------------------------- 处置里面因变量 对于证明型谈话,比方shell和perl,即使用户输出的数据不精确的话,有大概引导步调天生从来没有的缺点。即使用户数据被证明为一局部实行代码,用户输出的任何实质都必需适合谈话的准则,要不就会堕落。 比方,底下的perl代码片断大概会平常处事大概会爆发缺点,这在于于用户输出的是什么: if ($search_text =~ /$user_pattern/) { #match! } 即使$user_pattern是一个精确的表白式,十足城市平常,然而即使$user_pattern不对法;perl就会波折,引导cgi步调波折——这大概是一种不安定的办法。为了制止这种情景,在perl中起码应有eval()操纵符,它计划表白式的值并与实行它无干,归来一个码值表白表白式是灵验的仍旧失效的。底下的代码即是前方代码的矫正版。 if (eval{$search_text =~ /$user_pattern/}) { if ($search_text =~ /$user_pattern/) { #match! } } 悲惨的是,大局部shells(囊括最常用的,/bin/sh)都没有像如许的大略的方法查看缺点,这也是制止它们的另一因为。 -------------------------------------------- 在实行外部步调时,还必应知道传递给那些步调的用户输出是怎样感化步调的。编制程序者不妨养护本人cgi剧本不受黑客侵吞,然而即使草率地将某个黑客输出的实质传递给了外部步调而不领会那些步调是怎样运用那些数据的,也会吃力不讨好。 比方,很多cgi剧本会实行mail步调给或人发送一个包括用户输出消息的e-mail。这大概会特殊伤害,由于mail有很多里面吩咐,任何一个吩咐都有大概被用户输出激活。比方,即使用mail发送用户输出的文本而该文本有一条龙以代牌号(~)发端,mail会将该行的下一字符证明为它能实行的很多吩咐之一。比方,~r/etc/passwd,会引导mail读取呆板的口令文献并发送给接收者(大概恰是黑客本人)。 在如许的例子中,该当运用sendmail(一个更底层的付邮步调,它少了很多mail的个性),而不是运用mail在unix呆板上发送e-mail。 动作普遍准则,在实行外部步调时该当运用尽大概逼近本人诉求的步调,不用有过多不需要的功效。外部步调才干的事越少,它被运用来干勾当的时机就越少。 劝告 底下是运用mail和sendmail的另一个题目:必需保护发送给mail体例的是一个正当的e-mail地方。很多mail体例城市把以"|"发端的e-mail地方动作要实行的吩咐,进而为输出如许一个地方的黑客翻开简单之门,请再一次记取要考证数据。 还好吗本领更好地领会外部步调再不灵验地运用它们的另一个例子是grep。grep是一个大略的吩咐行适用步调,它在文献中探求一个常用表白式,表白式不妨是一个大略的串也不妨是搀杂的字符序列。大局部人会说运用grep不会出什么题目,然而纵然grep大概不会形成什么丢失,它却能被玩弄,底下将证明它是如何被玩弄的,如底下的代码所示。它假设在很多文献中实行对用户输出项的辨别巨细写的探求。 print("the following lines contain your term:<hr><pre>"); $search_term=~s/([^w])/\\\1/g; system("grep $search_term/public/files/*.txt"); print(<"pre>"); 这十足看上去挺好,只有商量到用户大概会输出-i。它不会被探求,而是动作与grep的切换,就像任何故连字符发端的输出一律。这会引导grep大概因等候将探求的串输出规范输出而挂起,大概即使-i后的实质被证明为其余切换字符时爆发缺点。毫无疑义这不是编制程序者从来的企图。在这种情景下它还不太伤害,但在其余情景下却有大概。记取,没有什么无害的吩咐,对每条吩咐部必需从各个观点提防商量。  普遍情景下,该当尽大概熟习本人的cgi剧本实行的每个外部步调。对步调领会得越多,就越能养护它们免受数据妨害--一上面不妨监督数据,另一上面不妨遏止某些选项或个性。外部步调常常是很多cgi步调题目的一种赶快简单的处置方法——它们都过程了尝试,不妨获得,而且精巧百般。但它们也不妨变成黑客侵犯的简单之门。不重要怕运用外部步调——它们常常是实行cgi步调中那种功效的独一方法——然而要领会它们大概带来的妨害。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.