请求动态脚本 Browser请求http://xxx.com/bb.php -> Web Server(Nginx/Apache)分发 -> PHP解析器(PHP-CGI程序)-> 返回处理结果给Web...原理:服务器根据配置文件,知道这是一个PHP脚本文件,需要去找PHP解析器来处理。 PHP解析器会解析php.ini文件初始化执行环境,然后处理请求,再以标准的数据格式返回处理结果,最后退出进程。...动态地生成内容,保证了传递过来的数据是标准格式的(规定了以什么样的格式传哪些数据(URL、查询字符串、POST数据、HTTP header等等)),方便了开发者。...为了能够使Nginx理解FastCGI协议,Nginx提供了FastCGI模块来将http请求映射为对应的FastCGI请求。...Nginx的FastCGI模块提供了fastcgi_param指令来主要处理这些映射关系,下面 是Nginx的一个配置文件实例,其主要完成的工作是将Nginx中的变量翻译成PHP中能够理解的变量。
“argv” 传递给该脚本的参数。当脚本运行在命令行方式时,argv 变量传递给程序C 语言样式的命令行参数。当调用GET 方法时,该变量包含请求的数据。...“argc” 包含传递给程序的命令行参数的个数(如果运行在命令行模式)。 “GATEWAY_INTERFACE” 服务器使用的CGI 规范的版本。例如,“CGI/1.1”。...“QUERY_STRING” 查询(query)的字符串(URL 中第一个问号? 之后的内容)。 “DOCUMENT_ROOT” 当前运行脚本所在的文档根目录。在服务器配置文件中定义。...注: 如果脚本在CLI 中被执行,作为相对路径,例如file.php 或../file.php,$_SERVER['SCRIPT_FILENAME'] 将包含用户指定的相对路径。...“SERVER_ADMIN” 该值指明了Apache 服务器配置文件中的SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值。
$_SERVER['argv'] 1、cli模式(命令行)下,第一个参数$_SERVER['argv'][0]是脚本名,其余的是传递给脚本的参数 2、web网页模式下 在web页模式下必须在php.ini...$_SERVER参数详解 $_SERVER['PHP_SELF'] #当前正在执行脚本的文件名,与 document root相关。 $_SERVER['argv'] #传递给该脚本的参数。...$_SERVER['argc'] #包含传递给程序的命令行参数的个数(如果运行在命令行模式)。 $_SERVER['GATEWAY_INTERFACE'] #服务器使用的 CGI 规范的版本。...例如,“CGI/1.1”。 $_SERVER['SERVER_NAME'] #当前运行脚本所在服务器主机的名称。...$_SERVER['QUERY_STRING'] #查询(query)的字符串。 $_SERVER['DOCUMENT_ROOT'] #当前运行脚本所在的文档根目录。在服务器配置文件中定义。
: CGI 模式 此时 php 是一个独立的进程比如 php-cgi.exe,web 服务器也是一个独立的进程比如 apache.exe,然后当 Web 服务器监听到 HTTP 请求时,会去调用 php-cgi...进程,他们之间通过 cgi 协议,服务器把请求内容转换成 php-cgi 能读懂的协议数据传递给 cgi 进程,cgi 进程拿到内容就会去解析对应 php 文件,得到的返回结果在返回给 web 服务器...简而言之,CGI 模式是 apache2 接收到请求去调用 CGI 程序,而 fastcgi 模式是 fastcgi 进程自己管理自己的 cgi 进程,而不再是 apache 去主动调用 php-cgi...,包括 php 手册规定的: 《php.ini 配置选项列》 https://www.php.net/manual/zh/ini.list.php fastcgi 协议中只可以传输配置信息及需要被执行的文件名及客户端传进来的...,如果是 base64 数据传输换成 base64encode,如果直接传的话把 gopher 的字符串去掉 *CTF echohub 从 echohub 这道题来说,题目环境装了 apache 服务器和
PATH_INFO 这个环境变量的值表示紧接在CGI程序名之后的其他路径信息。它常常作为CGI程序的参数出现。...SCRIPT_FILENAME CGI脚本的完整路径 SCRIPT_NAME CGI脚本的的名称 SERVER_NAME 这是你的 WEB 服务器的主机名、别名或IP地址。...例如,上面的值为Apache/2.2.14(Unix) 一个例子 说了这么多,你也许感觉烦了,写个小程序可能会更好的理解。...,它的文本值表示Web服务器传送给CGI程序的输入中的字符数目。...如果我们在Apache启动前在其配置文件中配置好了PHP模块, PHP模块通过注册apache2的ap_hook_post_config挂钩,在Apache启动的时候启动此模块以接受PHP文件的请求。
除了fpm,最常见的sapi应该是用于Apache的mod_php,这个sapi用于php和apache之间的数据交换。 php-cgi也是一个sapi。...基于bash、perl等语言的web应用多半都是以这种方式来执行,这种执行方式一般就被称为cgi,在安装Apache的时候默认有一个cgi-bin目录,最早就是放置这些cgi脚本用的。...也就说,我们可以像perl一样,让web容器直接fork一个php-cgi进程执行某脚本;也可以在后台运行php-cgi -b 127.0.0.1:9000(php-cgi作为fastcgi的管理器),...这个漏洞简单来说,就是用户请求的querystring被作为了php-cgi的参数,最终导致了一系列结果。...探究一下原理,RFC3875中规定,当querystring中不包含没有解码的=号的情况下,要将querystring作为cgi的参数传入。所以,Apache服务器按要求实现了这个功能。
$_SERVER['PHP_SELF'] #当前正在执行脚本的文件名,与 document root相关。 $_SERVER['argv'] #传递给该脚本的参数。 ...$_SERVER['argc'] #包含传递给程序的命令行参数的个数(如果运行在命令行模式)。 $_SERVER['GATEWAY_INTERFACE'] #服务器使用的 CGI 规范的版本。...例如,“CGI/1.1”。 $_SERVER['SERVER_NAME'] #当前运行脚本所在服务器主机的名称。 ...$_SERVER['QUERY_STRING'] #查询(query)的字符串。 $_SERVER['DOCUMENT_ROOT'] #当前运行脚本所在的文档根目录。在服务器配置文件中定义。 ...包含服务器版本和虚拟主机名的字符串。
递交表单的文本的 URL,不是所有的浏览器都发出这个信息, 不要依赖它 PATH_INFO 传递给 CGI 程序的路径信息 QUERY_STRING 传递给 CGI 程序的请求参数,也就是用”?...得到所有的信息,再没有信息大小的限制了 使用场景:例如牛客网等平台中的在线编程工具,网页客户端将数据当做输入传递给后端的cgi程序,cgi程序处理完成之后将结果作为输出返回给客户端 cgi与server...;#脚本文件请求的路径 QUERY_STRING $query_string; #请求的参数;如?...六、spawn-fcgi(FasiCGI进程管理器) Nginx不能像Apache那样直接执行外部可执行程序,但Nginx可以作为代理服务器,将请求转发给后端服务器,这也是Nginx的主要作用之一...备注:如果出现访问错误,应该是Nginx配置文件的缩进没写对,在shell中Tab缩进不是4字符 八、编程演示案例 让Nginx运行FastCGI程序的工作原理大致为: 第一步:先编写一个FastCGI
(录入视频转换、统计处理等); 动态/静态子进程产生; 基本 SAPI 运行状态信息(类似Apache的 mod_status); 基于 php.ini 的配置文件。...保证了传递过来的数据是标准格式的(规定了以什么样的格式传哪些数据(URL、查询字符串、POST数据、HTTP header等等)),方便了开发者。...FastCGI FastCGI,顾名思义为更快的 CGI,它允许在一个进程内处理多个请求,而不是一个请求处理完毕就直接结束进程,性能上有了很大的提高。...为了能够使 Nginx 理解 fastcgi 协议,Nginx 提供了 fastcgi 模块来将 http 请求映射为对应的 fastcgi 请求。...Nginx的FastCGI模块提供了fastcgi_param指令来主要处理这些映射关系,下面 是Nginx的一个配置文件实例,其主要完成的工作是将Nginx中的变量翻译成PHP中能够理解的变量。
$_SERVER['argv'] #传递给该脚本的参数。 $_SERVER['argc'] #包含传递给程序的命令行参数的个数(如果运行在命令行模式)。...$_SERVER['GATEWAY_INTERFACE'] #服务器使用的 CGI 规范的版本。例如,“CGI/1.1”。...$_SERVER['QUERY_STRING'] #查询(query)的字符串。 $_SERVER['DOCUMENT_ROOT'] #当前运行脚本所在的文档根目录。在服务器配置文件中定义。...$_SERVER['SERVER_ADMIN'] #管理员信息 $_SERVER['SERVER_PORT'] #服务器所使用的端口 $_SERVER['SERVER_SIGNATURE'] #包含服务器版本和虚拟主机名的字符串...$_SERVER['AUTH_TYPE'] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型。
PHP消耗的资源较少,当PHP作为ApacheWeb服务器一部分时,运行代码不需要调用外部二进制程序,服务器不需要承担任何额外的负担。...$_SERVER['PHP_SELF']//正在执行脚本的文件名 $_SERVER['argv'] //传递给该脚本的参数。...$_SERVER['argc'] //传递给程序的命令行参数的个数。 $_SERVER['GATEWAY_INTERFACE']//CGI 规范的版本。...']//访问页面时的请求方法 $_SERVER['QUERY_STRING'] //查询(query)的字符串。...(一个为加速php脚本的执行,第二为给用zend加密的文件解密)的版本 PS:如果php的脚本没有经过加密,那么zend optimizer可以不用安装!
其他情况(带参数 GET,POST 方式,url 为可执行文件),则调用 excute_cgi 函数执行 cgi 脚本。...,设置 request_method 的环境变量,GET 的话设置 query_string 的环境变量,POST 的话设置 content_length 的环境变量,这些环境变量都是为了给 cgi 脚本调用...前面所有的字符 //如果遍历完没找到字符?则退出 while((*query_string != '?') && (*query_string !...{ cgi = 1; //在字符?处分隔 *query_string = '\0'; query_string++; } } //?...脚本 char meth_env[255]; char query_env[255]; char length_env[255]; //将子进程的输出由标准输出重定向到 cgi_ouput
首先、配置apache、htaccess 网站根目录为/var/www, 我们放试验脚本的目录为/var/www/python-cgi。...$ chmod a+x py-cgi-index.py 环境配置就完成了。 一、cgi的hello world cgi的通信依靠stdout与浏览器通信。...cgi接口规定,cgi脚本输出的开头应该是http header。...cgi脚本的stdout首先要交给apache, apache会对stdout进行一些处理。...之后需要人为地按照这个分隔线来区分各个段的内容, 并且还要解析Content-Disposition的内容。 五、日志输出 apache有日志功能,我们的cgi脚本能输出到apache的日志中?
服务器为80端口 2. apache 的 conf 中 ServerName 设置正确 3. HTTP/1.1 协议规范 不同点: 1...._SERVER["SERVER_NAME"] 默认情况下直接输出 apache 的配置文件 httpd.conf 中的 ServerName 值。 2....$_SERVER['PHP_SELF'] //正在执行脚本的文件名 $_SERVER['argv'] //传递给该脚本的参数。 ...$_SERVER['argc'] //传递给程序的命令行参数的个数。 $_SERVER['GATEWAY_INTERFACE'] //CGI 规范的版本。 ...'] //访问页面时的请求方法 $_SERVER['QUERY_STRING'] //查询(query)的字符串。
比如送入数据库、判断输入的信息是否合法等。 主流的CGI程序用Perl编写,Perl是一款强大的脚本语言,不过我这里不太懂,我也不去比较某两个语言间的优劣。...看到那个“cgi-bin”了吗,这是默认的cgi程序目录。当然,我们也可以手动设置其位置:用记事本打开conf/httpd.conf,这是Apache的配置文件。...; 当然也可以用C++的cout来代替printf输出。先别急着编译,我们先在工程上点右键,选择属性: ? 在配置设置-常规中,更改输出目录为cgi-bin下。...(也包括windowsAPI) 比如,用户填写好了注册表单,将信息传递给我的CGI程序,我就可以调用ODBC的函数,连接数据库,将信息写入数据库。...后的所有内容:getenv("QUERY_STRING")) 关于这个函数的所有用法我放在附件里,下载可查。
来加载php5_module,就是把php作为apache的一个子模块来运行。...被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程池) 所以,以上的apache调用php执行的过程如下: apache -> httpd -> php5_module -> sapi...URL、查询字符串、POST数据、HTTP header都会有。所以,CGI就是规定要传哪些数据,以什么样的格式传递给后方处理这个请求的协议。也就是说,CGI就是专门用来和 web 服务器打交道的。...(CGI程序和FastCGI程序,可以理解成遵循CGI协议和FastCGI协议编写的程序) FastCGI的工作原理: FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程...这种方式可以让HTTP服务器专一地处理静态请求,或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。 ?
来加载php5_module,就是把php作为apache的一个子模块来运行。...被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程池) 所以,以上的apache调用php执行的过程如下: apache -> httpd -> php5_module -> sapi ...URL、查询字符串、POST数据、HTTP header都会有。所以,CGI就是规定要传哪些数据,以什么样的格式传递给后方处理这个请求的协议。也就是说,CGI就是专门用来和 web 服务器打交道的。...(CGI程序和FastCGI程序,可以理解成遵循CGI协议和FastCGI协议编写的程序) FastCGI的工作原理: FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程...这种方式可以让HTTP服务器专一地处理静态请求,或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。
$_SERVER['PHP_SELF']//正在执行脚本的文件名 $_SERVER['argv'] //传递给该脚本的参数。 ...$_SERVER['argc'] //传递给程序的命令行参数的个数。 $_SERVER['GATEWAY_INTERFACE']//CGI 规范的版本。 ...']//访问页面时的请求方法 $_SERVER['QUERY_STRING'] //查询(query)的字符串。 .../包含服务器版本和虚拟主机名的字符串。 ...$_SERVER['PATH_TRANSLATED'] //当前脚本所在文件系统(不是文档根目录)的基本路径。 $_SERVER['SCRIPT_NAME'] //包含当前脚本的路径。
如果get发送的请求字符串中不包含”=”,那么Apache就会把请求传到命令行作为cgi的参数。...但这会导致恶意请求就可以将命令行参数传递给php,如果直接处理传参,那么会影响到以独立脚本方式运行的PHP脚本。所以只有当开头是-的时候(跳过所有空白符号)才阻止传递参数。...> Action application/x-httpd-php-cgi "/php-cgi/php-cgi.exe" 上面这些配置处理的都是一个类似的场景,就是apache...结合上面的特性,你可以通过传%ad来传入一个-,这样在-之后的部分就会成为php-cgi的参数,构成参数注入。...将PHP的执行程序暴露在外 - XAMPP默认配置 这个场景要特别一些,相比直接把PHP的二进制直接放在web目录下,可能更常见的还是xampp的默认配置。