CGI和CGIC

CGI 全称为 Common Gateway Interface,是一种标准协议,定义了Web服务器与外部应用程序 (通常是执行脚本或程序)之间的交互方式。其主要作用是在Web服务器和生成动态内容的应用程序之间传递信息。

当用户在Web浏览器中请求一个CGI程序时,Web服务器会将请求传递给相应的CGI脚本。脚本执行完成后,将结果返回给服务器,服务器再将结果传给用户的浏览器。CGI脚本可以用多种编程语言编写,如Perl、Python、C、或者Shell脚本。

CGI的特点:

对http浏览器来说,cgi脚本文件只是一个页面文件

CGI可以使用任意编程语言编写,只要这个语言能把数据输出到标准输出即可

CGI是一个标准,它规定了系统所必须具备的环境变量。

CGI环境变量

变量名 描述
CONTENT_TYPE 内容的数据类型。当客户端向服务器发送附加内容时使用。例如,文件上传等功能。
CONTENT_LENGTH 查询的信息长度。只对 POST 请求可用。
HTTP_COOKIE 以键 & 值对的形式返回设置的 cookies。
HTTP_USER_AGENT 用户代理请求标头字段,递交用户发起请求的有关信息,包含了浏览器的名称、版本和其他平台性的附加信息。
PATH_INFO CGI 脚本的路径。
QUERY_STRING 通过 GET 方法发送请求时的 URL 编码信息,包含 URL 中问号后面的参数。
REMOTE_ADDR 发出请求的远程主机的 IP 地址。这在日志记录和认证时是非常有用的。
REMOTE_HOST 发出请求的主机的完全限定名称。如果此信息不可用,则可以用 REMOTE_ADDR 来获取 IP 地址。
REQUEST_METHOD 用于发出请求的方法。最常见的方法是 GET 和 POST。
SCRIPT_FILENAME CGI 脚本的完整路径。
SCRIPT_NAME CGI 脚本的名称。
SERVER_NAME 服务器的主机名或 IP 地址。
SERVER_SOFTWARE 服务器上运行的软件的名称和版本。

form表单

<form action="/cgi-bin/login.cgi" method="get">

<input type="text" name="username" placeholder="请输入用户名"><br>

<input type="password" name="password" placeholder="请输入密码"><br>

<input type="submit" value="Login">

</form>

action="/cgi-bin/login.cgi" : 这个属性指定了当用户提交表单时,表单数据将被发送到服务器上的 /cgi-bin/login.cgi 文件进行处理。

method="get": 这个属性指定了表单数据的提交方式。

type="submit": 定义了一个提交按钮,当用户点击这个按钮时,表单数据将被发送到服务器。

CGI程序处理form表单

#include <stdio.h>

#include <stdlib.h>

int main(void) {

char *data = getenv("QUERY_STRING");

char username[50], password[50];

//%49[^&]:表示从当前位置读取最多 49 个字符,直到遇到 &

sscanf(data, "username=%49[^&]&password=%49s", username, password);

//由于告诉浏览器,将发送html的文本页面

printf("Content-Type: text/html\n\n");

//登录成功以后的显示内容

printf("<h1>Login successful! Welcome, %s!</h1>", username);

return 0;

}

运行前需要让http服务器支持CGI功能:

sudo a2enmod cgi

sudo systemctl restart apache2

编译

gcc login.c -o login.cgi -Wall

把编写好的应用程序复制到/usr/lib/cgi-bin/目录下:

sudo cp login.cgi /usr/lib/cgi-bin/

打开浏览器进行测试

CGI编程当中的常见错误的处理与调试

在CGI编程中,处理和调试常见错误是开发过程中非常重要的环节。以下是一些关键技术和步骤,可以帮助你更有效地处理和调试CGI程序中的错误:

  1. 检查服务器日志:

    查看Web服务器的错误日志(如Apache的error.log),可以找到详细的错误信息。日志文件通常能提供具体的错误描述和发生错误的行号。

  2. 正确设置HTTP头:

    确保输出正确的HTTP头。例如,输出内容为HTML时,应该以Content-type: text/html\r\n\r\n开头。如果头信息错误,浏览器可能无法正确解析响应内容。

  3. 使用标准错误输出:

    将调试信息输出到标准错误(stderr),这样它会被记录到服务器的错误日志中,而不干扰程序的正常输出。

  4. 权限问题:

    检查CGI脚本的文件和目录权限。确保Web服务器有足够的权限运行CGI脚本。

  5. 本地测试:

    在部署到生产环境之前,先在本地环境中运行和测试CGI脚本,确保其在独立条件下正常运行。

CGIC 是一个用于开发 CGI(Common Gateway Interface)程序的 C 库,CGIC 库简化了 CGI 程序的开发,处理诸如表单数据解析和环境变量管理等常见任务。

CGIC 库的功能和特点:

  1. GET 和 POST 解析:CGIC 可以自动解析从客户端发送的 GET 和 POST 请求数据,并将数据存储为键值对,方便开发者获取和使用。

  2. 文件上传:支持处理多部分表单数据(multipart/form-data),使处理文件上传更为轻松。

  3. 错误处理:提供了一些机制来处理输入数据可能引起的错误,比如数据缺失或格式错误。

  4. 简化环境变量管理 :CGIC 提供了一些函数来获取常用的 CGI 环境变量,如 CONTENT_TYPEREQUEST_METHODQUERY_STRING 等。

  5. 跨平台支持:CGIC 是用标准 C 语言编写的,能够在多种操作系统上使用,如 Unix/Linux 和 Windows。

CGI存在的问题与解决方案

CGI(Common Gateway Interface)在Web开发中曾经是一种常用的技术,但随着现代Web开发技术的进步,它的一些问题也逐渐显露出来。以下是CGI存在的一些主要问题及其解决方案:

性能问题

问题:CGI每次处理请求时都会启动一个新的进程,这对于服务器来说开销非常大,尤其是在高并发环境下,容易导致性能下降。

解决方案 :使用持久连接技术,如FastCGISCGI,这些技术通过重用进程来处理多个请求,从而提高性能。

安全问题

问题:不安全的CGI脚本可能导致安全漏洞,比如缓冲区溢出和代码注入。

解决方案:编写安全的脚本,进行输入验证和参数化查询;使用现代Web框架,这些框架通常提供了更多内置的安全功能。

可扩展性问题

问题:由于CGI的性能限制,在大规模应用中难以扩展。

解决方案:使用更现代的Web应用架构,如采用反向代理、负载均衡,并结合使用Web应用服务器如Node.js、Django、Flask等。

维护性和开发效率问题

问题:CGI脚本通常直接用C或者Perl编写,代码复杂且不易维护。

解决方案 :采用现代编程语言和框架,如Python的Flask、JavaSpring等,它们提供了更高的开发效率和可维护性。

相关推荐
花落已飘5 个月前
使用lighttpd和开发板进行交互
c·rk3568·cgi
Robot_Yue2 年前
SQLite3 数据库学习(六):Qt 嵌入式 Web 服务器详解
c语言·数据库·学习·sqlite·apache·cgi
源文雨2 年前
OracleLinux9 安装 fcgiwrap 并添加 selinux 规则以在 nginx 调用
运维·nginx·oracle·centos·systemd·selinux·cgi