응용 프로그램 보안 샌드박스의 HTML 내용의 경우 코드를 로드한 후(
body
요소의
onload
이벤트를 전달하고
onload
핸들러 함수가 실행을 완료한 후) 문자열을 실행 코드로 동적으로 변환할 수 있는 API를 사용할 때 제한 사항이 있습니다. 이는 응용 프로그램이 잠재적으로 안전하지 않은 네트워크 도메인과 같은 비 응용 프로그램 소스의 코드를 실수로 삽입 및 실행하지 않도록 하는 것입니다.
예를 들어 응용 프로그램에서 DOM 요소의 innerHTML 속성에 쓸 원격 소스의 문자열 데이터를 사용하는 경우 문자열에 안전하지 않은 작업을 수행할 수 있는 실행(JavaScript) 코드가 포함될 수 있습니다. 그러나 내용을 로드하는 동안 원격 문자열을 DOM에 삽입할 위험은 없습니다.
하나의 제한 사항은 JavaScript
eval()
함수를 사용하는 경우에 해당됩니다. 응용 프로그램 샌드박스의 코드가 로드되고 onload 이벤트 핸들러가 처리된 후에는
eval()
함수를 제한적인 방법으로만 사용할 수 있습니다. 다음 규칙은 응용 프로그램 보안 샌드박스에서 코드가 로드된
이후
eval()
함수를 사용할 때 적용됩니다.
-
리터럴을 포함하는 식이 허용됩니다. 예를 들면 다음과 같습니다.
eval("null");
eval("3 + .14");
eval("'foo'");
-
다음과 같이 객체 리터럴이 허용됩니다.
{ prop1: val1, prop2: val2 }
-
다음과 같이 객체 리터럴 setter/getter가
금지됩니다
.
{ get prop1() { ... }, set prop1(v) { ... } }
-
다음과 같이 배열 리터럴이 허용됩니다.
[ val1, val2, val3 ]
-
다음과 같이 속성 읽기를 포함하는 식이
금지됩니다
.
a.b.c
-
함수 호출이
금지됩니다.
-
함수 정의가
금지됩니다.
-
속성 설정이
금지됩니다.
-
함수 리터럴이
금지됩니다
.
그러나 코드를 로드하는 동안,
onload
이벤트 이전 및
onload
이벤트 핸들러 함수를 실행하는 동안 이러한 제한 사항이 응용 프로그램 보안 샌드박스의 내용에 적용되지 않습니다.
예를 들어 코드를 로드한 후 다음 코드를 실행하면 런타임에서 예외가 발생합니다.
eval("alert(44)");
eval("myFunction(44)");
eval("NativeApplication.applicationID");
eval()
함수를 호출할 때 생성된 코드와 같이 동적으로 생성된 코드는 응용 프로그램 샌드박스 내에 허용되는 경우 보안 위험을 유발할 수 있습니다. 예를 들어 응용 프로그램에서 네트워크 도메인에서 로드한 문자열을 실수로 실행하고 해당 문자열이 악의적인 코드를 포함할 수 있습니다. 예를 들어 이 코드가 사용자 컴퓨터의 파일을 삭제하거나 변경하는 코드일 수 있습니다. 또는 로컬 파일의 내용을 신뢰할 수 없는 네트워크 도메인으로 다시 보고하는 코드일 수 있습니다.
동적 코드를 생성하는 방법은 다음과 같습니다.
-
eval()
함수를 호출합니다.
-
innerHTML
속성 또는 DOM 함수를 사용하여 응용 프로그램 디렉토리 외부에 있는 스크립트를 로드하는 script 태그를 삽입합니다.
-
innerHTML
속성 또는 DOM 함수를 사용하여
src
특성을 통해 스크립트를 로드하지 않고 인라인 코드를 포함하는 script 태그를 삽입합니다.
-
script
태그에 대한
src
특성을 설정하여 응용 프로그램 디렉토리 외부에 있는 JavaScript 파일을 로드합니다.
-
href="javascript:alert('Test')"
의 경우처럼
javascript
URL 스킴을 사용합니다.
-
setInterval()
또는
setTimout()
함수를 사용합니다. 여기서 첫 번째 매개 변수(함수를 비동기적으로 실행하도록 정의)는 함수 이름이 아닌 평가할 문자열입니다(
setTimeout('x = 4', 1000)
과 유사).
-
document.write()
또는
document.writeln()
을 호출합니다.
응용 프로그램 보안 샌드박스의 코드는 내용을 로드하는 동안 이러한 메서드만 사용할 수 있습니다.
이러한 제한 사항은 JSON 객체 리터럴과 함께
eval()
을 사용하지 않도록 지정하지
않습니다
. 이를 통해 응용 프로그램 내용을 JSON JavaScript 라이브러리에서 사용할 수 있습니다. 그러나 오버로드된 JSON 코드(이벤트 핸들러 사용)를 사용하는 데 제한을 받습니다.
다른 Ajax 프레임워크 및 JavaScript 코드 라이브러리의 경우 프레임워크 또는 라이브러리의 코드가 동적으로 생성된 코드에 대한 이러한 제한 사항 내에서 작동하는지 확인합니다. 그렇게 작동하지 않는 경우 비 응용 프로그램 보안 샌드박스에서 프레임워크 또는 라이브러리를 사용하는 내용을 포함합니다. 자세한 내용은
AIR 내부의 JavaScript에 대한 제한
및
응용 프로그램 내용과 비 응용 프로그램 내용 간 스크립팅
을 참조하십시오. Adobe에서는
http://www.adobe.com/products/air/develop/ajax/features/
에서 응용 프로그램 보안 샌드박스를 지원하는 것으로 알려진 Ajax 프레임워크 목록을 유지합니다.
응용 프로그램 보안 샌드박스의 내용과 달리 비 응용 프로그램 보안 샌드박스의 JavaScript 내용은
eval()
함수를 호출하여 동적으로 생성된 코드를 언제든지 실행할
수 있습니다
.