cgi和fastcgi获取所有环境变量(C语言)

2023-11-18

参考:http://blog.chinaunix.net/uid-620765-id-2084386.html

还记得C语言main函数的完整声明吗?

   int main(int argc, char **argv, char **envp);
  
   这个就是c语言中main函数的完整声明, argc表示参数个数,argv表示参数字符串,而这个envp就表示环境变量字符串。参数和环境变量都可以不止一个,所以,用指向字符串指针的指针来表示。

  比如我们用C语言写了一个程序,运行在命令行下,带有2个参数

  C:> cpfile.exe c:\test.txt d:\test.txt

  那么这里的
  argc=3;
  argv[0] = "cpfile.exe";
  argv[1] = "c:\test.txt";
  argv[2] = "d:\test.txt";

  在c语言中的stdlib.h中有一个
  extern char **environ; 或者
  extern char **_environ;的声明
  这个envp的参数实际上就是environ。

  好,我们看看在cgi程序(其实就是一个C语言程序)里面怎么枚举这些环境变量

  先写一个html页面:(当然也可以不要)   

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Cache-Control" content="no-cache, must-revalidate">
<title>test</title>
<script type="text/javascript">
function post_submit()
{
	document.getElementById( "mainform" ).method = "post";
	document.getElementById( "mainform" ).submit();
}

function get_submit()
{
	document.getElementById( "mainform" ).method = "get";
	document.getElementById( "mainform" ).submit();
}
</script>
</head>
<body>
<div class="editView">
<form id="mainform" method="post" action="/printenv.cgi" enctype="multipart/form-data">
	<fieldset class="">
		<legend>测试页面</legend>
		<dl class="nowrap">
			<dd>
				<span>名称</span>:
				<input id="name" name="name" type="text" value="ldapserver_name">
				<span>IP</span>:
				<input id="ip" name="ip" type="text">
			</dd>
		</dl>
		<dl class="nowrap">
			<dd>
				<span>复选框1</span>:
				<input id="checkbox1" name="checkbox1" type="checkbox" checked/>
				<span>    复选框1</span>:
				<input id="checkbox2" name="checkbox2" type="checkbox" />
			</dd>
		</dl>
		<dl class="nowrap">
			<dd>
				<label for="radiotest1">单选按钮1</label>
				<input name="radiotest" id="radiotest1" type="radio" value="1"/>
				<label for="radiotest2">  单选按钮2</label>
				<input name="radiotest" id="radiotest2" type="radio" value="2" checked/>
				<label for="radiotest3">  单选按钮3</label>
				<input name="radiotest" id="radiotest3" type="radio" value="3"/>
			</dd>
		</dl>
		<dl class="nowrap" id="dl_ca">
			<dd>
				<span>上传文件</span>
				<input class="" name="uploadfile" id="uploadfile" type="file"/>
			</dd>
		</dl>
		<dl class="nowrap">
			<dd><span>下拉框</span>:
				<select name="dropbox" id="dropbox">
					<option value="3">3</option>
					<option value="2">2</option>
				</select>
			</dd>
		</dl>
	</fieldset>
	<fieldset class="btnfield">
		<dl class="nowrap">
			<dt> </dt>
			<dd>
				<a id="submit" href="javascript:;" value="Submit" οnclick="javascript: post_submit();">post提交</a>
				  <a id="submit" href="javascript:;" value="Submit" οnclick="javascript: get_submit();">get提交</a>
				  <a href="javascript:;">取消</a>
			</dd>
		</dl>
	</fieldset>
</form>
</div>
</body>
</html>


呈现效果如下:


cgi程序源码:

/* env.c */
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
  
int main()  
{  
    extern char   **environ;  
    int nlen = 0;  
    int i;  
    char *psz_content = NULL;  
    char **pp_env;   

    printf("Content-type: text/html\n\n");  
     
    for ( pp_env = environ; *pp_env; pp_env++ )  
        printf("%s<br>", *pp_env);  
  
    if ( strcmp("GET", getenv("REQUEST_METHOD")) == 0 )  
    {  
  
        printf("<p>%s</p>", getenv("QUERY_STRING"));  
    }  
    else  
    {  
        nlen = atoi(getenv("CONTENT_LENGTH"));  
        psz_content = ( char * )malloc( nlen + 1 );
        memset( psz_content, 0, nlen + 1 );
        printf("<p>char value:</p><p>");
        for (i = 0; i < nlen; i++ )     
        {  
            psz_content[i] = fgetc(stdin);
            printf( "%c", psz_content[i] );
        }
        printf("</p><p>string value: %s</p>", psz_content);  
    }
    return 0;  
}  

如果是fastcgi可以用以下代码打印环境变量:

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  

#include <fcgi_stdio.h>
  
int main()  
{  
    extern char   **environ;  
    int nlen = 0;  
    int i;  
    char *psz_content = NULL;  
    char **pp_env;   

    while(FCGI_Accept() >= 0)
    {
        printf("Content-type: text/html\n\n");  
         
        for ( pp_env = environ; *pp_env; pp_env++ )  
            printf("%s<br>", *pp_env);  
      
        if ( strcmp("GET", getenv("REQUEST_METHOD")) == 0 )  
        {  
      
            printf("<p>%s</p>", getenv("QUERY_STRING"));  
        }  
        else  
        {  
            nlen = atoi(getenv("CONTENT_LENGTH"));  
            psz_content = ( char * )malloc( nlen + 1 );
            memset( psz_content, 0, nlen + 1 );
            printf("<p>char value:</p><p>");
            for (i = 0; i < nlen; i++ )     
            {  
                psz_content[i] = fgetc(stdin);
                printf( "%c", psz_content[i] );
            }
            printf("</p><p>string value: %s</p>", psz_content);  
        }
    }
    return 0;  
}  

注意:

1、这里使用fgetc函数从标准输入读数据,不能使用gets代替

2、FCGX中,头和环境信息在FCGX_Request->envp中,不能用genenv获取,要用FCGX_GetParam获取。


在地址栏 http://localhost/testenv.htm
假设我们输入的用户名和密码分别为abcd和efgh,提交表单之后,在我的机器上显示的结果如下:

COMSPEC=C:\WINDOWS\system32\cmd.exe
CONTENT_LENGTH=31
CONTENT_TYPE=application/x-www-form-urlencoded
DOCUMENT_ROOT=d:/chateaurt4/www
HTTP_ACCEPT=text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
HTTP_ACCEPT_CHARSET=gb2312,utf-8;q=0.7,*;q=0.7
HTTP_ACCEPT_ENCODING=gzip,deflate
HTTP_ACCEPT_LANGUAGE=zh-cn,zh;q=0.5
HTTP_CONNECTION=keep-alive
HTTP_HOST=localhost
HTTP_KEEP_ALIVE=300
HTTP_REFERER=http://localhost/testenv.htm
HTTP_USER_AGENT=Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3
PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;D:\MicrosoftVisual Studio\Common\Tools\WinNT;D:\Microsoft VisualStudio\Common\MSDev98\Bin;D:\Microsoft VisualStudio\Common\Tools;D:\Microsoft VisualStudio\VC98\bin;D:\AppServ\Apache2.2\bin;D:\AppServ\php5;D:\AppServ\MySQL\bin
REMOTE_ADDR=127.0.0.1
REMOTE_PORT=1644
SCRIPT_FILENAME=d:/chateaurt4/www/cgi-bin/env.cgi
SERVER_ADDR=127.0.0.1
SERVER_ADMIN=who@where.net
SERVER_NAME=localhost
SERVER_PORT=80
SERVER_SIGNATURE=
Apache/1.3.33 Server at localhost Port 80

SERVER_SOFTWARE=Apache/1.3.33 (Win32)
SystemRoot=C:\WINDOWS
WINDIR=C:\WINDOWS
GATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.1
REQUEST_METHOD=POST
QUERY_STRING=
REQUEST_URI=/cgi-bin/env.cgi
SCRIPT_NAME=/cgi-bin/env.cgi

usr=abcd&pwd=efgh&submit=Submit


当然不同的机器,它输出的有些结果可能不一样。如果单纯为了输出环境变量,我们可以这样做:
#include <stdio.h>

int main (int argc, char **argv, char **envp)
{
   char **var = envp;
   while (*var)
        printf ("%s \n",*var++);

   return 0;
}

这里面得到的环境变量结果和CGI程序里面的结果差别比较大,因为一个是获得与web应用程序有关的环境变量,而一个获得的是系统的环境变量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cgi和fastcgi获取所有环境变量(C语言) 的相关文章

  • 将输入从 html 传递到 python 并返回

    我需要为作业制作一个网页 它不必上传到网络 我只是使用本地 html 文件 我做了一些阅读并想出了以下 html 和 python h3 Study h3 p At my study we learn Python br This is a
  • 如何用C++代码维护会话?

    有一段用C 编写的cgi代码 目前网页中没有进行会话管理 需要在网页中提供会话 以便用户可以登录 保持会话 然后注销 虽然这是使用 HttpSession 在 java 中相当简单的任务 但我不知道如何使用 C 代码来完成此任务 C 在捆绑
  • CPAN 安装新模块是否会影响同一实时生产服务器上的 Perl-CGI 应用程序?

    我在 CentOS Linux 网络服务器上有一些 Perl CGI 程序 我希望编写更多需要当前未安装的 Perl 模块的应用程序 在同一实时生产服务器上运行 CPAN 是否会以任何方式影响这些程序 显然 当前不使用这些模块 有一种可能的
  • Python CGI os.system 导致标头格式错误

    我正在运行 Apache 2 4 10 Raspbian 并且我正在使用 python 作为 CGI 但是当我尝试在简单代码中使用 os system 时 我收到此格式错误的标头错误 Wed Aug 31 17 10 05 715740 2
  • Apache CGI 重定向到绝对 URI 不起作用

    我在 Windows 上以控制台模式运行 Apache 2 2 13 我制作了一个处理请求的可执行文件 在某些情况下 当它检测到指向目录但没有尾部斜杠的 URL 时 它会尝试重定向到附加了缺少的斜杠的同一 URL 退出代码设置为 301 奇
  • web.config IIS 中的 PHP(或其他)CGI 配置

    我最近开发了一个 Web 应用程序的安装程序 是的 带有安装程序的 Web 应用程序 使用维克斯工具套装 http wixtoolset org 该向导引导用户获取站点安装所需的所有基本信息 如下所示 在安装结束时使用自定义操作 我使用动态
  • 调试 CGI python

    除了每次浏览器生成错误时查看日志文件之外 是否有任何简单的方法来调试 cgi python 程序 您可以使用cgitb http docs python org library cgitb html模块 这很简单 import cgitb
  • 如何在Python中读取cookie

    我是 python cgi 脚本的新手 我想用Python读取cookie 我尝试了以下代码 from urllib2 import Request build opener HTTPCookieProcessor HTTPHandler
  • SQLite 的磁盘 I/O 错误

    我有一个 很小的 动态网站 它 大致 是一个使用 SQLite 数据库的 Perl CGI 脚本 DBI 包是 Perl 中使用的抽象层 大约一周前 我开始看到此错误消息 disk I O error 10 at dbdimp c line
  • 编写 Perl CGI 应用程序的最佳方法是什么?

    我见过的每个 CGI Perl 示例基本上都是一堆包含 HTML 的打印语句 这似乎不是编写 CGI 应用程序的最佳方法 有一个更好的方法吗 谢谢 编辑 我决定使用 CGI Application 和 HTML Template 并使用以下
  • 如何以不依赖扩展的方式禁用 htaccess 中的 cgi?

    我想在文档根目录下的目录中禁用任何类型的 CGI 执行 任何类型 php perl ruby 等等 我想以一种不依赖于文件扩展名的方式来执行此操作 在我的文档根目录下 因为用户必须能够放置和查看 HTML 文件 它必须位于 htaccess
  • 如何将变量值从 javascript 传递到 perl

    我正在使用 JavaScript 插件来获取 IP 地址 如果 IP 地址开头为10 15我想为一个变量分配一个值 如果IP以10 13我想为同一个变量分配不同的值 我不知道该变量是否必须在 Perl 或 JavaScript 中 我正在尝
  • 当表单 POST 到我的脚本时,如何访问 URL 中传递的参数?

    我遇到了一个问题模组重写 http httpd apache org docs 2 2 mod mod rewrite html当向我们的网站提交表单时 perl 脚本 如果有人在具有如下 url 的页面上执行 GET 请求http www
  • 如何减少 Perl CGI 脚本的启动时间?

    我正在开发一些 CGI 脚本 并且正在尝试找到一种解决方案来减少使用 use 导入大量模块时产生的 启动时间 Update 提供的解决方案很好 但我正在使用的脚本在控制台和 CGI 模式下运行 检查是否存在一些典型的 HTTP 环境变量 在
  • 使用Python的CGI表单提交按钮

    我正在尝试创建一个cgi 表单 允许用户输入一个单词 然后它将获取该单词并将其发送到下一页 另一个cgi 我知道如何使用 html 文件来做到这一点 但是当涉及到使用 python cgi 时 我迷失了 这是我需要做的 但它是 html 格
  • 使用 shell 脚本进行 CGI 编程

    我需要将文本框的内容传递到变量中 即 在 html 页面的文本框中输入的任何内容都需要传递给变量 这是因为我在 linux shell 编程中调用 HTML 以及 CGI 我需要根据需要操纵该变量 你有什么想法去做吗 我需要做的是 我想获取
  • python:与cgi脚本中的会话交互

    python cgi 脚本可以向会话写入和读取数据吗 如果是这样怎么办 是否有高级 API 或者我必须推出自己的类 没有 session on cgi 如果您使用的是原始会话 则必须滚动自己的会话处理代码cgi 基本上 会话的工作原理是创建
  • Perl CGI 脚本根据运行返回不同的结果

    我有一个 Perl CGI 脚本 它明显随机地发出不同的 HTML 所有输入都没有改变 例如 我会跑wget两次并得到两个不同的结果 CGI 由开发数据库支持 该数据库也不会改变 我有一个调试语句 通知我相同数量的元素从数据库返回到脚本中
  • 如何提高非持久 CGI 进程中的 Moose 性能?

    Moose http search cpan org dist Moose 是一个很棒的对象框架 问题在于 连同它的依赖项一起 它是very大的 我们的分析表明 在我们的平台上 仅加载 Moose 就会在非持久性 CGI 应用程序脚本上产生
  • 为 Mercurial 执行 hgweb.cgi 时,指定的 CGI 应用程序行为不当...

    我有 IIS 6 我将 Mercurial 安装在 c program files mercurial 中 我在 c program files python 中安装了 Python 2 6 I added extension handli

随机推荐

  • python 数组操作中的 “:” “:: ” “, ” python 中的 [:-1] 和 [::-1] [-1:-2:-1] [

    使用python版本3 7 首先先了解下python3 7中的下标 python下标有两套 一套是正的 一套是负的 引入负坐标的意义应该是方便将数组中的数据从右往左访问 a python 中的python 的下标描述如下 组 p y t h
  • 2019ICPC上海Spanning Tree Removal构造题

    刚打完2021杭电多校6 有个构造 当时没有做 回头看了一波巨佬的博客学了一手 在这里记录一下 题目链接 链接 https ac nowcoder com acm contest 4370 D 来源 牛客网 spj 题目描述 Bob has
  • SpringBoot项目多数据源的数据库连接池的启动

    Maven部分配置
  • 03-信息收集

    信息搜集 全面了解系统 什么是信息收集 信息收集是指通过各种方式获取所需要的信息 信息收集是信息得以利用的第一步 也是关键的一步 信息收集工作的好坏 会影响整个渗透测试流程的进行 收集的信息越多后期可进行测试的目标就越多 信息收集包含资产收
  • python中items的作用_什么是python items函数?怎么使用它?

    这篇文章我们来学习一下关于python字典之中的python items函数的相关知识 items函数是什么意思 这个函数有什么作用都将会在接下来的文章之中得到解答 描述 Python 字典 Dictionary items 函数以列表返回
  • vue3 watch 监听多值以及深度监听用法

    1 监听单个值 引入 import watch from vue import useRouter from vue router export default setup const route useRouter 获取当前路由地址 wa
  • linux kernel file_open

    内核空间与用户空间 在vfs read和vfs write函数中 其参数buf指向的用户空间的内存地址 如果我们直接使用内核空间的指针 则会返回 EFALUT 这是因为使用的缓冲区超过了用户空间的地址范围 一般系统调用会要求你使用的缓冲区不
  • Qt VTK ITK安装与测试(三)ITK的安装与测试

    ITK的安装与测试 安装简介 本部分讲述使用cmake加VS2010编译 安装ITK库 基本步骤和VTK安装时相同 而后测试VTK与ITK的联合开发 VTK安装步骤 1 资源下载 资源下载网址 http www itk org ITK re
  • 【笔记】python中的for循环(遍历列表)、for循环中的一些缩进问题

    文章目录 一 for循环 遍历列表 在for循环中执行更多的操作 二 for循环中的一些缩进问题 一 for循环 遍历列表 我们经常需要遍历列表的所有元素 对每个元素执行相同的操作 这种情况下 我们就需要使用for循环 下面我们举几个栗子来
  • 专业CPU信息检测工具:CPU-Z

    今天小编为大家测试了一款轻量级的CPU处理器的测试工具 可以查看CPU的详细信息 以供各位同学们学习 一 简单介绍 CPU Z是一款非常流行的CPU检测软件 被广大用户所熟知 它是目前最受欢迎的CPU检测软件之一 除了Intel和AMD自带
  • SQLi-LABS Less-29到Less-31

    Less 29题目 Less 29的题目提到了WAF 看题目的意思应该是一个保护网站的东西 百度了一下 WAF就是Web Application Firewall 主要功能是拦截入侵尝试 比如SQL Injection XSS 路径遍历 窃
  • Java中insert()方法的使用

    insert 函数表示在字符串中插入字符串 StringBuffer insert int index String str 在Java中最常用instert方法的是这两个类型StringBuffer和StringBuilder 首先需要先
  • elementui的文件上传功能-.上传文件-带参数-手动

    elementui的文件上传功能 上传文件 带参数 手动
  • JS函数(二)基础 return 返回值

    创建函数 function 函数名 形参变量列表 函数体 return 返回值 return 1 什么是 返回 return语句将终止当前函数并返回当前函数的值 2 为什么要用 我们先来看一组代码
  • matlab矩阵(一)--如何控制矩阵中小数点的位数

    format 设置输出格式对浮点性变量 缺省为format short format并不影响matlab如何计算和存储变量的值 对浮点型变量的计算 即单精度或双精度 按合适的浮点精度进行 而不论变量是如何显示的 对整型变量采用整型数据 整型
  • 汤姆·克鲁斯 - 电影全集

    1 熄灯号 Taps 1981 导演 哈诺德 贝克编剧 Darryl Ponicsan Devery Freeman James Lineberger主演 乔治 C 斯科特 蒂莫西 赫顿 罗尼 考克斯 西恩 潘 汤姆 克鲁斯 伊万 汉德勒
  • HLS图像处理系列——在ZEDBoard搭建DDR图像处理通路

    ZYNQ芯片内包含一个丰富特性的基于双核ARM Cortex A9的处理子系统 Processing System PS 和Xilinx 28nm可编程逻辑 Programmable Logic PL PS除了核心外还包括片上存储器 外部存
  • 端口扫描程序nmap使用手册

    摘要 nmap是一个网络探测和安全扫描程序 系统管理者和个人可以使用这个软件扫描大型的网络 获取那台主机正在运行以及提供什么服务等信息 nmap支持很多扫描技术 例如 UDP TCP connect TCP SYN 半开扫描 ftp代理 b
  • [原创]Discuz!NT1.1高亮代码插件1.5稳定版!

    Discuz NT 1 1高亮代码插件FOR NET2 0 作者 winson 版本 1 5稳定版 支持网站 http bbs szblogs com 功能 为论坛增加高亮代码显示 类似cnblogs的形式 一 1 5版修复的问题 之前发布
  • cgi和fastcgi获取所有环境变量(C语言)

    参考 http blog chinaunix net uid 620765 id 2084386 html 还记得C语言main函数的完整声明吗 int main int argc char argv char envp 这个就是c语言中m