首页 时政热点 科技头条 智能AI 安全攻防 数码硬件 开发者生态 归档 标签 关于

网弦 (1997)

2026-07-16 1 阅读 约4分钟阅读 signa11
分享:
字号:
Netstrings D. J. Bernstein, djb@pobox.com 19970201 1. 简介 netstring 是字符串的自定界编码。网络字符串非常容易生成和解析。任何字符串都可以编码为网络字符串;对长度或允许的字节没有限制。 netstring 的另一个优点是它预先声明了字符串大小。因此,应用程序可以提前检查是否有足够的空间来存储整个字符串。 Netstrings 可用作可靠网络协议的基本构建块。实际上,大多数高级协议都传输字符串序列;这些字符串可以被编码为网络字符串,然后连接成字符序列,然后可以通过可靠的流协议(例如 TCP)进行传输。请注意,netstrings 可以递归使用。对字符串序列进行编码的结果是单个字符串。一系列这些编码字符串又可以被编码成单个字符串。等等。在本文档中,8 位字节的字符串可以用两种不同的形式编写:作为尖括号之间的一系列十六进制数字,或作为双引号之间的 ASCII 字符序列。例如,<68 65 6c 6c 6f 20 77 6f 72 6c 64 21>是长度为12的字符串;它与字符串“hello world!”相同。尽管本文档将注意力限制在 8 位字节的字符串上,但 netstrings 可以与任何 6 位或更大的字符集一起使用。 2. 定义 任何 8 位字节的字符串都可以编码为 [len]":"[string]","。这里 [string] 是字符串,[len] 是一个非空的 ASCII 数字序列,给出了 [string] 的十进制长度。 ASCII 数字为 <30> 表示 0,<31> 表示 1,依此类推,直到 <39> 表示 9。 [len] 前面禁止使用额外的零:当 [string] 为空时,[len] 恰好以 <30> 开头。例如,字符串“hello world!”编码为 <31 32 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 2c>,即“12:hello world!,”。空字符串被编码为“0:,”。 [len]":"[string]"," 称为网络字符串。 [string] 称为netstring 的解释。 3. 示例代码 以下 C 代码以长度为 len 的缓冲区 buf 开头,并将其打印为网络字符串。 if (printf("%lu:",len) < 0) barf(); if (fwrite(buf,1,len,stdout) < len) barf(); if (putchar(',') < 0) barf();以下 C 代码读取 netstring 并将其解码到动态分配的长度为 len 的缓冲区 buf 中。 if (scanf("%9lu",&len) < 1) barf(); /* >999999999 字节是坏的 */ if (getchar() != ':') barf(); buf = malloc(len + 1); /* malloc(0) 不可移植 */ if (!buf) barf(); if (fread(buf,1,len,stdin) < len) barf(); if (getchar() != ',') barf();这两个代码片段都假设本地字符集是 ASCII,并且相关的 stdio 流是二进制模式。 4. 安全考虑 著名的 Finger 安全漏洞可能要归咎于 Finger 使用 CRLF 编码。在该编码中,每个字符串都以 CRLF 结尾。这种编码有几个问题。最重要的是,它没有提前声明字符串大小。这意味着正确的 CRLF 解析器必须准备好在读取字符串时请求越来越多的内存。就 Finger 而言,一个懒惰的实现者发现这太麻烦了;相反,他只是声明了一个固定大小的缓冲区并使用了 C 的 gets() 函数。剩下的就是历史了。相反,如上面的示例代码所示,处理网络字符串非常容易,而不会面临缓冲区溢出的风险。因此,网络字符串的广泛使用可以提高网络安全性。
这篇文章对您有帮助吗?

订阅66必读

每日精选科技资讯,直达你的邮箱