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

文法にマーカーを入れることができるように見えるので、2つの異なるプロダクションタイプを使用すると、1つは副作用がなく、文字を消費するものと、もう1つは文字を消費しないが、状態変数を更新するものです。

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 に答える
0

これにはyacc/bisonを使用できます。最初にバイソンを見ると、ステートマシンをどこに実装できるかわかりません。バイソンのルールは左上から上に解決されます。つまり、rule1 rule2 rule3を派生させるルール(rule0と呼ばれる)がある場合、アクションはrule1、rule2、rule3、rule0の順序で呼び出されます。これは、グローバルステートマシンを使用して、ルールの動的な戻り値と組み合わせることができます(文字列、int、さらには戻り値のコンテナーなど、さまざまなタイプのユニオンを使用します)。

于 2010-10-23T18:13:51.137 に答える