KCGI - C / C ++的最小CGI和FastCGI库

2021-06-21 15:39:22

KCGI是用于C / C ++ Web应用程序的开源CGI和FastCGI库。它是最小,安全和可悲的。

要启动,请安装库。然后阅读部署和使用指南。使用GitHub Tracker进行问题或评论,或查找联系信息直接联系。

#include< sys / types.h> / * size_t,ssize_t * / #include< stdarg.h> / * va_list * / #include< stddef.h> / * null * / #include< stdint.h> / * int64_t * / #include< kcgi.h> int main(void){struct kreq r; const char * page ="索引&#34 ;; if(khttp_parse(& r,null,0,&页面,1,0)!= kcgi_ok)返回1; khttp_head(& r,kresps [kresp_status],"%s",khttps [khttp_200]); khttp_head(& r,kresps [kresp_content_type],"%s",Kmimetypes [kmime_text_plain]); khttp_body(& r); khttp_puts(& r,"您好,世界!"); khttp_free(& r);返回0;}

#include< sys / types.h> / * size_t,ssize_t * / #include< stdarg.h> / * va_list * / #include< stddef.h> / * null * / #include< stdint.h> / * int64_t * / #include< kcgi.h> int main(void){struct kreq r; const char * page ="索引&#34 ;; / * *解析HTTP环境。 *我们只知道一个页面,"索引",它也是*如果没有提供默认页面。 *(我们不要验证任何输入字段。)* / if(khttp_parse(& r,null,0,&页面,1,0)!= kcgi_ok)返回1; / * *通常,这里是我' d在方法(方法变量中定义的选项等)开关,然后切换请求*页面(页面变量)。 *但对于简洁的' sake,只是输出响应:http 200. * / khttp_head(& r,kresps [kresp_status],"%s",khttps [khttp_200]); / * *将内容类型单方面显示为文本/平原。 *通常会从r.mime设置。 * / khttp_head(& r,kresps [kresp_content_type],"%s",kmimetypes [kmime_text_plain]); / *没有更多HTTP标头:启动HTTP文档正文。 * / khttp_body(& r); / * *我们可以在此处放置以下内容:JSON,HTML等*通常我们' d开关我们的MIME类型。 *但是,我们'重新将文字字符串放在那样... * / khttp_puts(& r,"您好,世界!"); / *刷新文件和免费资源。 * / khttp_free(& r);返回0;}

对于更完整的示例,请参阅示例,或跳转到文档部分。 (想要一个c ++版本?请参阅samplepp.cc。)

KCGI支持许多功能:自动压缩,处理所有HTTP输入操作(查询字符串,Cookie,Page Bodies,MultiPart),具有验证,身份验证,可配置输出缓存,请求调试等。其最强大的差异特征是使用沙箱和工艺分离来处理不受信任的输入路径。

首先,检查KCGI ISN' T已经打包为您的系统,例如OpenBSD,FreeBSD,Arch Linux等。 (如果是,请确保它' s最新!)如果是这样,请使用该系统进行安装。

如果没有,你' ll需要一个现代的Unix系统。迄今为止,KCGI已经在GNU / Linux机器(Musl和Glibc),BSD(OpenBSD,NetBSD,FreeBSD),Solaris,Omnios和Mac OS X上(仅Mojave和Newer!)上进行了建立和运行,在I386,AMD64,PowerPC上,arm64和sparc64。它已在Apache,Nginx和OpenBSD中部署Httpdsd' s httpd(8)(后者在Fastcgi上的后两种,并通过Slowcgi包装器)。唯一的硬依赖性是bsd make(在Linux上bake)。如果您'重新运行回归测试(请参阅测试),' ll需要libcurl。

下载kcgi.tgz并使用kcgi.tgz.sha512验证存档。配置./configure,用make(或在Linux系统上Bake)编译。最后,使用make安装安装软件。可选地在配置之前覆盖具有configure.local文件的默认路径(请参阅配置脚本以获取详细信息)。

如果KCGI编译,请发送我的config.log文件和失败编译的输出。以及所有操作系统的信息当然。

要在版本之间运行Bleed-Edge代码,CVS存储库在GitHub上镜像。可以在该页面上找到跟踪存储库版本的安装说明。

默认情况下部署了默认的Web服务器,例如默认OpenBSD服务器,部署在Chroot(2)中。如果是这种情况,你' ll需要静态链接你的二进制文件。

FastCGI应用程序可以由Web服务器直接启动(由Apache流行)或者在外部给定套接字和kfcgi(8)(此方法是OpenBSD的规范状态,并为Httpd(8)建议采取的安全预防措施通过包装)。

以KCGI(3)开始的KCGI编程是规范文档源。以下是所有联机的列表:

如果它更容易以示例开始,则可以使用KCGI-Framework作为启动项目的初始样板。以下是系统的介绍性材料。

Dzonsons,Kristaps。 BCHS Web应用中基于角色的访问控制。 AsiaBSDCON,东京,日本,2018年3月的常见诉讼程序。(幻灯片,视频。)纸。)

Dzonsons,Kristaps。安全BSD Web应用程序在C:实用策略中。 AsiaBSDCON,东京,日本,2017年3月份的诉讼程序。(幻灯片。)

Dzonsons,Kristaps。安全BSD Web应用程序开发在C. AsiaBSDCON,东京,日本,2016年3月。(幻灯片。)

Dzonsons,Kristaps。 kcgi:在2015年3月,在日本东京东京亚洲亚洲商会中保护CGI应用。(幻灯片,纸张)

大部分KCGI' S CGI处理位于KHTTP_PARSE(3)中,它完全解析了HTTP请求。应用程序开发人员必须在所有其他之前调用此功能。对于FastCGI,此函数在KHTTP_FCGI_INIT(3)之间拆分,初始化上下文;和khttp_fcgi_parse(3),它收到了新的解析请求。在任何一种情况下,请求必须由KHTTP_FREE(3)释放。

所有功能都将解析和验证在沙箱的子程过程中分析和验证。 Sandboxes限制了一个过程可用的环境,因此解析过程中的可利用错误(或使用第三方库的验证)无法触摸系统环境。通过套接字将此解析数据返回给父进程。在下文中,HTTP解析器和输入验证器管理单个HTTP请求,而连接委托器接受新的HTTP请求并通过它们。

这种沙盒的方法,不受信任的解析过程遵循openssh,需要针对每个操作系统的特殊处理:

这需要一个相当新的内核(≥linux3.5)。它由Setrlimit(2)限制补充。暂时,此功能仅适用于X86,X86_64和ARM架构。如果您使用另一个'请将您的uname -m发送给我,如果您知道它,则在/usr/include/linux/audit.h中找到的正确的upit_arch_xxx。

这将使用Sandboxing型材,以便在Mac OS X Leopard中提供的纯计算。这是通过SetRlimit(2)的资源限制的补充。

使用FreeBSD 10及更高版本的功能设施。这由资源限制补充了setrlimit(2)。

由于验证发生在沙箱内,必须采取特别小心,验证例程不访问环境(例如,通过打开文件,网络连接等),因为孩子可能被沙箱设施突然杀死。 (并非所有沙箱都这样做。)如果需要,可以在解析验证序列后进行这种验证。

连接委托器类似但具有不同的沙箱规则,因为它必须管理打开的套接字连接并响应新请求。

KCGI随着使用制作退回而执行的全自动测试框架提供。要测试自己的应用程序,请使用KCGiregress(3)库。此框架充当迷你网络服务器,在本地端口上侦听本地端口,将HTTP文档转换为最小的CGI请求,并将请求传递给KCGI CGI客户端。对于内部测试,测试请求由libcurl构建。绑定本地端口是固定的:如果您计划运行回归套件,则可能需要调整其访问端口。

存在另一个测试框架,以用于美国模糊套。要使用此功能,您' ll需要使用您的编译器编译Make AFL目标,例如,制作清洁,然后制作AFL CC = AFL-GCC。然后使用所提供的测试用例(和第一个字典)在AFL-MultiPart,AFL-Plain和AFL-Urlencoded二进制文件上运行AFL-Fuzz工具。

安全性来自价格 - 但不是僵硬的价格。通过设计,KCGI以三种方式引入开销:首先,产卵为孩子处理不受信任的网络数据;其次,制定沙箱框架;第三,将解析对返回父环境。在运行CGI脚本的情况下,KCGI性能绑定到操作系统' S产卵和获取进程的能力。对于FastCGI,瓶颈成为数据的转移。在下图中,我图表kcgi对基线web服务器性能的响应性。

这示出了通过AB(1)测量的统计学大量的页面请求的经验累积分布,其具有10个并发请求。 CGI线是源中包括的CGI样本; FastCGI线是FastCGI样本; CGI(简单)只会发出200个HTTP状态和Hello,世界;静态是Web服务器上的一个小静态文件。操作系统是Mac OS X 10.7.5空气笔记本电脑(1.86GHz Intel Core 2 Duo,2 GB RAM),其中Apache。 FastCGI服务器使用Kfcgi(8)默认值启动。