大雀软件园

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

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

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

2.7 处置文献名 文献名是提交给cgi剧本的大略数据,但即使不提防的话,却能引导很多烦恼。即使用户输出的名字中包括路途成分,如目次斜杠和双点,纵然憧憬的是输出一个大略的文献名--比方file.txt--但截止却大概是/file.txt或../../../file.txt。按照web效劳器的安置以及对提交的文献名做什么操纵,体例中的一切文献就有大概都表露给了一个聪慧的黑客。 进一步,即使用户输出了一个已有文献的名字大概一个对体例的运转很要害的文献名,如何办?对即使输出的名字是/etc/passwd或c:\winnt\system32\krnl32.dll如何办?按照在cgi剧本中对那些文献举行什么操纵,它们有大概被发送给用户大概被废物掩盖了。在windows 95和windows nt下,即使不查看反斜杠字符(\),大概会承诺web 欣赏器经过unc文献名考察以至不在该web呆板上的文献。 即使用户在文献名中输出了不对法的字符如何办?在unix下,任何故句点(.)发端的文献名都是不看来的。在windows下斜杠(/)和反斜杠(\)都是目次分割符。很大概不提防写了一个perl步调,当文献名以管(pipe)(|)发端时,纵然本人觉得只是是翻开了一个文献,本质上却是实行了一个外部步调。即使用户领会如何办的话,以至不妨把遏制字符(比方escape键或return键)动作文献名的一局部送给剧本。 更坏的情景是,在shell剧本中,分号用来中断一条吩咐并发端另一条吩咐。即使剧本安排手段是cat用户输出的文献,用户大概输出file.txt;rm-rf/动作文献名,引导归来fi1e.txt,而后废除所有硬盘而不经任何确认。 2.8 输出有理,输入却不对理 为了制止一切那些题目,封闭由它们翻开的一切安定裂缝,查看用户输出的每个文献名。必需保证输出恰是步调预期的输出。 如许做的最佳方法是将输出的文献名的每个字符与可接受字符的清单举行比拟,即使不配合就归来一个缺点。这比保护一个一切正当字符的清单并比拟它们要安定得多——要想让什么字符溜掉太简单了。 以次步调清单是用perl怎样实行这种比拟的例子。它承诺任何字符假名(小写或小写调)、任何数字、下划线和句点。它还举行查看以保证文献名不以句点发端。如许,该段代码就不承诺不妨变换目次的斜杠,不承诺不妨将多条吩咐放在一条龙的分号,大概妨害perl的open()挪用的pipes了。 步调清单 保护一切字符都是正当的 if (($file_name =~ /[^a-za-z_\.]/) || ($file_name =~ /^\./)) { #file name contains an illegal characgter or starts with a period } 劝告 纵然上述步调清单中的代码废除了大局部不对法的文献名,但操纵系大概再有少许控制,而该代码没有掩盖到。比方,文献名不妨用数字发端吗?大概以次划线发端?即使文献中包括多个句点大概句点后多于三个字符如何办?所有文献名充满短得能满意文献体例的控制吗? 必需连接向本人提出这种题目。在写cgi剧本时最伤害的事是觉得用户会按照训令。本来用户是不会的。保护用户不犯缺点是编制程序者本人的事。 2.9 处置html 其余一种看上去无害的但却能引导很大烦恼的输出是在乞求用户输出文本消息时获得的html。以次的步调清单是一个perl步调片断;它向任安在$user_name变量中输出了一个名字的人,比方john smith,发出安慰消息。 步调清单 发出定制的安慰剧本 print ("<html><title>greetings!<title><body>\n"); print ("hello,$user_name! it's good to see you!\n"); print ("</body><htl>\n"); 想像一下,即使用户不是只是输出一个名字,而是输出了<hr><h1><p align="center">john smith</p><h1><hr>或想像一下当剧本蓄意获得用户名时,黑客输出了<img src="http://edu.chinaz.com/secret/cutekid.gif">,截止是公然了本该窃密的消息。承诺输出html大概很伤害。 比输出大略的html窜改页面或考察画面更伤害的是歹意的黑客大概输出一条效劳器端的include训令。即使web效劳器树立为按照效劳器端include,用户就不妨输出 <!--#include file="/secret/project/p1an.txt"--> 而不是他的名字,再不看到神秘安置的十足文本,大概用户不妨输出<!--#inc1ude fi1e-"/etc/passwd"-->来获得呆板的口令文献。大概最坏的情景是黑客大概输出<!--#exec cmd="rm-rf/"-->而不是他的名字。如许上述步调清单中的代码会删掉硬盘上简直一切实质。 劝告 因为常常被歹意地运用,效劳器端的include常常被遏止运用以养护站点免受侵吞。此刻假设那些都没题目。纵然封闭了效劳器端的include而且不留心用户能看到本人硬盘上的任何图片大概变换页面表露的表面,也仍旧有题目--不只是对准编制程序者的,并且对准其余用户。 cgi剧本的一个常常用处是留人名册(guestbook):考察站点的主顾大概签个名,让旁人领会她们仍旧在那儿了。普遍情景下用户大略地输出他的名字,该名字会在考察者清单中展示。然而,即使将the last signee!<form><select>动作用户名输出如何办?<select>标志将引导web欣赏器忽视坐落<select>和一个不生存的</select>之间的一切实质,囊括此后清单中介入的任何名字。纵然有10部分签了名,仅有前3个会表露出来,由于第三个名字包括一个<form>和一个<select>标志。由于第三个出面者在他的名字中运用了html标志,他反面的任何名字都不会表露出来。 对于用户输出html而不是普遍的文本的情景有两种处置方法: 1)赶快但比拟精细的方法是不承诺小于号(<)保卫世界和平大会于号(>),由于一切html标志必需包括在这两个字符中,以是废除它们(大概即使碰到它们就归来一个缺点)是一种提防html被提交并归来的大略的方法。底下一条龙perl代码大略地废除了这两个字符:$user_input=~s/<>//g; 2)更精致一点的方法是将这两个字符变换成它们的html换码--—种特出的代码,用来表白每个字符而不运用该字符自己。底下的代码经过十足用<替代了小于标记,用>替代了大于标记,进而实行了变换: $user_input=~s/</&1t;/g; $user_input=~s/>/>/g;

热门阅览

最新排行

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