Linux之CGI编程小结

2023-11-14

一、CGI标准输入、环境变量、标准输出

1、标准输入
  CGI程序的标准输入是与Web服务器的标准输出对应的,看起来就像其他可执行程序一样通过标准输入(stdin)得到输入信息,实则这些数据是由浏览器传递给服务器后再由服务器定向到CGI的输入中的,如Form表单中的数据,这就是所谓的Web浏览器通过Web服务器与CGI后台可执行程序进行信息交互的方法。这也意味着在操作系统命令行状态可执行CGI程序,对CGI程序进行调试。对于CGI来说数据传输方法分为POST和GET方法。

2、环境变量

操作系统提供了许多环境变量,它们定义了程序的执行环境,应用程序可以存取它们。Web服务器和CGI接口又另外设置了自己的一些环境变量,用来向CGI程序传递一些重要的参数。CGI的GET方法就是通过环境变量QUERY-STRING向CGI程序传递Form中的数据的。

下面是CGI程序设计中用得比较频繁的一些环境变量:
  HTTP-REFERER:调用该CGI程序的网页的URL。
  REMOTE-HOST:调用该CGI程序的Web浏览器的机器名和域名。
  REQUEST-METHOD:指的是当Web服务器传递数据给CGI程序时所采用的方法,分为GETPOST两种方法。GET方法仅通过环境变量 (如QUERY-STRING)传递数据给CGI程序,而POST方法通过环境变量和标准输入传递数据给CGI程序,因此POST方法可较方便地传递较多的数据给CGI程序。

SCRIPT-NAME:该CGI程序的名称。

QUERY-STRING:当使用GET方法时,Form中的数据最后放在QUERY-STRING中,传递给CGI程序。

CONTENT-TYPE:传递给CGI程序的数据的MIME类型(必不可少的头信息),通常为″application/x-www-form-urlencodede″,它是从HTML Form中以POST方法传递数据给CGI程序的数据编码类型,称为URL编码类型。
  CONTENT-LENGTH:传递给CGI程序的数据字符个数(字节)。Web服务器在调用使用POST方法的CGI程序时设置此环境变量,它的文本值表示Web 服务器传送给CGI程序的输入中的字符数目,因此我们使用函数atoi() 将此环境变量的值转换成整数,并赋给变量n。请注意Web服务器并不以文件结束符来终止它的输出,所以如果不检查譔环境变量,CGI程序就无法知道什么时候输入结束。

  在C语言程序中,要访向环境变量,可使用getenv()库函数。

例如:
         if (getenv (″CONTENT-LENGTH″))
              n=atoi(getenv (″CONTENT-LENGTH″));
  请注意程序中最好调用两次getenv():第一次检查该环境变量是否存在,第二次再使用该环境变量。这是因为函数getenv()在给定的环境变量名不存在时,返回一个NULL(空)指针,如果你不首先检查而直接引用它,当该环境变量不存在时会引起CGI程序崩溃。

3、标准输出
  CGI程序通过标准输出(stdout)将输出信息传送给Web服务器,CGI的标准输出对应的是Web服务器的标准输入。传送给Web服务器的信息可以用各种格式,通常是以纯文本或者HTML文本的形式,这样我们就可以在命令行状态调试CGI程序,并且得到它们的输出。

CGI程序产生的输出由两部分组成:MIME头信息和实际的信息。两部分之间以一个空行分开。请注意任何MIME头信息后必须有一个空行

如:prinft (″Content type :text/plain%d%d″,10, 10);
  此行通过标准输出将字符串[″Contenttype :text/plain%d%d″, 10, 10]传送给Web服务器。它是一个MIME头信息,它告诉Web服务器随后的输出是以纯ASCII文本的形式。请注意在这个头信息中有两个换行符,这是因为Web服务器需要在实际的文本信息开始之前先看见一个空行。

一旦发送这个MIME头信息给Web服务器后,Web浏览器将认为随后的文本输出为HTML源代码,在HTML源代码中可以使用任何HTML结构,如超链、图像、Form,及对其他CGI程序的调用。也就是说,我们可以在CGI程序中动态产生HTML源代码。

简单实例参考:http://download.csdn.net/detail/zqj6893/5584559

二、CGI程序数据处理的一般工作流程。

1.通过检查环境变量REQUEST-METHOD确定客户端所使用的数据传递方法,POST还是GET方法。
  2.通过检查环境变量CONTENT-LENGTH,确定有多少输入;
  3.从相应环境变量中或标准输入中得到所有的用户数据;
  4.以相应的方法处理输入数据,如解码用户数据以提取所需信息、保存数据以更新配置文件等等;
  5.通过″Contenttype:″头信息,将输出信息的格式告诉Web服务器;
  6.通过使用printf()或者putchar()或者其他的文件写函数,将输出传送给Web服务器。
  CGI程序的主要任务就是从Web服务器得到输入信息,进行处理,然后将输出结果再送回给Web服务器。

三、CGI中From表单数据的分析和解码
  当用户提交一个HTMLForm时,Web浏览器首先对Form中的数据以名字/值对的形式进行编码,并发送给Web服务器,然后由Web服务器传递给CGI程序。

URL编码规则:每对name/value由&符分开;每对来自表单的name/value由“=”符分开。如果用户没有输入值给这个name,那么这个name还是出现,只是无值。任何特殊的字符(就是那些不是简单的七位ASCII,如汉字)将以百分符%用十六进制编码,当然也包括象 =、&、% 这些特殊的字符。其实url编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上“%”。比如“\”,它的ascii码是92,92的十六进制是5c,所以“\”的url编码就是%5c。那么汉字的url编码呢?很简单,看例子:“胡”的ascii码是-17670,十六进制是BAFA,url编码是“%BA%FA”。编码后数据格式如下:
  name1=value1&name2=value2&name3=value3&name4=value4&...
  其中name是Form中定义的INPUT、SELECT或TEXTAREA等标置(Tag)名字,value是用户输入或选择的设置值。程序中需要对编码后的数据进行分析和解码。要分析这种数据流,CGI程序必须首先将数据流分解成一组组的名字/值对。这可以通过在输入流中查找下面的两个字符来完成:
  每当找到字符“=”,标志着一个Form变量名字的结束;每当找到字符“&”,标志着一个Form变量值的结束。请注意输入数据的最后一个变量的值不以“&”结束。
  一旦“名字/值对”分解后,还必须将输入中的一些特殊字符转换成相应的ASCII字符。这些特殊字符是:
  +:将“+”转换成空格符;
  %xx:用其十六进制ASCII码值表示的特殊字符。根据值xx将其转换成相应的ASCII字符。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux之CGI编程小结 的相关文章

  • pprof 和 ps 之间的内存使用差异

    我一直在尝试分析用 cobra 构建的 cli 工具的堆使用情况 这pprof工具显示如下 Flat Flat Sum Cum Cum Name Inlined 1 58GB 49 98 49 98 1 58GB 49 98 os Read
  • dlopen 或 dlclose 未调用信号处理程序

    我在随机时间内收到分段错误 我注册了信号 但发生分段错误时未调用信号处理程序 include
  • 找出 Linux 上的默认语言

    有没有办法从C语言中找出Linux系统的默认语言 有 POSIX API 可以实现这个功能吗 例如 我想要一个人类可读格式的字符串 即德语系统上的 German 或 Deutsch 法语系统上的 French 或 Francais 等 有类
  • 从 Python 访问 802.11 无线管理帧

    我想从 Linux 上的 Python 嗅探 802 11 管理 探测请求 帧 这可以从 Scapy 中实现 如下所示 coding utf 8 from scapy all import def proc p if p haslayer
  • Linux“屏幕”的 Windows 等效项还是其他替代方案?

    我正在寻找一种在 Windows 环境中控制程序的方法 我希望它与 Linux 软件有点相似 screen 我搜索的原因是我需要使用标识符启动一个程序 在 Windows 上 这样我以后就能够关闭该特定程序 而无需关闭其他任何程序 即使实际
  • 如何在gnuplot中将字符串转换为数字

    有没有办法将表示数字 以科学格式 的字符串转换为 gnuplot 中的数字 IE stringnumber 1 0e0 number myconvert stringnumber plot 1 1 number 我可能使用 shell 命令
  • 树莓派上的 /dev/mem 访问被拒绝

    我正在使用我的 Raspberry Pi 并且正在编写一个 cgi python 脚本 该脚本创建一个网页来控制我的 gpio 输出引脚 当我尝试将 RPi GPIO 作为 GPIO 导入时 我的脚本崩溃了 这是我收到的错误 File co
  • 如何从远程 ssh 连接上运行的 tmux(复制模式)复制到本地剪贴板

    我通过 OS X 上的 VirtualBox 运行 Linux 我通过在无头状态下运行虚拟机 然后使用端口转发 sshing 到 Linux 机器来实现这一点 现在 无论复制到我的虚拟机上的剪贴板 我都可以粘贴到我的远程 ssh 会话上 但
  • 运行此处编译的 C 程序会导致在另一台服务器上找不到 GLIBC 库错误 - 是我的错还是他们的错?

    此处编译的 C 程序在我们的 Ubuntu 服务器上运行良好 但是当其他人尝试在他们的特定 Linux 服务器上运行它时 他们会收到以下错误 myprog install lib tls libc so 6 version GLIBC 2
  • 在 debian wheezy amd64 上安装 ia32-libs

    我正在使用 Debian 7 喘息 amd64 uname a Linux tzwm debian 3 2 0 4 amd64 1 SMP Debian 3 2 51 1 x86 64 GNU Linux 我想安装ia32 libs在我的
  • 如何在 Linux/OS X 上温和地终止 Firefox 进程

    我正在使用 Firefox 进行一些自动化操作 尽管我可以从 shell 打开 Firefox 窗口 但我无法正确终止它 如果我kill火狐进程与kill 3 or kill 2当我下次打开新的 Firefox 窗口时 命令会询问我是否要在
  • 如何反汇编、修改然后重新组装 Linux 可执行文件?

    无论如何 这可以做到吗 我使用过 objdump 但它不会产生我所知道的任何汇编器都可以接受的汇编输出 我希望能够更改可执行文件中的指令 然后对其进行测试 我认为没有任何可靠的方法可以做到这一点 机器代码格式非常复杂 比汇编文件还要复杂 实
  • SMP 上如何处理中断?

    SMP 对称多处理器 多核 机器上如何处理中断 内存管理单元是只有一个还是多个 假设两个线程 A 和 B 运行在不同的内核上 同时 访问页表中不存在的内存页面 在这种情况下 将会出现页面错误 并从内存中引入新页面 将会发生的事件的顺序是什么
  • 如何在perl中使用O_ASYNC和fcntl?

    我想使用 O ASYNC 选项 当管道可以读取时 SIGIO 的处理程序将运行 但以下代码不起作用 任何人都可以帮助我吗 bin env perl use Fcntl SIG IO sub print catch SIGIO n my fl
  • 在非实时操作系统/内核上执行接近实时任务的最佳方法是什么?

    在一台 GNU Linux 机器上 如果想要执行 实时 亚毫秒级时间关键 任务 您几乎总是必须经历漫长 复杂且容易出现问题的内核补丁过程 以提供足够的支持 1 http en wikipedia org wiki RTLinux Backg
  • Bash - 比较 2 个文件列表及其 md5 校验和

    我有 2 个列表 其中包含带有 md5sum 检查的文件 即使文件相同 列表也具有不同的路径 我想检查每个文件的 md5 和 我们正在讨论数千个文件 这就是为什么我需要脚本来仅显示差异 第一个列表是普通列表 第二个列表是文件的当前状态 我想
  • 如何使用内容类型:多部分/相关

    我想向用户发送一个二进制文件 并在浏览器上显示一些 HTML 我正在使用 apache2 的 CGI BIN 脚本 我发现此示例位于第 4 页 http www ietf org rfc rfc2387 txt 该链接还显示有关多部分 相关
  • 如何使用 go1.6.2 构建 linux 32 位

    有没有任何组合GOARCH and GOOS我可以设置哪些值来构建 ELF 32 位二进制文 件 GOOS linux and GOARCH 386 更多示例 架构 32 bit gt GOARCH 386 64 bit gt GOARCH
  • 亚马逊 Linux - 安装 openjdk-debuginfo?

    我试图使用jstack在 ec2 实例上amazon linux 所以我安装了openjdk devel包裹 sudo yum install java 1 7 0 openjdk devel x86 64 但是 jstack 引发了异常j
  • 如何回忆上一个 bash 命令的参数?

    Bash 有没有办法回忆上一个命令的参数 我通常这样做vi file c其次是gcc file c Bash 有没有办法回忆上一个命令的参数 您可以使用 or 调用上一个命令的最后一个参数 Also Alt can be used to r

随机推荐

  • Ceph概述、准备ceph部署环境、cephadm概述、安装Ceph集群、ceph块存储、存储池、rbd镜像管理、ceph客户端配置

    day03 day03ceph概述部署Ceph节点准备cephadm准备基础环境安装ceph实现块存储块存储基础存储池镜像ceph客户端 ceph概述 ceph可以实现的存储方式 块存储 提供像普通硬盘一样的存储 为使用者提供 硬盘 文件系
  • ping ip测试是否可用 脚本

    方式有很多 上脚本 bin bash ping两次ip记录那些ip是通的 for i in 1 100 do HOST 192 168 0 i ping c 2 HOST gt dev null if eq 0 then echo HOST
  • cmakelists实操记录

    cmake 工具要领 主要工具逻辑 查看帮助 cmake help command cmake set 定义变量后 可以跟多个表达式 来说明变量有多个数据段 set QC INCLUDE QC INCLUDE QC SYSROOT usr
  • Tina填坑

    1 Tina3 5 编译全志X3报错 environment variable SOURCE DATE EPOCH must expand to a non negative integer less than or equal to 25
  • QT学习 --自定义的信号与槽发生重载的解决

    当自定义的信号与槽发生重载时 应该怎样处理呢 首先 要定义一个函数指针 其次 我们在声明一个成员函数的函数地址时 要把成员函数的作用域也放到指针的前面 在 student h 中 ifndef STUDENT H define STUDEN
  • MACOS 编译FFMPEG库

    1 下载ffmpeg4 3 1源码 2 解压 configure prefix usr local enable gpl enable nonfree enable libass enable libfdk aac enable libfr
  • React 使用数组遍历循环渲染页面时,数组长度和值变了但不触发渲染

    在store内定义一个数组 observable list 类组件遍历循环渲染 render return div store list map item gt return div item name div div handleAdd
  • Linux运维工程师面试知识点汇总

    Linux运维工程师面试知识点汇总 一 Linux系统部分 1 使用iptables实现端口转发 做DNAT转换 做SNAT转换 清空iptables过滤规则 2 iptables和firewall区别 3 查询系统及资源的相关状态 4 f
  • 下电影去哪里啊

    入门级 电影天堂 http www xiaopian com 飘花电影 http www piaohua com 6V电影 http www 6vdy com 圣城家园 http www cnscg org 电影FM http dianyi
  • Jenkins使用操作手册

    Jenkins使用操作手册 Jenkins的安装非常简单 可以找个Jenkins的war包 直接放在Tomcat下启动Tomcat就行 这里有war包 也可以自己在网上找 链接 https pan baidu com s 18NAW2Bfi
  • 解决sockjs.js?9be2:1609 GET http://192.168.1.1:8080/sockjs-node/info?t=1634257459…… 中的报错

    亲测可用 报错原因 在项目运行以后 network会一直调用这个接口 如果没有使用 那么就一直会报这个异常 解决方案 找到 node modules 下的 node modules sockjs client dist sockjs js
  • Mybatis 开启控制台打印sql语句

    1 无论使用mybatis plus还是mybatis 只要在springboot的配置文件 appcation yml中添加 就可以答应sql logging level org jeecg modules hdx mapper debu
  • Linux常用命令介绍

    简介 介绍linux的常用命令 shutdown h now 立即关机 shutdown h n n分钟后关机 shutdown r now 立即重启 halt 效果等效与立即关机 reboot 立即重启 sync 把内存中的数据保存到磁盘
  • c++中规范使用全局变量

    c 中规范使用全局变量 一 static extern全局变量的区别 在qt c 编程中经常出现段错误 变量声名未前置extern等问题 经排查为全局变量使用不规范导致 static extern主要用来定义全局变量 static和exte
  • webapi请求返回{"$id":"1","Message":"请求的资源不支持 http 方法“GET”。"}

    webapi请求返回 id 1 Message 请求的资源不支持 http 方法 GET 一开始时进不了断点 以为是建立Controller方法不对 是不是要加 HttpGet 没用 直接在浏览器输入 返回 id 1 Message 请求的
  • python实现ssh+scp文件上传下载,sudo免密执行命令脚本

    import paramiko from scp import SCPClient import os scpclient只能上传 下载单文件 不能传文件目录 def scp up ip list username password fil
  • 玩转文本统计利器:Linux wc命令详解与实用技巧

    原创2023 06 04 23 56 程序猿食堂 玩转文本统计利器 Linux wc命令详解与实用技巧 Linux 的 wc 命令是一个用于统计文件内容的实用工具 它主要用于计算文件中的字节数 单词数和行数 这些统计信息对于文本文件的分析和
  • 这几天,服务器被攻击了(后续,已解决)

    上周困扰我的官网被攻击的事情 今天终于解决啦 现在我分享一下继上篇文章之后 我做了哪些事情 上篇文章简书链接 点我 一 发现 上次使用D盾工具 查杀了大部分后门程序和感染文件 而且还在阿里云上做了端口域名限制 之后我打开官网访问就正常了 但
  • 学习一下vue-element-admin的使用

    要在 Windows 上使用 Vue Element Admin 您需要完成以下步骤 1 安装 Node js 访问 Node js 官网 https nodejs org zh cn 下载并安装最新版本的 Node js 2 下载 Vue
  • Linux之CGI编程小结

    一 CGI标准输入 环境变量 标准输出 1 标准输入 CGI程序的标准输入是与Web服务器的标准输出对应的 看起来就像其他可执行程序一样通过标准输入 stdin 得到输入信息 实则这些数据是由浏览器传递给服务器后再由服务器定向到CGI的输入