2

我正在尝试整理 XSS 安全字符串插值方案的概念证明。

给定一个带有替换的字符串,

"Hello <b>$planetoid</b>!"

我想把它分解成文字部分和替换("Hello<b>" planetoid "</b>!"),然后在文字部分上从左到右运行一个状态机。当我达到一个插值(planetoid在上面)时,我需要能够从状态到一个适当的转义函数。

有谁知道如何使用 lex/yacc/bison 派生状态机并能够将语法中的标签与输出状态相关联的任何示例?我想派生一个我可以在 javascript 中使用的状态机,并尝试替换 PHP 的底层字符串实现。

这里描述了我这样做的原因。

干杯,迈克

4

3 回答 3

7

一般来说,不可能为可以用 BNF 表示的语法创建状态机。状态机只能识别常规语言,BNF 可以指定上下文无关语言。Yacc 可以创建解析器。那就足够了吗?

于 2009-11-06T00:03:44.817 回答
0

为此,您可以使用 yacc/bison。最初看野牛很难说你可以在哪里实现状态机。野牛中的规则是从左到右解决的。IE; 如果您有一个派生 rule1 rule2 rule3 的规则(称为 rule0),则按以下顺序调用操作:rule1,rule2,rule3,rule0。您可以使用全局状态机将其与规则的动态返回值结合起来(我使用具有不同类型的联合,例如字符串、int 甚至是返回值的容器)。

于 2010-10-23T18:13:51.137 回答
0

看起来我可以在语法中添加标记,所以如果我使用两种不同的生产类型,一种没有副作用,消耗字符,另一种不消耗字符,但更新状态变量

ST_EXPECT_TAG_NAME : { state = TAG_NAME };
TAG_BODY
    : '<' ST_EXPECT_TAG_NAME TAG_NAME ATTRS SPACES '>' ST_OUT_OF_TAG
    ;

编译后的输出在 switch 语句中关联状态名称

YY_REDUCE_PRINT (yyn);
switch (yyn)
  {
      case 118:
#line 74 "tmp/html-combo.y"
    { state = TAG_NAME ;}
    break;

可能有一种方法可以在不解析 C 的情况下提取表,但我对 yacc/bison 非常无知。

于 2009-11-06T02:05:55.203 回答