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。在队列里,值和表单用一个&符号分开,特殊的符号转换成十六进制的代码。
下面看一个提交表单的示例:
CGI以POST提交的代码如下:
编译通过后,网页往后台提交的内容如下:
上面的CGI程序利用sscanf处理此字符串,获取到了相应的信息。
另一种方式是get提交,需要修改html代码中:
修改为:
其cgi源代码如下:
以get形式提交后可以看到浏览器端的url如下:
很明显这种方式提交数据是很不安全的。
另外,要说明一点,Nginx不支持cgi,而且不支持静态提交,如果要支持需要修改网站配置项,在nginx.conf,在根目录定义的地方添加下面这句话即可解决405的错误。
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]
相关文章推荐
- get post 表单提交 NameValueCollection 兼容两种提交方式
- 一 丶get和post是html中表单的提交方式中的两种方式,其主要区别在于:
- JavaWeb学习总结(十五)Jsp中提交的表单的get和post的两种方式
- 表单form的提交有两种方式,一种是get的方法,一种是post 的方法
- 表单的两种提交方式get和post的区别
- 表单的两种提交方式:get与post的区别
- PHP表单中的Get与Post两种提交的方式的区别
- 关于表单提交的两种方式,post和get
- JSP——表单的两种提交方式get和post的区别
- 表单的提交方式POST和GET
- [网络收集]form表单提交方式post和get,Request.QueryString,Request.Form
- 表单提交中Get和Post方式的区别 .
- 表单的提交方式POST和GET有什么区别
- Android 使用三种方式获取网页(通过Post,Get进行表单的提交)
- 表单提交中Get和Post传输方式的区别
- 终结了form表单的get和post提交方式的中文乱码现象!
- 表单提交中get和post方式的区别
- 深入研究表单提交方式:GET/POST
- 表单提交中Get和Post 方式的区别
- 表单提交中Get和Post方式的区别