크로스 스크립팅

Flash Player 9 이상, Adobe AIR 1.0 이상

동일한 도메인에서 ActionScript 3.0으로 작성된 두 개의 SWF 파일 또는 AIR에서 실행되는 두 개의 HTML 파일을 제공하는 경우에는(예: 한 SWF 파일의 URL은 http://www.example.com/swfA.swf이고 다른 SWF 파일의 URL은 http://www.example.com/swfB.swf인 경우) 한 파일에 정의된 코드에서 다른 파일에 정의된 코드의 변수, 객체, 속성, 메서드 및 기타 항목을 검사 및 수정할 수 있습니다. 이를 크로스 스크립팅 이라고 합니다.

두 파일이 서로 다른 도메인에서 제공되는 경우(예: http://siteA.com/swfA.swf 및 http://siteB.com/swfB.swf) 기본적으로 Flash Player 및 AIR에서는 swfA.swf가 swfB.swf를 스크립팅하거나 swfB.swf가 swfA.swf를 스크립팅하도록 허용하지 않습니다. SWF 파일은 Security.allowDomain() 을 호출하여 다른 도메인의 SWF 파일에 대한 권한을 제공합니다. Security.allowDomain("siteA.com") 을 호출하여 swfB.swf는 siteA.com의 SWF 파일에 스크립팅 권한을 부여합니다.

크로스 스크립팅은 AVM1 SWF 파일과 AVM2 SWF 파일 간에는 지원되지 않습니다. AVM1 SWF 파일은 ActionScript 1.0 또는 ActionScript 2.0을 사용하여 작성됩니다. (AVM1 및 AVM2는 ActionScript Virtual Machine을 나타냅니다.) 하지만 LocalConnection 클래스를 사용하여 AVM1과 AVM2 간에 데이터를 보낼 수 있습니다.

크로스 도메인 상황에서는 관련되는 두 도메인을 명확하게 구별하는 것이 중요합니다. 이 설명서에서는 크로스 스크립팅을 수행하는 쪽을 액세스하는 항목 (일반적으로 액세스하는 SWF)이라고 하고, 다른 한 쪽을 액세스되는 항목 (일반적으로 액세스되는 SWF)이라고 합니다. 다음 그림에 표시된 대로 siteA.swf에서 siteB.swf를 스크립팅할 때 siteA.swf는 액세스하는 항목이고 siteB.swf는 액세스되는 항목입니다.

Security.allowDomain() 메서드로 설정된 크로스 도메인 권한은 비대칭적입니다. 앞의 예제에서 siteA.swf는 siteB.swf를 스크립팅할 수 있지만 siteB.swf는 siteA.swf를 스크립팅할 수 없습니다. 이는 siteA.swf에서 Security.allowDomain() 메서드를 호출하여 siteB.com에 있는 SWF 파일에 스크립팅 권한을 부여하지 않았기 때문입니다. 양쪽 SWF 파일이 Security.allowDomain() 메서드를 호출하도록 하여 대칭적 권한을 설정할 수 있습니다.

Flash Player에서 SWF 파일은 다른 SWF 파일의 크로스 도메인 스크립팅으로부터 보호될 뿐 아니라 HTML 파일의 크로스 도메인 스크립팅으로부터도 보호됩니다. HTML에서 SWF로의 스크립팅은 ExternalInterface.addCallback() 메서드를 통해 설정된 콜백에서 발생할 수 있습니다. HTML에서 SWF로의 스크립팅이 다른 도메인 간에 발생하는 경우 액세스하는 항목이 SWF 파일일 때와 마찬가지로 액세스되는 SWF 파일에서 Security.allowDomain() 메서드를 호출해야 하며, 그렇지 않으면 작업이 실패합니다. 자세한 내용은 제작자(개발자) 컨트롤 을 참조하십시오.

또한 Flash Player는 SWF에서 HTML로의 스크립팅에 대해 보안 컨트롤을 제공합니다. 자세한 내용은 아웃바운드 URL 액세스 제어 를 참조하십시오.

스테이지 보안

Stage 객체의 일부 속성 및 메서드를 표시 목록에 있는 모든 sprite 또는 동영상 클립에서 사용할 수 있습니다.

그러나 Stage 객체는 첫 번째 SWF 파일이 로드된 경우에 소유자가 있는 것으로 간주됩니다. 기본적으로 다음과 같은 Stage 객체의 속성 및 메서드는 스테이지 소유자와 동일한 보안 샌드박스에 있는 SWF 파일에만 사용할 수 있습니다.

속성

메서드

align

addChild()

displayState

addChildAt()

frameRate

addEventListener()

height

dispatchEvent()

mouseChildren

hasEventListener()

numChildren

setChildIndex()

quality

willTrigger()

scaleMode

showDefaultContextMenu

stageFocusRect

stageHeight

stageWidth

tabChildren

textSnapshot

width

스테이지 소유자의 샌드박스가 아닌 샌드박스에 있는 SWF 파일에서 위의 속성과 메서드에 액세스하려면 스테이지 소유자 SWF 파일에서 Security.allowDomain() 메서드를 호출하여 외부 샌드박스의 도메인을 허용해야 합니다. 자세한 내용은 제작자(개발자) 컨트롤 을 참조하십시오.

frameRate 속성은 특별한 경우로 모든 SWF 파일에서 frameRate 속성을 읽을 수 있습니다. 그러나 스테이지 소유자의 보안 샌드박스에 있거나 Security.allowDomain() 메서드를 호출하여 권한을 부여한 SWF 파일에서만 이 속성을 변경할 수 있습니다.

Stage 객체의 removeChildAt() swapChildrenAt() 메서드에도 제한 사항이 있지만 다른 제한 사항과는 다릅니다. 이 메서드를 호출하려면 코드가 스테이지 소유자와 동일한 도메인이 아니라 영향 받는 자식 객체 또는 Security.allowDomain() 메서드를 호출할 수 있는 자식 객체의 소유자와 동일한 도메인에 있어야 합니다.

표시 목록 순회

다른 샌드박스에서 로드된 표시 객체에 액세스하는 SWF 파일의 기능은 제한적입니다. SWF 파일에서 다른 샌드박스에 있는 다른 SWF 파일에서 생성된 표시 객체에 액세스하려면 액세스되는 SWF 파일에서 Security.allowDomain() 메서드를 호출하여 액세스하는 SWF 파일의 도메인에 액세스를 허용해야 합니다. 자세한 내용은 제작자(개발자) 컨트롤 을 참조하십시오.

Loader 객체에서 로드한 Bitmap 객체에 액세스하려면 해당 이미지 파일의 원래 서버에 URL 정책 파일이 있어야 하고 해당 크로스 도메인 정책 파일에서 Bitmap 객체에 액세스를 시도하는 SWF 파일의 도메인에 액세스 권한을 부여해야 합니다( 웹 사이트 컨트롤(정책 파일) 참조).

로드된 파일 및 Loader 객체에 해당하는 LoaderInfo 객체에는 로드된 객체와 Loader 객체 간의 관계를 정의하는 childAllowsParent , parentAllowsChild sameDomain 의 세 가지 속성이 있습니다.

이벤트 보안

표시 목록과 연관된 이벤트에는 해당 이벤트를 전달하는 표시 객체의 샌드박스를 기준으로 보안 액세스 제한이 적용됩니다. 표시 목록의 이벤트에는 버블링과 캡처 단계가 있습니다( 이벤트 처리 참조). 버블링 및 캡처 단계에서 이벤트는 소스 표시 객체에서 표시 목록의 부모 표시 객체를 통해 마이그레이션됩니다. 부모 객체가 소스 표시 객체와 다른 보안 샌드박스에 있는 경우에는 부모 객체 소유자와 소스 객체 소유자 간에 상호 신뢰가 없는 한 해당 부모 객체 아래에서 캡처 및 버블링 단계가 중단됩니다. 상호 신뢰는 다음 작업을 통해 얻을 수 있습니다.

  1. 부모 객체를 소유한 SWF 파일에서 Security.allowDomain() 메서드를 호출하여 소스 객체를 소유한 SWF 파일의 도메인을 신뢰해야 합니다.

  2. 소스 객체를 소유한 SWF 파일에서 Security.allowDomain() 메서드를 호출하여 부모 객체를 소유한 SWF 파일의 도메인을 신뢰해야 합니다.

로드된 파일 및 Loader 객체에 해당하는 LoaderInfo 객체에는 로드된 객체와 Loader 객체 간의 관계를 정의하는 childAllowsParent parentAllowsChild 의 두 가지 속성이 있습니다.

표시 객체 이외의 객체에서 전달된 이벤트에 대해서는 보안 확인이나 보안 관련 지정이 없습니다.