您的位置:首页 > 其它

CGI提交表单的两种方式POST与GET

2014-12-17 10:25 429 查看
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查 ,改 ,增 ,删 4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息(这是GET和POST的本质区别,也是协议设计者的本意,其它区别都是具体表现形式的差异)。

Get 方法通过 URL 请求来传递用户的数据,将表单内各字段名称与其内容,以成对的字符串连接,置于action 属性所指程序的url 后,如[url]http://www.direwolf.com/test.asp?name=asd&password=sad,数据都会 直接显示在url 上,就像用户点击一个链接一样;Post 方法通过 HTTP post 机制,将表单内各字段名称与其内容放置在 HTML 表头(header)内一起传送给服务器端交由action属性能所指的程序处理。Get
方式传输的数据量非常小,一般限制在2 KB 左右,但是执行效率却比Post 方法好;而 Post 方式传递的数据量相对较大,它是等待服务器来读取数据,不过也有字节限制,这是为了避免对服务器用大量数据进行恶意攻击,根据微软方面的说法,微软对用post可接收的最大数据有限制,IIS 4 中为 80 KB 字节,IIS 5 中为 100 KB 字节。Get 方式提交数据,会带来安全问题,比如一个登陆页面,通过 Get 方式提交数据时,用户名和密码将出现在 URL 上,如果页面可以被缓存或者其他人可以访问客户这台机器,就可以从历史记录获得该用户的帐号和密码,所以表单提交建议使用
Post 方法;Post 方法提交的表单页面常见的问题是,该页面如果刷新的时候,会弹出一个对话框。

GET方式传输,所带参数附加在CGI程式的URL后直接传给server,并可从server端的QUERY_STRING这个环境变量中读取;以POST方式传输,则参数会被打包在数据报中传送给server,并可从CONTENT_LENGTH这个环境变量中读取出参数长度,数据被送到www服务器的stdout中,然后cgi从stdin中读取。GET是从服务器上请求数据,POST是发送数据到服务器。事实上,GET方法是把数据参数队列(query
string)加到一个URL上,值和表单是一一对应的。比如说,name=John。在队列里,值和表单用一个&符号分开,特殊的符号转换成十六进制的代码

下面看一个提交表单的示例:

<html>
<head>
<title>ADCU</title>
</head>
<body>
<tr><td>
<div style="font-weight:bold;font-size:15px" mce_style="font-weight:bold;font-size:15px">This page is used to set some parameters for ADCU</div>
<div> please input your information:<div>
<!--form method="GET" action="./cgi-bin/get.cgi"-->
<form method="POST" action="./cgi-bin/post.cgi">
servername:<br>
<input type="text" size=30 maxlength=100 name=username>
<br>serverpassword:<br>
<input type="text" size=30 maxlength=100 name=password>
<br>serveripaddress:<br>
<input type="text" size=30 maxlength=100 name=serverip>
<br>timeval:<br>
<input type="text" size=30 maxlength=100 name=timeval>
<br>set all parameters....<br>
<input type="submit" value="Set_parameters">
<input type="reset" value="reset_parameters">
</form>
</td></tr>
<td><tr><input type="button" value="Back Home" onclick='javascript:window.location="./index.html"'></td></tr>
</table>
</body>
</html>

CGI以POST提交的代码如下:

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int len;
FILE *fp1,*fp2,*fp3,*fp4;
char *poststr,inputdata[512];
char servername[10]={0},serverpasswd[10]={0},serverip[30]={0},timeval[10]={0};

printf("Content-Type:text/html\n\n");
printf("<HTML>\n");
printf("<BODY>\n");
poststr=getenv("CONTENT_LENGTH");
if(poststr==NULL)
printf("<DIV STYLE=\"/\"mce_STYLE=\"/\"\"COLOR:RED/\">ERROR Input,no Data!</DIV>\n");
else
{
printf("<DIV STYLE=\"/\"mce_STYLE=\"/\"\"COLOR:RED/\"> Input Data OK!</DIV>\n");
len=atoi(poststr);
fgets(inputdata,len+2,stdin);
sscanf(inputdata,"username=%[^&]&password=%[^&]&serverip=%[^&]&timeval=%[^&]",servername,serverpasswd,serverip,timeval);
}
printf("</div>\n");
printf("</BODY>\n");
printf("</HTML>\n");
fflush(stdout);
return 0;
}

编译通过后,网页往后台提交的内容如下:

username=direwolf&password=123456&serverip=102.32.123.189&timeval=30

上面的CGI程序利用sscanf处理此字符串,获取到了相应的信息。

另一种方式是get提交,需要修改html代码中:

<form method="POST" action="./cgi-bin/post.cgi">

修改为:

<form method="GET" action="./cgi-bin/get.cgi">

其cgi源代码如下:

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int len;
FILE *fp;
char *getstr;
char servername[10],serverpasswd[10],serverip[10],timeval[10];
fp=fopen("test.txt","wb+");
printf("Content-Type:text/html\n\n");
printf("<HTML>\n");
printf("<BODY>\n");
printf("<div style=\"/\"mce_style=\"/\"\"font-size:12px/\">\n");
getstr=getenv("QUERY_STRING");
if(getstr==NULL)
printf("<DIV STYLE=\"/\"mce_STYLE=\"/\"\"COLOR:RED/\">ERROR Input,no Data!</DIV>\n");
else
fprintf(fp,"get data:%s\n",getstr);
printf("<HR COLOR=\"blue\" align=\"left\" width=\"100\">");
printf("input type=\"button\" value=\"Back CGI\" onclick=\"javascript:window.location='../index.html'\">");
printf("</div>\n");
printf("</BODY>\n");
printf("</HTML>\n");
fclose(fp);
fflush(stdout);
return 0;
}

以get形式提交后可以看到浏览器端的url如下:

www.direwolf.com/cgi-bin/get.cgi?username=direwolf&password=123456&serverip=102.32.123.454&timeval=30

很明显这种方式提交数据是很不安全的。

另外,要说明一点,Nginx不支持cgi,而且不支持静态提交,如果要支持需要修改网站配置项,在nginx.conf,在根目录定义的地方添加下面这句话即可解决405的错误。

error_page 405 =200 http://$host$request_uri[/code] 
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: