开发者生态
morning
Show HN:在汇编中构建一个 Web 服务器来赋予我的生活(缺乏)意义
2026-05-10
1 阅读
imtomt
ymawky -- ARM 汇编中的 Web 服务器 这是 ymawky (yuh maw kee),一个完全用 ARM64 汇编编写的 Web 服务器。 ymawky 是一个纯系统调用、无 libc、手工编写的每连接 fork 的 Web 服务器。虽然它是为 MacOS 开发的,但我已尝试使其尽可能便携 - 然而,您可能仍然需要进行一些(希望是较小的)重大调整才能使其在 Linux/其他 Unix 系统上运行。有关更多详细信息,请参阅实施说明。构建需要 Xcode 命令行工具。使用 xcode-select --install 安装。 ymawky 仅在苹果硅 (arm64) 上运行。运行 make 来构建。确保 ymawky 可执行文件旁边有一个 www/ 目录。这是 ymawky 搜索文件的文档根目录。使用空文件名 ( GET / ) 的 GET 将搜索 www/index.html ,因此您可能需要确保也有一个 index.html 。当客户端的请求导致错误(例如 404)时,ymawky 将尝试提供静态错误页面。它在 err/(code).html 中搜索的页面,因此请确保 err/ 与 ymawky 和 www/ 一起存在。请参阅配置来修改默认文件和文档根目录。运行 ./ymawky 以开始在 127.0.0.1:8080 上运行 Web 服务器。 ./ymawky [port] 在 127.0.0.1:[port] 上开始运行 Web 服务器 ./ymawky [literally-any-character-other-than-0-9] 在调试模式下在 127.0.0.1:8080 上开始运行 Web 服务器。调试模式禁用分叉,并使 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 是一个静态文件 Web 服务器。它不支持服务器端代码即时生成内容,或更高级的 URL 解析,例如 /search?query=term 。但这并不是说它不起作用。支持的 HTTP 方法: GET PUT DELETE OPTIONS HEAD 针对类似 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 请求,而不会留下部分写入的文件 Content-Length:PUT 请求中的解析和验证 MIME 类型检测,在响应标头中提供具有相应 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 节,必须发送标头 为错误代码(例如 404 或 500)提供自定义 HTML 页面。查看 err/ 目录中的示例 如果请求的资源是一个目录,则列出该目录中的所有文件和子目录。请注意,这不包括 www/(或任何您的文档根目录):如果未给出文件,则 GET / 将始终搜索 index.html。 “安全” 这是一个完全用 ARM64 程序集手工编写的 Web 服务器,作为一个有趣的项目。它可能有很多我不知道的漏洞。不过,我确实尽力让它更安全。以下是 ymawky 采取的一些安全预防措施。拒绝路径 >= PATH_MAX (4096 字节) 拒绝任何包含路径遍历的路径 -- /../.. 拒绝任何不包含 16 字节以内路径的请求 仅限于 www/ 。任何请求的路径都会在其前面添加 www/ 拒绝任何包含符号链接的路径,并将 O_NOFOLLOW_ANY PUT 写入临时文件 www/.ymawky_tmp_ 。成功接收整个文件后,该临时文件将被重命名为请求的文件名。这可以防止部分或损坏的 PUT 请求覆盖现有文件。拒绝任何路径以 www/.ymawky_tmp_ 开头的请求。这可以防止某人 GET 临时文件,并防止某人发送 PUT /.ymawky_tmp_4533 或其他内容。必须在 10 秒内接收数据。如果速度较慢,连接将会中断