深入研究表单提交方式:GET/POST
上一篇 / 下一篇 2008-11-17 22:10:00 / 个人分类:perl
- 文件版本: V1.0
- 开发商: 本站原创
- 文件来源: 本地
- 界面语言: 简体中文
- 授权方式: 免费
- 运行平台: Win9X/Win2000/WinXP
GET /cgi-bin/tech/method.cgi?GET=GET HTTP/1.1
+C#l$eB5Oa0Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
w Q2F
Q4i W,O/Q0Referer:http://localhost//other.html51Testing软件测试网kTkw-NHe!F%oHw2]
Accept-Language: zh-cn
D%I*P#cfV+A&ThF#[p6~0Accept-Encoding: gzip, deflate
oZ^ Y
]0User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
MW{t8O/Y^}Ut,B0Host: localhost:8080
p/k&T \PYb0Connection: Keep-Alive
$Y8SfYwm0 这个请求是我们通过这个HTML代码发出的:51Testing软件测试网e UQ2s?a |
51Testing软件测试网tfw:mr4JF?jQe e<form action="http://localhost:8080/cgi-bin/tech/method.cgi" method="GET">51Testing软件测试网&G Q^Bk)W
nw8z{
<input type="text" size="10" value="GET" name="GET">51Testing软件测试网;d {eyU oW-t
<input type=submit value="GET方式">51Testing软件测试网2cw4N'J/fAxW
</form>51Testing软件测试网@2S(N!ge+?.S9||
%e-rg0i'Y;hb2J0 这个请求已经超出了我们研究的范围,我们只研究其中的第一行。其中,第一个"GET"说出了提交的方式,是以GET方式提交的;中间的就是提交给服务器上哪个程序,前面一部分"/cgi-bin/tech/method.cgi"就是我们HTML的form中action的内容,而后面的"GET=GET"就是HTML的form中,input的内容:我们发现IE已经把这个表单的内容转换成特定格式了。在Perl中,通过$GET=$ENV{'QUERY_STRING'}获得以GET发送的数据。51Testing软件测试网Z3t,eSGM3H v$s%t
Ca&[;^8S6@)_(T0 我们再看一个以POST方式提交的表单的请求:
idN x6W"?C051Testing软件测试网j7g+TD8b:yPOST /cgi-bin/tech/method.cgi HTTP/1.1
:xr9KME0Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-
+~I"P5c9c h{0R*c0powerpoint, application/vnd.ms-excel, application/msword, */*51Testing软件测试网 XV GL"]vv
Referer:http://localhost//other.html51Testing软件测试网M6qjM4i9K.F
Accept-Language: zh-cn
.e
z$J[V} fc!?J3rA0Content-Type: application/x-www-form-urlencoded51Testing软件测试网tR T"IbH
Accept-Encoding: gzip, deflate
-tu t v,F~0User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
?ee+`b!}$H0Host: localhost:808051Testing软件测试网C,mU.R3i;du[z$yC9l0C
Content-Length: 951Testing软件测试网uW)Dr!?1Q9Js:l
Connection: Keep-Alive51Testing软件测试网/z4U$W!R
c
POST=POST51Testing软件测试网0f'o+Enq+@} H
51Testing软件测试网y/MDk+E)u*H!o,x同样给出HTML:
]e2k BK6O%_ i051Testing软件测试网0V5h!Z u{e<form action="http://localhost:8080/cgi-bin/tech/method.cgi" method="POST">
h`0Q"t+D\0<input type="text" size="10" value="POST" name="POST">
/Eq"f"LYR`Xx3J0<input type=submit value="POST方式">
.h/m7e+ECW~4Z*c_}X0</form>
V4` B }6~u-e{6XL5O"}~0 我们发现其中的数据跑到了最下面。在Perl中,通过read(STDIN,$POST,$ENV{'CONTENT_LENGTH'})获得以POST发送的数据。我记得GET发送数据最多只能1024字节,而POST好像很大很大!
5Y{1{3gM[@VJ051Testing软件测试网3e*~{ lI思考:如果我有这么一段HTML代码,它将会出现什么问题呢?
S2FAa9g tDOnL02YI^2s-oYU7e0<form action="http://localhost:8080/cgi-bin/tech/method.cgi?GET=GET" method="POST">51Testing软件测试网6[0_kW d)m_]
<input type="text" size="10" value="POST" name="POST">51Testing软件测试网.SKT'ebF K&RT-^+~
<input type=submit value="GET/POST方式">
"v
\"@d3B\i[0S
q"cX0</form>
!x%y8] GaCC0 这个代码在很多程序上可能用到过,但是大多数人不会好好的想一想,究竟哪些内容是以GET发送的,哪些内容是以POST发送的。我们看看它的请求是什么:51Testing软件测试网lL%D.I7Q1b
%\y
f.E$@ Gbe @S0POST /cgi-bin/tech/method.cgi?GET=GET HTTP/1.1
\1l4A(v^*^)z2f'x0Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-51Testing软件测试网s`#m8q#i&qI.g+~
powerpoint, application/vnd.ms-excel, application/msword, */*
e0xK1AfK'PY0Referer:http://localhost//other.html
Mo#HV$~5m0Accept-Language: zh-cn51Testing软件测试网D%Q [Z@,Db
Content-Type: application/x-www-form-urlencoded
QH)L*M Mr/]Cm0Accept-Encoding: gzip, deflate
-uu6N g9q#\ij#D0User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)51Testing软件测试网+u:JH)[/i e
Host: localhost:808051Testing软件测试网J;JA"n;WC2I
Content-Length: 951Testing软件测试网[.naF~
Connection: Keep-Alive
5u}"w~%I0POST=POST51Testing软件测试网5X)| P)Z&Db Z
51Testing软件测试网 k O!d*BW?!r 哈!原来是以POST发送的。但是,你一定发现了有一部分数据放在了第一行,就是和GET的情况一样的。其实这个例子很典型,是POST和GET混发!
qXX~)X%DmE0 不相信你在Perl中,用read(STDIN,$POST,$ENV{'CONTENT_LENGTH'})和$GET=$ENV{'QUERY_STRING'}看看,到底哪个里面有"GET=GET"这个数据。
*[r ImB ~0 我给大家提供设备,大家自己去研究研究:
,duQ"gWcI's0j S,@ O:c2sz Q{4O0HTML部分:
7rB6~g8s}O"j&Fyf051Testing软件测试网h+\S a al<html>
7U9Ke#oW9F0<head>51Testing软件测试网7M.e%nx(KY*k
<title>Get-Post</title>
(q/NX*t+\1coK5F0</head>51Testing软件测试网7qqEj]z4q9w
:pv7J`)](Gr BY0<body>51Testing软件测试网6kInHi
_JKy
<form action="/cgi-bin/tech/method.cgi" method="GET">51Testing软件测试网i)g7g+h
C
<input type="text" size="10" value="GET" name="GET">51Testing软件测试网l:uRr3ZQ d ME
<input type=submit value="GET方式">
x;?9r
c2s
|!C0</form>
Ebj1CDN"QE0<form action="/cgi-bin/tech/method.cgi" method="POST">
%?%wUW'IW};`2W0<input type="text" size="10" value="POST" name="POST">
$h/o
qx+Om~0<input type=submit value="POST方式">51Testing软件测试网P/Ex1g AI!W$W*U
</form>51Testing软件测试网v&] ]n@$oc.iGq
<form action="/cgi-bin/tech/method.cgi?GET=GET" method="POST">51Testing软件测试网 iu9APj4goR
<input type="text" size="10" value="POST" name="POST">51Testing软件测试网"`?0`zyiB |)b
<input type=submit value="GET/POST方式">51Testing软件测试网*d5b @~N
Bm HC5hCG
</form>
5Nevs\nAJA
]C0<formaction="/cgi-bin/tech/method.cgi?name=Hackfan&age=16&email=hackfan@163.net" method="POST">51Testing软件测试网9Z~
B$Q e @
<input type="text" size="10" value="Suzhou" name="address">51Testing软件测试网1B5?0Q(b`(Q{
<input type="text" size="10" value="msger.net" name="homepage">51Testing软件测试网1p3?"V[X,?g
<input type="text" size="10" value="106814" name="qq">51Testing软件测试网1Jf/slZ1x4]O&C
<input type=submit value="复杂GET/POST方式">51Testing软件测试网9p b#TNS
</form>
B7A @*Y^NoQ!nV0w0</body>51Testing软件测试网!A"i&f4P6G`#F5s8n.Q
</html>
+B)c ~DU^'{w0Perl部分:
$mj$g k2u_tF J051Testing软件测试网4hfN3i2Zq#!c:\perl\bin\perl.exe
i#A0nJ-A"jr8A051Testing软件测试网%kqz)Jyw6t$|=1;
a;|W4AN.y~0c8s4|B3V0print "Content-type:text/html\n\n";51Testing软件测试网7yfX`C9P!x$A#\
i6z2[d6iy!I0print "发送方式:$ENV{'REQUEST_METHOD'}<br>\n";51Testing软件测试网+t*|Kuv"pZ
if(read(STDIN,$POST,$ENV{'CONTENT_LENGTH'})){51Testing软件测试网^/B/q;}o,?*u
print "POST得到的数据:$POST<br>\n";
%{LqT ob#R/q0}
XNW f)f#S0if($GET=$ENV{'QUERY_STRING'}){51Testing软件测试网N%a#w%Y{EKC
print "GET得到的数据:$GET<br>\n";51Testing软件测试网1h})C\^vCu
}51Testing软件测试网*L[3x[$~1a:M
Y5u)u{5lU{0$METHOD="POST";51Testing软件测试网G(jWp U
51Testing软件测试网 ~/P.Q~#C\4c+Uyfor($i=0;$i<=1;$i++){51Testing软件测试网I"\ixK},w
foreach(split(/&/,$$METHOD)){51Testing软件测试网8^q3a@%sv
$_=~s/\+//g;51Testing软件测试网s3m.Z3ty @'~$n[
($name,$value)=split(/=/,$_);51Testing软件测试网
H*[4R E/l)jr
P
$name=~s/%([a-fA-f0-9][a-fA-f0-9])/pack("C",hex($1))/eg;
{j9aar0 $value=~s/%([a-fA-f0-9][a-fA-f0-9])/pack("C",hex($1))/eg;
z4F'@ [ ez0 $$METHOD{$name}=$value;51Testing软件测试网:G+V4j3KnSh3T~
}
wESD'pxX%}
Cj!u+I0 $METHOD="GET";
%kJb;L/Qm]0}
51Testing软件测试网i5y?d$]s9c g
$METHOD="POST";
for($i=0;$i<=1;$i++){51Testing软件测试网1X~1W"J,E2}
print "Hash形式的$METHOD数据遍历:<br>\n";51Testing软件测试网'U9d/~T(R hb
foreach(keys %{$METHOD}){
O5y+D3]/p TZ%w&x0 print "\$".$METHOD."{".$_."}=$$METHOD{$_}<br>\n";51Testing软件测试网wx8W HY xN nJ-}
}51Testing软件测试网Au(a4I%Q9Xw {]
print "<br>\n";51Testing软件测试网:m'N)n}+]?
$METHOD="GET";51Testing软件测试网Z,Z-{phXgI
}
r4zi7@:N"V)sb0exit;51Testing软件测试网@;sfixhr
51Testing软件测试网3s"Nq.[!|U q&F)Y.B
X-c;H b8N
GOg0####代码结束####51Testing软件测试网b6TTH!L XE;S
51Testing软件测试网k%Nt_lb*O"d.z
好了,我要说的是,搞这个研究究竟有什么意义呢?