大雀软件园

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

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

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

2.4 中断不对诉求的表单数据 cgi剧本不妨有几种办法中断接受提交给它的非预期的输出。编写cgi时该当运用个中少许本领或一切那些本领。 开始,cgi 剧本应树立接受多少量据的控制,不只控制所有提交,也控制提交中的每个name/value对。比方,cgi剧本读取post method,查看content-length情况变量的巨细来决定某输出是否有理的预期输出。即使cgi 剧本安排接受的独一数据是或人的全名,那么即使content-length大于100字节,就该当有来由归来一个缺点。没有哪个有理的姓有那么长,经过树立控制,就能使剧本不复盲目地读取发送给它的实质。 提防 令人欣喜的是,不用担忧去控制经过post本领提交的数据。get是自控制的而且不会向剧本发送多于1kb的数据。效劳器机动控制放人query-string情况变量中的数据的巨细,而这恰是get发送给cgi步调的消息。 固然,"黑客"们不妨很简单地将表单由get改为put进而绕过这种内置的控制。起码,步调该当查看一下数据能否是用预期的本领提交的;最佳是能精确且安定地处置两种本领。 下一步,应保护剧本领会在接受到不许辨别的数据时该如何办,比方,即使某表单诉求用户采用两个单选按钮之一,剧本就不该当假如由于一个按钮未被采用,另一个就确定被采用了。底下的perl代码就犯了如许的缺点: if ($form_data{"radio_choice"} eq "button_one"){ # button one has been clicked } else { # button two has been clicked } 这段代码假设由于表单仅供给了两个选项,而第一项未被选中,那么第二项就确定被选中了。这不确定是真的。纵然前方的例子没有什么坏处,但在某些情景下如许的假如大概很伤害。 cgi剧本该当能预期这种景象而相映地举行处置。比方,即使展示少许非预期的或"不大概"的景象,不妨打字与印刷一个缺点,如次所述: if ($form_data{"radio_choice"} eq "button_one") { #button one seleted } elsif ($form_data{"radio_choice} eq "button_two") { #button two selected } else { #error } 经过介入第二个if语句--显式查看"radio_choice"本质上是"button_two"--如许剧本更安定了;它不复做假如了。 固然,缺点不确定是憧憬剧本在那些景象下天生的。有些剧本过于提防,考证每个字段,纵然是最微弱的非预期数据都天生缺点消息,如许常常很扫用户的兴。让cgi 剧本辨别非预期数据而后扔掉它,而且机动采用一个缺省值也不妨。 另一上面,剧本还可扶助用户矫正缺点而不是大略地发一条缺点动静或树立一个缺省值。即使表单诉求用户输出神秘笔墨,剧本应能在举行比拟之前机动跳过输出中的空缺字符。底下即是一个实行此功效的perl步调片断。 $user_input =~ s/\s//; #remove white space by replacing it with an empty string if ($user_input eq $secret_word) { #match! } 结果,不妨更进一,让cgi脚天性处置尽大概多的各别的输出表单。纵然不大概预期到大概发送给cgi步调的一切实质,但对某个一定上面普遍常常有几种常用的办法,所以不妨逐一查看。 比方,只是由于所写的表单运用post本领向cgi剧本提交数据,并不表示招数据必需按那种本领进入。该当查看requeet_method情况变量来决定是运用了get仍旧post本领并相映地读取数据,而不是假定命据都是来自预期的规范输出(stdin)。一个真实编写胜利的cgi脚天性接受不管运用什么本领提交的数据并在处置进程中很安定。以次步调清单即是用perl编写的一个例子。 步调清单 cgi_read.pl 一个充溢生机的读取方法输出的步调 #takes the maximum length allowed as a parameter #returns 1 and the raw form data,or "0" and the error text sub cgi_read { local($input_max)=1024 unless $input_max=$_[0]; local($input_method)=$env{'reouest_methoo'); #check for each possible request_methods if ($input_method eq "get") { #"get" local($input_size)=length($env{'query_string'}); #check the size of the input if($input_size>$input_max) { return(0,"input too big"); } #read the input from query_string return(1,$env{'query_tring'}); } elsif ($input_method eq "post") { #"post" local($input_size)=$env{'content_length'}; local($input_data); #check the size of the input if ($input_size>$input_max) { return(0,"input too big"); } #read the input from stdin unless (read(stdin,$input_data,$input_size)) { return(0,"could not read stdin"); } return(1,$input_data); } #unrecognized method return (0,"method not get post"); }  总之,剧本该当不对接受的表单数据举行假如,应尽大概估计预见除外的景象并精确地处置不精确的或缺点的输出数据。在运用数据之前应按尽大概多的办法尝试它;中断不对理的输出并打字与印刷一条缺点动静;即使某项堕落或漏了应机动采用一个缺省值;以至不妨试图对输出举行源代码以变成步调的有理的输出。采用哪种办法依附于本人想耗费几何功夫和精神,然而记取长久也不要盲目接受传给cgi脚来的一切消息。

热门阅览

最新排行

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