JAVA SCRIPT/NEXACRO

[JAVA SCRIPT] 넥사크로 eval 회피(브라켓 표기)

울면서개발하기 2023. 10. 26. 15:27

1. 넥사크로 프로젝트를 진행하다보면, 스크립트에서 eval을 사용한 경우를 빈번히 볼 수 있다.

예컨대, 아래와 같은 스크립트들..

for ( var i = 1 ; i < 5; i++ ) {
	eval("this.div_ncuProgram.form.div_frame.form.div_row" + i).set_visible(false)
	eval("this.div_ncuProgram.form.div_frame.form.div_row" + i + ".form.edt_title").set_value("");
	eval("this.div_ncuProgram.form.div_frame.form.div_row" + i + ".form.edt_jumsu").set_value("");
} // 이러한 사용사례가 현재 프로젝트에서는 900건이 넘는다

 

2. 투비소프트에서는 eval을 대체하는 방법으로 components 라는 속성을 제공한다.(all, objects 등의 속성도 있음)

components 속성은 유사배열로서, length를 이용한 반복문의 실행이 가능하다. (구글링 키워드 : 자바스크립트 유사 배열)

예컨대, 아래처럼 회피가 가능하단건데..

eval("this.Button00") // eval을 회피하기 위해서 
this.components["Button00"] // this.components 속성을 통해 Button00 버튼 객체 접근

 

3. 넥사크로에서 제공해주는 속성이 아닌 순수 자바스크립트로도 회피가 가능하다.

자바스크립트에서, 객체는 . 으로 속성을 접근 할 수도 있지만 괄호(브라켓)로도 속성을 접근 할 수 있다.

브라켓 표기법을 사용하면 동적으로 객체에 접근이 가능하다.

eval("this.Button00") // eval을 회피하기 위해서 
this["Button00"] // 브라켓 표기법으로 접근
// 넥사크로에서 많이 사용하는
this.ds_main.setColum(0, "A", "1");
// 아래도 동일하다
this["ds_main"]["setColumn"](0, "A", "1");

 

마치며,

프로젝트에서 외부 감리를 한다면 보안상 취약을 이유로 eval 사용시 지적사항이 된다.

어쩔 수 없는 경우는 new Function 을 통해서 회피를 하면 되고,

(특정 버전에선 new Function 을 사용하면 제너레이트가 안 된다는 경우가 있는 것 같음)

단순히 객체에 접근을 위한 목적이라면 브라켓 표기법을 사용하면 되겠다.

 

 

 

구글링 키워드

- 자바스크립트 유사 배열

- 자바스크립트 브라켓 표기법

- new Function