/ etc / network / interfaces中的转义字符


8

我想确保无论我传入行wpa-ssid "abc"中的任何字符串/etc/network/interfaces都不会被用于破坏配置。

我在手册中所能找到的就是\可以在一行的末尾继续下一行。

但是\"在一行中间呢?

我担心的是SSID之类的

A"
up rm -rf /\

是否有任何通用编码可用于SSID字段中的任意字符?

Answers:


5

在Debian /etc/network/interfaces(或使用Debian的ifupdown实用程序的任何其他发行版)中,反斜杠-换行符序列被删除,反斜杠在其他任何地方都不是特殊的。双引号字符也不是特殊的。#如果该字符是(非连续)行上的第一个非空白字符,则该字符开始注释。空字节被视为换行符(我认为-解析器使用C字符串,对空字节没有特殊处理,因此它们可能会引起其他麻烦。)

配置行采用选项名称形式,后跟一个值,以空格分隔。开头和结尾的空格将被忽略。一些内置选项进一步将行解析为单词;options的值iface始终运行到行尾。

例如,线

wpa-ssid  "a  b"  "cd"  

将选项wpa-ssid设置为12个字符的字符串"a  b"  "cd"(保留内部空格)。

WPA请求者的ifupdown脚本在wpa-ssid配置字符串的开头和结尾去除双引号,上面的行等效于wpa-ssid a  b"  "cd。这样,您可以在SSID中包含前导和尾随空格。

我在WPA请求者ifupdown脚本中找不到报价问题,因此ifupdown将产生的任何内容看起来都是安全的。

因此,您可以允许将任何字符串作为SSID注入/etc/network/interfaces,前提是它不包含任何换行符或空字节。在字符串周围添加双引号(如果不这样,则将对带有前导或尾随空格,或者以\,或以开头或结尾的SSID "进行修饰)。


其实我成功地尝试了wpa-ssid my ssid
hultqvist

@phq-要明确,您能够使用该行wpa-ssid=my ssid
slm

@slm不,其语法/etc/network/interfaces未使用=,我现在尝试过,但无法使用=
hultqvist

@phq-但您的意思是,您可以给它一个带空格的SSID吗?my ssid
slm

@slm是,带有空格的SSID一直有效
hultqvist

0

这样的SO Q&A标题为:是否有一个标准定义什么是有效的SSID和密码?回答您的一些问题。

摘抄

802.11-2007规范(http://standards.ieee.org/getieee802/download/802.11-2007.pdf)的7.3.2.1节定义了SSID。

有效的SSID是0-32个八位字节,内容任意。长度为0的SSID表示通配符SSID(例如,在探测请求帧中)。

没有与SSID关联的字符集-32字节的NUL字节字符串是有效的SSID。

这意味着:

  • 在处理通用SSID(strcpy()和好友)时,绝对不要使用普通的字符串函数。
  • 例如,在将其记录到磁盘时,您不应假定该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"
}

这样看来,只要正确引用,就允许使用空格。还有一个示例,说明如何为iwconfig工具提供带有空格的SSID :

为您要创建/加入的网络添加名称(ssid)。如果名称中有空格,请使用单引号。

   $ sudo iwconfig eth1 essid 'name'

网络融合

我发现了这个看起来很像Debian的例子,所以这个例子可能适合您的情况,但是很难确定。我之所以提出它,只是因为它显示了一个示例,说明了我期望如何公开URI编码方法以防止非法字符。

摘抄

示例4:“ ESSID中的空格”,使用WPA密钥uiopzxcv广播essid“ Hopstock Gjestenett”

请避免在ESSID中使用空格。在这种情况下,我们使用encodeURI('Hopstock Gjestenett')解决方法,以获取以下引导配方:

   wpa-ssid=Hopstock%20Gjestenett wpa-psk=uiopzxcv

因此,您可以使用来编码显示在SSID中的空格%20

SSID

深入研究,我从服务集(802.11网络)上的Wikipedia页面上找到了此注释。

每个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中的字符子集。

参考文献


1
您的答案没有到重点:可以使用什么转义/etc/network/interfaces
吉尔斯(Gilles)“所以,别再邪恶了”,

@Gilles-谢谢,这是今天上班的开始,我添加了一些我发现但未添加到A的附加信息。大多数与“ wpa-ssid”和“ wpa-psk”字符转义有关的错误。
slm

我无法说是否对essid进行urlencoding作为启动参数,但在interfaces文件中不起作用。
hultqvist

@phq-我并不感到惊讶,这只是一个主意,而编码通常是您在其他应用程序中像这样处理数据的方式,引用它似乎是除删除它之外的唯一其他选择。
slm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.