2009-11-05 5 views
1

XSS 안전 문자열 보간 체계의 개념 증명을 함께 작성하려고합니다. BNF 문법에서 상태 시스템 가져 오기

대체 된 문자열을 감안할 때

, 나는 상태 머신을 실행 한 후 문자 부분 및 대체 ("Hello<b>" planetoid "</b>!")로 휴식하고 싶은

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

바로 문자 부분을 통해 왼쪽. 보간 값 (위의 planetoid)에 도달하면 상태에서 적절한 이스케이프 함수를 가져올 수 있어야합니다.

누구든지 lex/yacc/bison을 사용하여 상태 시스템을 파생시키고 문법의 레이블을 출력 상태와 연관시키는 방법을 알고 있습니까? 자바에서 사용할 수있는 상태 머신을 파생시키고 PHP의 기본 문자열 구현을 대체하려고합니다.

내 이유는 here입니다.

환호 마이크

일반적
+0

바이슨은 실제로 상태 머신을 생성하고 파싱하는 동안 발생하는 모든 축소 작업을 추가 할 수 있으므로 실제로 필요한 것은 문자열 내부의 $ vars를 대체하는 것입니다. 또는 무엇을? – Jack

답변

5

, BNF 표현할 수 문법에 대한 상태 머신을 생성하는 것은 불가능하다. 상태 머신은 일반 언어 만 인식 할 수 있으며 BNF는 상황에 맞는 언어를 지정할 수 있습니다. Yacc은 파서를 생성 할 수 있습니다. 충분하니?

+0

+1, 촘스키 계층 구조에 관한 나보다 더 정확하게, 나는 그것을 다시 연구해야한다. – Jack

+0

전적으로 이것을 어휘 수준에서하고 싶습니다. HTML과 CSS에는 규칙적인 문법이 있습니다. JS는 정규 어휘 문법을 가지고 있지 않지만, 너무 어색한 것을 볼 때 오류 상태로 전환 할 수 있다면 어휘 적으로 정규 하위 집합을 생각해 낼 수 있습니다. –

+0

$를 찾아서 유효한 변수 이름을 검색하고 대부분의 경우 대체하면 충분할 것입니다. 또한 HTML은 정규 언어가 아니므로 중첩 수준은 잠재적으로 제한이 없으므로 미친 듯합니다. – PeterAllenWebb

0
나는, 문법에 마커를 넣을 수 있습니다처럼 보이는

그래서 나는 두 개의 서로 다른 생산 유형, 아니 부작용에 하나를 사용하고 그 변수 상태를 문자를 소비하고, 어떤 문자를 소비하지 하나지만, 업데이트하는 경우

switch 문에서
ST_EXPECT_TAG_NAME : { state = TAG_NAME }; 
TAG_BODY 
    : '<' ST_EXPECT_TAG_NAME TAG_NAME ATTRS SPACES '>' ST_OUT_OF_TAG 
    ; 

컴파일 된 출력 동료 상태 이름은

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

C를 구문 분석하지 않고 테이블을 추출 할 수있는 방법이있을 수 있습니다,하지만 난 Yacc에/들소 너무 무지 해요.

0

yacc/bison을 사용할 수 있습니다. 처음에는 bison을 보면서 하드 드라이브를 어디에 구현할 수 있는지 알려줍니다. 들소의 규칙은 왼쪽에서 오른쪽으로 해결됩니다. 즉; rule1 rule2 rule3을 파생시키는 규칙 (rule0이라고 함)이 있으면 rule1, rule2, rule3, rule0 순서로 호출됩니다. 규칙에 대한 동적 반환 값을 사용하여 전역 상태 시스템을 사용하여 결합 할 수 있습니다 (문자열, int 또는 리턴 값에 대한 컨테이너와 같은 여러 유형의 공용체를 사용합니다).

+0

나는 상태 머신을 구현하고 싶지 않다. 문법을 지정하고 상태 머신을 꺼내고 싶습니다. –

관련 문제