当年在提交某个漏洞的时候,某src看了漏洞说可能是cgi除了问题。当年也不搞web安全,如今接触web安全也有段时日,就看看CGI到底是个啥。
php有4种运行模式,分别是cgi、fast-cgi、cli和服务器模块模式。
一、 CGI模式
CGI(Common Gateway Interface)通用网关接口,在此模式下,CGI相当于前端网页和后端php脚本执行环境的桥梁。
怎么理解这桥梁:我们拿WebServer是apache、后端是php来举例。假设用户请求:http://www.test.com/a.php,apache作为webserver的工作就是如何解析http协议。但是这里要执行后端脚本,Apache自身并不认识php啊,所以Apache需要请求php作为运行环境来执行用户的请求。这时候,具体怎么来请求php程序来执行脚本呢?php又如何把结果返回个Apache?这就是运行模式的问题。我们看一个图。
那么,在此运行模式下,存在一个问题,就是每Apache每次收一个请求的时候,就去调用php程序,当php执行完脚本之后,php进程自动结束。这时候,如果段时间类来了多个请求,php进程会被启动多次,即系统中存在多个php进程,并且启动过程比较慢,这样,对服务器性能有很大影响。即fork-and-execute。
二、fast-cgi模式
从大web和后端执行环境的机理上,fast-cgi和cgi是一样的。不同之处就体现在怎么解决cgi的fork-and-execute执行慢的问题。
不同之处是,在Apache启动后,apache会自动启动fast-cgi进程管理器。fast-cgi管理器启动之后,然后启动多个解释器子进程php-cgi,这种模式有点线程池的意思。
当一个req来临时,Apache会通知fast-cgi管理器选择一个php-cgi子进程来执行对应的脚本。php-cgi执行完php脚本之后,会把结果反馈给apache。这样一次req-res过程就完成。
总结这种模式,相当于php不在是接受了req之后在被启动,而是提前通过fast-cgi模式启动了,只是通过进程间通信机制来等来自Apache的任务请求,并且通过子进程的形式来处理并发请求,效率更高。示意图如下:
突发奇想,这种运行模式和Android上的App向系统服务发请求的过程有一点相似。
三、cli模式
这个指的是php在命令行中运行的模式。
四、Apache模块模式
Apach常常和php搭配形成LAMP。Apache把php作为一个模块集成在Apache中,就是模块模式。工作原理如下图: