select标签加入multiple属性后的CGI数据提交格式

/ns/cn/zs/data/20030402221226.htm

呵呵,今天写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