CGI

Common Gateway Interface(CGI)是一个用来生成网页动态内容或者应用程序的标准方法。CGI在web服务器和web content生成程序之间提供一个接口。这个web content生成程序一般被称为CGI scripts或者简单点叫CGIs,通常由脚本语言写成,但是也能用任何的编程语言编写。

举个粟子,如果你想把一个数据库挂到网上,使得所有人都能查询它。基本上,你需要创建一个CGI程序,这个程序能够传送信息给数据库引擎,能够接收回查询结果。当web服务器执行这个CGI程序,并把从CGI中得到的查询结果写到web页面中传回给客户,也就使得查询完成。这也是为什么CGI叫gateway的原因。

CGI通常用来处理HTML中的<FORM>和<ISINDEX>元素。

Web服务器支持及配置

确保服务器支持CGI及已经配置CGI处理程序。

所有的服务器执行CGI程序都保存在一个预先配置的目录。这个目录被称为CGI目录,通常是cgi-bin。

CGI文件的扩展名为.cgi。

在httpd下可以配置httpd.conf文件如下:

  1.  1 <Directory"/var/www/cgi-bin">
     2    AllowOverrideNone
     3    OptionsExecCGI
     4    Order allow,deny
     5    Allow from all
     6 </Directory>
     7
     8 <Directory"/var/www/cgi-bin">
     9 OptionsAll
    10 </Directory>

两种使用方法

通过表单间接调用:

  1. 1 <formmethod="POST"action="/cgi-bin/login">
    2         姓名:<input type="text"name="T1"size="20"><br>
    3         身份证号码:<inputtype="text"name="T2"size="20"><br>
    4         <inputtype="submit"value="提 交"name="B1">
    5         <inputtype="reset"value="重 写"name="B2"></p>
    6 </form> 

通过链接直接调用:

  1. 1 <body>
    2         <a href="/cgi-bin/displaytime">显示服务器时间</a>
    3 </body> 

CGI环境变量

变量名 描述
CONTENT_TYPE 这个环境变量的值指示所传递来的信息的MIME类型。目前,环境变量CONTENT_TYPE一般都是:application/x-www-form-urlencoded,他表示数据来自于HTML表单。
CONTENT_LENGTH 如果服务器与CGI程序信息的传递方式是POST,这个环境变量即使从标准输入STDIN中可以读到的有效数据的字节数。这个环境变量在读取所输入的数据时必须使用。
HTTP_COOKIE 客户机内的 COOKIE 内容。
HTTP_USER_AGENT 提供包含了版本数或其他专有数据的客户浏览器信息。
PATH_INFO 这个环境变量的值表示紧接在CGI程序名之后的其他路径信息。它常常作为CGI程序的参数出现。
QUERY_STRING 如果服务器与CGI程序信息的传递方式是GET,这个环境变量的值即使所传递的信息。这个信息经跟在CGI程序名的后面,两者中间用一个问号‘?‘分隔。
REMOTE_ADDR 这个环境变量的值是发送请求的客户机的IP地址。这个值总是存在的。而且它是Web客户机需要提供给Web服务器的唯一标识,可以在CGI程序中用它来区分不同的Web客户机。
REMOTE_HOST 这个环境变量的值包含发送CGI请求的客户机的主机名。如果不支持你想查询,则无需定义此环境变量。
REQUEST_METHOD 提供脚本被调用的方法。对于使用 HTTP/1.0 协议的脚本,仅 GET 和 POST 有意义。
SCRIPT_FILENAME CGI脚本的完整路径
SCRIPT_NAME CGI脚本的的名称
SERVER_NAME 这是你的 WEB 服务器的主机名、别名或IP地址。
SERVER_SOFTWARE 这个环境变量的值包含了调用CGI程序的HTTP服务器的名称和版本号。

第一个CGI程序

  1.  1 #!/usr/bin/python
     2
     3 print("Content-type:text/html\r\n\r\n")
     4 print("""<html>
     5 <head>
     6 <title>Hello Word - First CGI Program</title>
     7 </head>
     8 <body>
     9 <h2>Hello Word! This is my first CGI program</h2>
    10 </body>
    11 </html>""")

在httpd中"/cgi-bin/"被等同于 "/var/www/cgi-bin/"。所以在调用的时候path可以直接写/cgi-bin/..

获取表单数据

index.html

  1.  1 <html>
     2 <head>
     3 <title>test</title>
     4 </head>
     5 <body>
     6 <formaction="/cgi-bin/hello_get.py"method="get">
     7 First Name: <inputtype="text"name="first_name">  <br/>
     8
     9 Last Name: <inputtype="text"name="last_name"/>
    10 <inputtype="submit"value="Submit"/>
    11 </form>
    12 </body>
    13 </html>

当用户单击确认按钮时(这里是Submit),表单的内容会传送到另一个文件。表单的action属性定义了目的文件的文件名。由动作属性定义的这个文件通常会对接收到输入数据进行相关处理。

method通常指定的是http使用的method。所以这里是用http get hello_get.py,同时在URL后面加上查询字符串来给hello_get.py传递表单数据(这里分别是first_name及last_name)。

打开index.html如图:

点击Submit,浏览器立即跳转到hello_get.py(get方法),并附加查询字符串?first_name=L&last_name=C,并由hello_get.py来处理fisrt_name和last_name。

hello_get.py

  1.  1 #!/usr/bin/python
     2 #-*- coding:utf-8 -*-
     3
     4 #CGI处理模块
     5 import cgi,cgitb
     6
     7 form = cgi.FieldStorage()
     8
     9 first_name = form.getvalue(‘first_name‘)
    10 last_name = form.getvalue(‘last_name‘)
    11
    12
    13 print(‘Conten-type:text/html\r\n\r\n‘)
    14 print("""<html>
    15 <head>
    16 <title>Hello - Second CGI Program</title>
    17 </head>
    18 <body>
    19 <h2>Hello %s %s</h2>
    20 </body>
    21 </html>"""%(first_name,last_name))

即:http使用get方法向CGIs脚本传递数据,在URL的查询字符串中写入且用符号‘&‘分隔。

如果让http使用post方法,情况会有些不一样。改动index.html(仅改动form的属性method,改成post):

  1.  1 <html>
     2 <head>
     3 <title>test</title>
     4 </head>
     5 <body>
     6 <formaction="/cgi-bin/hello_get.py"method="post">
     7 First Name: <inputtype="text"name="first_name">  <br/>
     8
     9 Last Name: <inputtype="text"name="last_name"/>
    10 <inputtype="submit"value="Submit"/>
    11 </form>
    12 </body>
    13 </html>

数据将以文本行的方式写在http头部后:

即:http使用post方法向CGIs脚本传递数据,在http请求正文中写入。以此,post向CGIs传输数据比get相对安全点。

上传文件

upload_file.html

  1. 1 <html>
    2 <body>
    3    <form enctype="multipart/form-data"
    4                      action="/cgi-bin/save_file.py" method="post">
    5    <p>File:<input type="file" name="filename"/></p>
    6    <p><input type="submit" value="Upload"/></p>
    7    </form>
    8 </body>
    9 </html>

save_file.py

  1.  1 #!/usr/bin/python
     2 #-*- coding=utf-8 -*-
     3
     4 import cgi,os
     5 import cgitb;cgitb.enable()
     6
     7 form = cgi.FieldStorage()
     8
     9 #获取文件名
    10 fileitem = form[‘filename‘]
    11
    12 #检测文件是否上传
    13 if fileitem.filename:
    14     #设置文件路径
    15     fn = os.path.basename(fileitem.filename.replace("\\","/"))
    16     open(‘/tmp/‘+ fn,‘wb‘).write(fileitem.file.read())
    17
    18     message =‘The file "‘+ fn +‘" was uploaded successfully‘
    19
    20 else:
    21     message =‘No file was uploaded‘
    22
    23 print("""24 Content-Type: text/html\r\n\r\n
    25 <html>
    26 <body>
    27   <p>%s</p>
    28 </body>
    29 </html>
    30 """% message)

选择一个文件example.conf.json

文件数据被封装在请求正文。

参考资料

Wikipedia

http://web.archive.org/web/20100127191128/http://hoohoo.ncsa.illinois.edu/cgi/intro.html

http://www.w3cschool.cc/python/python-cgi.html

http://book.51cto.com/art/201108/282090.htm

http://www.w3school.com.cn/html/html_forms.asp

https://docs.python.org/3/library/cgi.html?highlight=cgi#module-cgi

来自为知笔记(Wiz)

时间: 2024-10-04 23:23:47

CGI的相关文章

人菊痔舟乐uqxr8c2113h534n89g

新华社瓦莱塔4月10日电(记者李拯宇 李佳)全国政协主席俞正声10日在前往非洲三国进行正式友好访问途中过境马耳他,在瓦莱塔会见马耳他议长法鲁贾. 俞正声说,中马保持长期友好关系,政治上相互信任,经济上密切合作,人文交流不断深化.中方感谢马方在中国撤侨行动中给予的支持和帮助.中方愿同马方一道,落实两国领导人达成的共识,弘扬中马传统友好,拓展在科技.渔业.旅游等领域互利合作,打造合作新亮点.中国全国政协愿与马耳他议会和社会各界保持密切交往,加强治国理政经验交流,为两国扩大务实合作营造良好环境,共同促

十分钟搞懂什么是CGI

原文:CGI Made Really Easy,在翻译的过程中,我增加了一些我在学习过程中找到的更合适的资料,和自己的一些理解.不能算是严格的翻译文章,应该算是我的看这篇文章的过程的随笔吧. CGI真的很简单 在此之前,你或许听说过很多说CGI'晦涩难懂'的言论.如果你会写最基本的输入输出,那么你就可以写出一个CGI脚本.如果你已经是一个程序员,你只需要几分整就可以明白CGI到底是个什么东西.如果你还不是一个名程序员,对不起这篇文章不是很适合你,你可以先去学习一些编程的知识,例如脚本语言或者sh

nginx设置cgi.fix_pathinfo漏洞和解决方法

最近在学习nginx的配置,有一个设置需要在php.ini中把 cgi.fix_pathinfo = 1 改成cgi.fix_pathinfo=0, 想了解下这个参数设置的具体功能,所以百度了下,发现这里有一个PHP PATH_INFO的漏洞(详见:https://bugs.php.net/bug.php?id=50852&edit=1)大致先了解下. [漏洞分析]location对请求进行选择的时候会使用URI环境变量进行选择,其中传递到后端Fastcgi的关键变量SCRIPT_FILENAM

ubuntu 安装bugzilla---index.cgi show text

安装完 bugzilla 之后 访问 url/bugzilla 之后没有出现登录界面,而是出现了index.cgi代码. 解决办法: You can see if the directory /etc/apache2/mods-enabled/ has a symlink cgi.load. If there is no such symlink, you can create it by running sudo a2enmod cgi and then restart Apache: sud

Home Web Server 1.9.1 build 164 - CGI Remote Code Execution复现

一.  Home Web Server 1.9.1 build 164 - CGI Remote Code Execution复现 漏洞描述: Home Web Server允许调用CGI程序来通过POST请求访问位于/cgi-bin下的文件,然后通过目录遍历,就有可能执行远程主机的任意可执行程序. 漏洞影响范围: Home Web Server 1.9.1 build 164 漏洞复现: 利用原理: NC连接发送打开计算器请求,安装Home Web Server 1.9.1 build 164

CGI概念

CGI(通用网关接口,Common Gateway Interface) CGI是Web服务器与请求处理程序之间传输数据的一种标准,保证Web服务器传递过来的数据是标准格式的,其程序须运行在网络服务器上.CGI可以用任何一种语言编写,只要这种语言具有标准输入.输出和环境变量.工作原理:每当客户请求CGI的时候,WEB服务器就请求操作系统生成一个新的CGI解释器进程(如:PHP-CGI),当CGI满足要求后,WEB服务器就杀死这个进程.Web服务器(如:Nginx)只是内容的分发者,如果请求/in

cgi程序读取post发送的特殊字符,尤其适合于微信公众平台开发中发送被动消息

[问题]用c编写cgi程序怎样取出html表单post来的数据? [分析]html表单post来的数据形如username="zhang"&&password="123456"&&useid="012" [方法1]lainco #include <stdio.h> #include <stdlib.h> #include <string.h> char *getcgidata(F

ubuntu下apache2 安装 配置 卸载 CGI设置 SSL设置

一.安装.卸载apache2 apache2可直接用命令安装 sudo apt-get install apache2 卸载比较麻烦,必须卸干净,否则会影响apache2再安装 (1) sudo apt-get --purge remove apache2 sudo apt-get --purge remove apache2.2-common sudo apt-get autoremove (2) (关键一步)找到没有删除掉的配置文件,一并删除 sudo find  /etc -name "*

CGI,FastCGI,PHP-CGI,PHP-FPM,Spawn-FCGI

CGI CGI, Common Gateway Interface, is a tool for HTTP server to contact with programs on other servers, which can be used into any languages with standard input, standard output and environmental variables, such as PHP, Perl, or Tcl. FastCGI FastCGI 

学习python cgi的一点心得体会

这两天学了python cgi编程,挺好玩的 跟大家分享一下: 目标: 创建一个cgi脚本 接收来访者的参数 步骤: 创建一个cgi服务的根目录(随便创建,然后在终端或者cmd下切换到该目录下) python2.x的httpserver启动:python -m CGIHTTPServer 13333   会启动http server 在13333端口上 python3.x的httpserver启动:python -m http.server --cgi 13333 这个--cgi不可以拿掉 否则