|
select标签加入multiple属性后的CGI数据提交格式 (阅览
次)
呵呵,今天写html的时候突然想到一个自己从来没有关心过的问题。看看大家是否留意了。 (老鸟们不要扔鸡蛋啊~~啊,救命~~~) 如下:
一、问题描述 ============
通常我们提交表单时提交给CGI的数据是以name1=value1&name2=value2的格式提交的,这个可 以通过method=get方式从浏览器地址栏上看到,比如 <form action=http://yourside/cgi-bin/check.cgi method=get> <input name=a value=1>数据1<br> <input name=b value=2>数据<br> · · · 提交后浏览器中就可以看到 http://yourside/cgi-bin/check.cgi?a=1&b=2
下拉表单的标签<select>有个属性为multiple,加入后允许下拉表单由单选变成复选,可是select 只可能有一个name的属性,没有value属性,<option>则只有value无name,也就说复选的时候将是一个 name对应多个value的值,那么提交时将会是一种什么样的格式呢?是不是name=value1value2的形式 呢?先留给大家想想 举个例子,是 http://yourside/cgi-bin/check.cgi?name=value1value2 还是 http://yourside/cgi-bin/check.cgi?name=value1&name=value2 试试吧~~~~
二、解决问题 ============
于是弄了2个文件,一个test.html ,一个check.pl 附上: test.html ------------ <form action="/cgi-bin/check.pl" method="get"> 20cn中,谁是你心目中的白马王子?嘿嘿<br> <select name="20cn" multiple> <option value="netdemon" selected>NetDemon</option> <option value="bedlamite" selected>马大哈</option> <option value="ricky">老实和尚</option> <option value="xiean">邪·安</option> <option value="syshunter">SysHu0teR</option> <option value="cimsxiyang">夕阳</option> <option value="nightcolor">夜色猪猪</option> <option value="more">不列举了,测试而已</option> </select> <input type=submit> </form> ----------------------------
check.pl ------------ #!/usr/bin/perl
#获取用户提交数据 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; }
#分割用户提交数据 @pairs = split(/&/, $buffer);
#输出HTML档头 print"Content-type:text/html\n\n";
#对用户提交数据进行解码 foreach $pair (@pairs) { ($name, $value) = split(/=/,$pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/<!--(.|\n)*-->//g; $value =~ s/\t//g; $FORM{$name} = $value;
print"$name\n$FORM{$name}\n<br>\n"; }
#退出程序 exit; ---------------------
运行结果: 浏览器地址栏中显示 /cgi-bin/check.pl?20cn=netdemon&20cn=bedlamite 页面返回: 20cn netdemon 20cn bedlamite
于是明白了,<select>复选时,数据是以name=value1&name=value2的形式提交的
三、为什么关注这个问题 ===================== 为什么会想到去注意这个复选时的数据提交呢,是否有意义?
——在后台cgi处理用户提交数据后要进行处理,比如perl里用split分割 & 和 = ,这样才能把用户 提交的name和value分别提取出来,如果不清楚不同情况下用户数据是通过怎样的格式提交给CGI程序 的,那么我们在编程时可能会出现一些疏漏,错误地处理数据。 如果刚才的假想 ..../cgi-bin/check.cgi?20cn=netdemonbedlamite 是成立的,那么大家想想,还能就像通常一样直接 @pairs=split(/&/,$buffer); 然后 foreach $pair(@pairs) {……} 吗? 答案显然是不行的,这样是很难将2个value的值分开。
########### #一点愚见。# ###########
=============================================== 本文版权属20CN网络安全小组及其作者所有,如有转载,请保持文章完整性并注明出处 文章类型:原创 提交:咖啡╃泡面 核查:NetDemon
返回
|