Perl的Marpa解析器的文档包含有关tainted data的以下部分:
Marpa :: R2的存在是为了允许其输入以灵活强大的方式更改执行。 Marpa不应与不受信任的输入一起使用。在Perl的污染模式下,将Marpa的SLIF接口与污染的语法,污染的输入字符串或污染的标记值一起使用是致命的错误。
我不确定是否理解此限制的后果。我了解,语法一定不要被污染。但是我不明白,输入内容绝对不能被污染。对我来说,解析器的任务是验证输入。对于我来说,解析器必须信任其输入听起来不合理。
真的是那样吗?用Marpa实施任何类型的公共网络服务都不可能吗?
我之所以这样问是因为,其中一个参考用例是Marpa HTML parser,在我看来,使用HTML解析器是矛盾的,尽管在所有HTML中可能有约99.99%的HTML都不能与解析器一起使用。
谁能解释这个矛盾?
最佳答案
Marpa实际上比其他解析器更安全,因为它解析的语言正是BNF指定的语言。使用正则表达式,PEG等,很难确定实际解析的语言。在实践中,程序员倾向于让一些测试用例工作,然后放弃。
尤其是,解析不需要的输入可能是一个主要的安全问题-使用传统的解析器,您通常不知道要让的一切。测试套件很少检查是否应接受错误输入。 Marpa准确地解析了其规范中的语言,仅此而已。
那么,为什么有关异味模式的恐慌语言呢?在最一般的情况下,Marpa可以被视为一种编程语言,并且具有完全相同的安全性问题。顾名思义,允许用户执行任意代码是不安全的,而C,Perl,Marpa等正是设计使然。您不能为不受信任的用户提供通用语言界面。对于C,Python等而言,这将是显而易见的,但我认为在Marpa的情况下,有人可能会忽略它。因此,恐慌语言。
与竞争技术相比,Marpa恕我直言更安全。但是,在最一般的情况下,这还不够安全。