我想确保我传递到行中的任何字符串wpa-ssid "abc"
都/etc/network/interfaces
不会被用来打破配置。
我在手册中所能找到的就是\
可以在一行末尾使用以继续下一行。
\"
但是在一条线的中间呢?
我担心的是 SSID 之类的
A"
up rm -rf /\
是否有任何通用编码可用于 SSID 字段中的任意字符?
答案1
在 Debian /etc/network/interfaces
(或使用 Debian 的 ifupdown 实用程序的任何其他发行版)中,反斜杠换行序列被删除,并且反斜杠在其他地方并不特殊。双引号字符也不特殊。如果该字符是(非连续)行上的第一个非空白字符,则该字符#
开始注释。空字节被视为换行符(我认为解析器使用 C 字符串并且对空字节没有特殊处理,因此它们可能会导致额外的恶作剧)。
配置行采用选项名称后跟值的形式,以空格分隔。前导和尾随空格将被忽略。一些内置选项进一步将行解析为单词; options to 的值iface
总是运行到行尾。
例如,该行
wpa-ssid "a b" "cd"
将选项设置wpa-ssid
为 12 个字符的字符串"a b" "cd"
(保留内部空格)。
WPA Supplicant 的 ifupdown 脚本去掉配置字符串开头和结尾的双引号wpa-ssid
,上面的行相当于wpa-ssid a b" "cd
.这样,您就可以在 SSID 中包含前导和尾随空格。
我在 WPA 请求者 ifupdown 脚本中找不到引用问题,因此看起来 ifupdown 生成的任何内容都是安全的。
因此,您可以允许将任何字符串作为 SSID 注入到 中/etc/network/interfaces
,前提是它不包含任何换行符或空字节。在字符串两边添加双引号(如果不这样做,带有前导或尾随空格、以 结尾\
、或以 开头或结尾的SSID"
将被破坏)。
答案2
此 SO 问答题为:是否有一个标准来定义什么是有效的 SSID 和密码?回答您的一些问题。
摘抄
802.11-2007 规范第 7.3.2.1 节(http://standards.ieee.org/getieee802/download/802.11-2007.pdf) 定义 SSID。
有效的 SSID 是 0-32 个八位位组,具有任意内容。长度为 0 的 SSID 表示通配符 SSID(例如在探测请求帧中)。
没有与 SSID 关联的字符集 - 32 字节的 NUL 字节字符串是有效的 SSID。
这意味着:
- 操作通用 SSID 时(strcpy() 等),切勿使用普通字符串函数。
- 例如,在将 SSID 记录到磁盘时,您不应假设 SSID 是可打印的
对于SO问题的答案也有这样的评论:
有标准的更新版本(http://standards.ieee.org/getieee802/download/802.11-2012.pdf),它定义了
SSIDEncoding
字段。它可以是UNSPECIFIED
(对于任意数据)或UTF8
。
因此,我会参考最新的标准作为指导,并确保您可以根据该标准处理合法的事情。
还有什么?
此外,我可能倾向于通过使用某种形式的 URL 编码函数(显然可以与 SSID 一起使用的函数)规范用户的输入来保护自己,或者简单地删除非法字符,并且在将这些字符串写入此文件之前根本不允许它们使用。
奇怪的人物?
我能发现的与该文件相关的奇怪/特殊字符的唯一问题interfaces
是针对 debian-installer 提交的这些类型的错误。
debian-installer 询问我的无线网络信息并成功使用它来无线连接到网络。它还将我的无线网络信息写入/etc/network/interfaces。然而,我输入的 WPA 密钥至少包含一个特殊字符,并且 debian-installer 没有转义或引用 /etc/network/interfaces 中的特殊字符。结果是,重新启动时,系统在启动过程中挂起很长时间,因为它尝试(未成功)重新连接到无线网络。我通过简单地引用 /etc/network/interfaces 中列出的 WPA 密钥来解决该问题。如果密钥包含特殊字符,这应该会自动发生。
此外还存在这些错误,其中一个与 SSID 内的空格有关,其他与密码相关:
在这两种情况下,用双引号引起来的字符串似乎足以保护两者的值。
其他示例
官方文档
仔细阅读官方文档,我在这里发现了这一点:
官方文档展示了这个例子:
ap_scan=2
network={
ssid="test adhoc"
mode=1
frequency=2412
proto=WPA
key_mgmt=WPA-NONE
pairwise=NONE
group=TKIP
psk="passphrase"
}
因此,只要正确引用空格,似乎就允许使用空格。还有这个示例解释了如何向该工具提供带有空格的 SSID iwconfig
:
添加您要创建/加入的网络的名称 (ssid)。如果名称中有空格,请使用单引号。
$ sudo iwconfig eth1 essid 'name'
网络聚合器
我发现这个例子看起来像是 Debian,所以这个例子可能适合你的情况,但很难确定。我提出它只是因为它显示了一个示例,说明我希望如何公开 URI 编码方法以防止非法字符。
摘抄
示例 4 “ESSID 中的空格”,广播 essid 'Hopstock Gjestenett',使用 WPA 密钥 uiopzxcv
请避免 ESSID 中出现空格。在这种情况下,我们使用encodeURI('Hopstock Gjestenett')来解决,以获得以下启动配方:
wpa-ssid=Hopstock%20Gjestenett wpa-psk=uiopzxcv
因此,您也许可以使用 .SSID 对 SSID 中显示的空格进行编码%20
。
SSID
进一步深入挖掘后,我在维基百科页面上找到了这条评论服务集(802.11网络)。
每个 BSS 或 ESS 由服务集标识符 (SSID) 标识 - 一个 1 到 32 字节的字符串。这通常是人类可读的字符串,因此通常称为“网络名称”。6在IBSS中,SSID由启动网络的客户端设备选择,并且网络成员的所有设备以伪随机顺序执行SSID的广播。
此评论得到 Blackhat EU 2013 的演示文稿的支持,标题为:使用恶意服务集标识符 (SSID) 的实际利用。
摘抄
- 对于 SSID 中可以使用哪些字符没有明确的限制 (IEEE Std 802.11™-2012)
- 基于产品的一些限制
- 一些字符限制(仅限 ASCII)
- 统一码
因此从技术上讲,SSID 中允许使用任何字符,不同的实现(例如 Windows XP、Windows 7)与各种 Linux 版本允许/禁止 SSID 中的字符子集。