当无法逃脱的角色逃脱时该怎么办?

时间:2011-02-23 00:41:03

标签: parsing escaping language-design

在设计(迷你)语言时: 当某些字符应该被转义以失去特殊含义(如某些编程语言中的引号)时,应该做什么,特别是从安全角度来看,当不可逃避的字符(例如,从不具有特殊含义的普通字符)时逃脱?如果错误是“错误”,或者该字符是否应该被丢弃,或者它应该在输出中与它没有被转义一样?

实施例: 在一个简单的语言中,字符串由双引号(")分隔,并且给定字符串中的任何引号都使用反斜杠(\)进行转义:对于输入"We \said, \"We want Moshiach Now\"" - - 对于s中被转义的said字母应该怎么做?

4 个答案:

答案 0 :(得分:4)

当发生这种情况时,我更喜欢词法分析器发出呜呜声。词法分析器/解析器应该对语法很紧张;人们总是可以放松一下。如果你马虎,你会发现你无法收回你认为没有做出的决定。

假设您最初决定将“反斜杠 not-an-escape ”视为该对字符,并且“T”是 今天 not-an-escape 。稍后您决定扩展语言,并希望“\ T”表示特殊的内容,并且您可以更改语言。

你会发现一群愤怒的程序员猛攻你的设计城堡, 因为对他们来说,“\ T”的意思是“\”“T”(或“T”,取决于你的默认决定), 而你刚刚破坏了他们的代码。你垂头丧气,撤回决定, 然后意识到......哎呀,没有更多可用的转义字符!

本课适用于您的语言中未明确定义的任何语法。如果它不是明确合法的,它应该是隐式非法的,您的编译器应该检查它。或者你永远无法扩展你成功的语言。

如果您的语言不会成功,您可能不会那么在意。

答案 1 :(得分:1)

嗯,解决问题的一种方法是反斜杠只是在不可逃避的字符之前表示反斜杠。这就是Python的作用:

>>> print "a\tb"
a   b
>>> print "a\tb\Rc"
a   b\Rc

答案 2 :(得分:1)

显然,大多数系统都使用转义字符来表示“逐字逐句”,因此转义“不可逃避”字符通常是无害的。这个问题后来发生在你进行比较等时,文字文本并不代表实际价值(这是你在安全方面看到很多问题的地方,特别是像URL这样的事情)。

因此,一方面,您只能接受有限数量的转义字符。从这个意义上说,你有一个“转义序列”,而不是一个转义字符(\ x是整个序列,而不是一个\后跟一个x)。这就像是最安全的机制,写起来并不是很麻烦。

另一个选择是确保您通过某些规则集“规范化”您比较的所有内容。这通常意味着在比较之前正确地删除所有转义序列,然后比较最终值而不是文字。

答案 3 :(得分:1)

大多数系统解释斜杠,Will Hartung说,除了用于字母数字,它们被用作控制代码,字符类,字边界,十六进制序列的开头,案例区域标记,十六进制的别名或八进制数字等。\s特别经常表示perl5样式正则表达式中的空格。 JavaScript在一个上下文中将其解释为's',在另一个上下文中将其解释为空格,因为这种选择会遇到细微的错误。考虑/foo\sbar/ vs new RegExp('foo\sbar')