展示HN:一个纯ARM64汇编语言的网络服务器,现在在Linux上支持CGI
ymawky -- 用ARM汇编语言编写的网络服务器 这是ymawky(yuh maw kee),一个完全用ARM64汇编语言编写的网络服务器。ymawky是一个仅使用系统调用,不使用libc的按连接分叉的网络服务器,手工编写。虽然最初为MacOS开发,但这个分支是一个功能齐全的Linux移植版本。构建 构建命令 要编译一个剥离的二进制文件,运行make 。要编译一个带调试符号的二进制文件,运行make debug 先决条件 ymawky需要gcc和binutils来汇编。确保在ymawky可执行文件旁边有一个www/目录。那是ymawky搜索文件的文档根。用空文件名的GET请求( GET / )将会搜索www/index.html,因此你可能想确保那里也有一个index.html。ymawky将在客户端请求结果错误时尝试提供静态错误页面,例如404。它在err/(code).html中搜索页面,因此确保err/与ymawky和www/并存。请参阅配置以修改默认文件和文档根。 运行 ./ymawky 在127.0.0.1:8080上启动网络服务器。 ./ymawky [port] 在127.0.0.1:[port]上启动网络服务器 ./ymawky [literally-any-character-other-than-0-9] 在127.0.0.1:8080以调试模式启动网络服务器。调试模式禁用分叉,使ymawky只处理一个请求。 (我需要这样做,因为lldb不让我调试子进程,唉。)不幸的是,尽管支持自定义端口,但不支持自定义地址。现在,ymawky只能在127.0.0.1上运行。这完全是因为我还没有实现它——但如果你愿意将其视为安全功能,那么我想这可能是故意的。要查看ymawky的实际运行,先用./ymawky [port]开始运行ymawky。然后打开你选择的网页浏览器(或使用curl),访问127.0.0.1:8080/或127.0.0.1:8080/pretty/index.html。沉浸在汇编的温暖中。它能做什么? ymawky是一个静态文件动态网络服务器。它不支持在飞行中生成内容的服务器端代码和更高级的URL解析,例如/search?query=term,借助CGI脚本。 支持的HTTP方法:GET、PUT、DELETE、OPTIONS、HEAD、POST,通过CGI脚本基本保护免受类似slowloris的拒绝服务攻击解码%十六进制编码,例如,%20解码为文件名中的空格,%61解码为智能路径遍历检测和预防。阻止 .. 遍历路径,同时不禁止多重句点作为文件的一部分: GET /../../../etc/passwd -> 403 Forbidden GET /ohwell...txt -> 200 OK GET /../src/ymawky.S -> 403 Forbidden GET /hehe..txt -> 200 OK 自动在请求的文件前加上www/。 GET /index.html将检索www/index.html 空GET /请求默认为GET www/index.html PUT请求支持上传最大为1GiB的文件,虽然可以配置为更大的文件。PUT是原子性的,因为写入临时文件然后重命名,允许并发PUT请求而不留下部分写入的文件。 PUT请求中的Content-Length解析和验证。 MIME类型检测,在响应头中给出相应的Content-Type。 接受范围:bytes=范围在GET请求中,支持完整范围bytes=X-N,后缀范围bytes=-N,和开放范围bytes=X-。视频拖动得到了很好的支持。 基本HTTP版本解析。请求需要指定HTTP/1.1或HTTP/1.0,如果请求HTTP/1.1,头中需要存在Host:字段。目前,ymawky对Host没有任何操作,但根据RFC 9112第3.2节,头必须发送。为错误代码提供自定义HTML页面,例如404或500。在err/目录中查找示例。如果请求的资源是一个目录,将列出目录中的所有文件和子目录。请注意,这不包括www/(或你的文档根): GET /将始终搜索index.html(如果未给出文件)。 支持CGI脚本。所有CGI脚本必须位于CGI_DIR(在config.S中定义,默认为(docroot)/cgi-bin/)。支持查询字符串( /cgi-bin/ratbook?q=do+you+like+rats&a=yes! )ymawky解析CGI脚本的头并将其转发给客户端响应。执行一些最小的CGI合规性:所有CGI脚本必须以头部开始其响应,如果响应还有主体,头部必须包含Content-Length字段。HTTP响应代码由CGI脚本的Status:头部字段决定,因此脚本可以发送自己的404或500等等。如果没有提供Status,则使用默认的200 OK。 “安全性” 这是一个完全手工用ARM64汇编语言编写的网络服务器作为一项有趣的项目。它可能有很多我不知道的漏洞。但是,我尽力让它更安全。以下是ymawky采取的一些安全预防措施。拒绝路径>= PATH_MAX (4096字节)拒绝任何包含路径遍历的路径 -- /../.. 拒绝任何不包含路径的请求,不超过16字节限制。局限于www/。任何请求的路径都在其前面加上www/拒绝任何包含符号链接的路径。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡