深入研究表单提交方式:GET/POST

上一篇 / 下一篇  2008-11-17 22:10:00 / 个人分类:perl

  • 文件版本: V1.0
  • 开发商: 本站原创
  • 文件来源: 本地
  • 界面语言: 简体中文
  • 授权方式: 免费
  • 运行平台: Win9X/Win2000/WinXP
大家知道目前表单提交的方式有GET和POST。我在这里不多说什么,给大家看一个以GET方式提交的表单的请求:51Testing软件测试网 H]Ct2?^v]%W

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%oH w2]
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 \P Yb0Connection: Keep-Alive

:j(z*\0n3E3?0

$Y8SfYwm0  这个请求是我们通过这个HTML代码发出的:51Testing软件测试网e UQ2s?a |

51Testing软件测试网tfw:mr4JF ?j Qe 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,eSGM3Hv$s%t

Ca&[;^8S6@)_(T0  我们再看一个以POST方式提交的表单的请求:

idN x6W"?C051Testing软件测试网j7g+TD8b:y

POST /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软件测试网 M6q jM4i9K.F
Accept-Language: zh-cn
.e z$J[V } fc!?J3rA0Content-Type: application/x-www-form-urlencoded51Testing软件测试网tRT"IbH
Accept-Encoding: gzip, deflate
-tut 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!?1Q9J s:l
Connection: Keep-Alive51Testing软件测试网/z4U$W!R c

51Testing软件测试网`*h*?4c W@4U

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`X x3J0<input type=submit value="POST方式">
.h/m7e+ECW~4Z*c_}X0</form>

$f$I e$zMJLU0

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 tDOn L0

2YI ^2s-oYU7e0<form action="http://localhost:8080/cgi-bin/tech/method.cgi?GET=GET" method="POST">51Testing软件测试网6[0_ k W 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>

T+g I#GZA ZU0

!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@,D b
Content-Type: application/x-www-form-urlencoded
QH)L*MMr/]Cm0Accept-Encoding: gzip, deflate
-uu6Ng9q#\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软件测试网 [.n aF~
Connection: Keep-Alive

} l5_];T0

5u}"w~%I0POST=POST51Testing软件测试网5X)| P)Z&Db Z

51Testing软件测试网 k O!d*BW?!r

  哈!原来是以POST发送的。但是,你一定发现了有一部分数据放在了第一行,就是和GET的情况一样的。其实这个例子很典型,是POST和GET混发!
q XX~)X%DmE0  不相信你在Perl中,用read(STDIN,$POST,$ENV{'CONTENT_LENGTH'})和$GET=$ENV{'QUERY_STRING'}看看,到底哪个里面有"GET=GET"这个数据。

,OHE*{#Dd m/J0

*[rImB ~0  我给大家提供设备,大家自己去研究研究:

,duQ"gWcI's0

j S,@ O:c2sz Q{4O0HTML部分:  

7rB6~g8s} O"j&Fyf051Testing软件测试网h+\S a al

<html>
7U9K e#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 BmHC5hCG
</form>
5N e vs\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>

@p,L/b#E&WW"s0

+B)c ~DU^'{w0Perl部分:

$mj$g k2u_tF J051Testing软件测试网4h fN3i2Zq

#!c:\perl\bin\perl.exe

i#A0nJ-A"jr8A051Testing软件测试网%kqz)Jyw6t

$|=1;

a;|W4AN.y~0

c8s4|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";
%{LqTob#R/q0}
X N Wf)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+Uy

for($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+V4j3Kn Sh3T~
 }
wESD'pxX%} Cj!u+I0 $METHOD="GET";
%kJb;L/Qm ]0}

NsH _*dl.P051Testing软件测试网0XS|)j@!CY#A }:t D

51Testing软件测试网i5y?d$]s9cg
$METHOD="POST";

u#NeG#s6f\v051Testing软件测试网 iw.Fd/A6r5n#]o)r

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软件测试网w x8WHYxNnJ-}
 }51Testing软件测试网Au(a4I%Q9Xw {]
 print "<br>\n";51Testing软件测试网:m'N)n}+]?
 $METHOD="GET";51Testing软件测试网Z,Z-{phXgI
}

Y2CHzW-J2Zma+i#^*g0

r4zi7@:N"V)s b0exit;51Testing软件测试网@;sfixhr

51Testing软件测试网3s"Nq.[!|U q&F)Y.B


X-c;Hb8N GOg0####代码结束####51Testing软件测试网b6TTH!L XE;S

51Testing软件测试网u9]O9L-}8_&_ j

51Testing软件测试网k%Nt_lb*O"d.z
  好了,我要说的是,搞这个研究究竟有什么意义呢?
A%G/n!G'} sXY'y'O0  意义是:让你知道,用户提交的数据哪些是用POST方式,哪些使用GET方式的!51Testing软件测试网5}.w%CgRG6J
  其实我上面那段Perl代码已经包括了很多的技术。你通过阅读就可以知道%GET里面放的是用GET方式提交的,%POST同理!51Testing软件测试网.WgONZ`/k

TAG: perl

 

评分:0

我来说两句

Open Toolbar