본문 바로가기
SNS | SNG

crossdomain.xml 정책변경 사례

by 두루물 2011. 7. 17.

출처:

crossdomain.xml 정책변경에 따른 변경사항.
http://www.jowrney.com/xe/?mid=SYAS&category=3863&page=2&document_srl=8807

이슈제기
플래시의 MovieClip을 Bitmap 데이터로 서버에 전송후 PHP의 GD라이브러리를 이용해 이미지 생성 후,
다시 플래시로 돌려받아 파일 저장 대화상자를 띄우는 모듈(이하 플래시 이미지 저장 모듈)이 정상 작동하지 않았다.

이슈분석
일반적으로 플래시가 있는 서버를 A(http://www.a.com)이라고 하고,
파일을 생성하는 서버 B(http://file.a.com)하면,
Sandbox보안은 crossdomain정책에 따라 운용되게 된다.

그 동안 정상적으로 작동되던 기능이 작동되지 않아 분석해 보니,
아래와 같았다.

1. 파일서버에 이미지 생성은 정상적으로 되는 것으로 보아, 비트맵 데이터 전달의 문제는 없다.
2. swf가 위치한 서버와 위치가 다른 파일서버의 파일의 FP의 접근을 허용하지 않는 이유는 보다 강력해진,
crossdomain.xml 정책으로 기인한다는 사실 발견.
3. crossdomain정책 실시 이후에도 특정브라우저에서 여전히 문제 남아 있었고, 그에 대한 해결방법으로
파일저장 대화상자 오픈 실패시, 다운로드 버튼 표시로 사용자 수동방식으로 다운로드 유도.

이슈핵심
FP9.0.124.0 (현재 FP10) 업데이트 악의적인 HTTP 헤더에 대한 보안 취약점을 해결하기 위해서
크로스-도메인 정책이 변경되었다. 다른 도메인 상의 SWF 파일로 부터 HTTP 헤더의 전송을 허용할 지
여부를 크로스-도메인 정책 파일에서 설정할 수 있다.

또한 html에 포함하는 임베디드 태그의 파라미터 중 allowScriptAccess의 값에서도 설정을 하여야 한다.
FP10에서는 접근을 시도하려는 파일이 있는 서버에도, 접근을 허용하는 서버에도 모두 crossdomain이 필요하다.

이러한 crossdomain을 master policy라고도 하는데, 이 파일 외에 다른 파일타입이나 파일명으로 된
정책파일의 사용을 허용할지 말지를 설정한다. 기존에는 기본값이 all로 되어 있어서 제한없이 사용할 수 있었으나,
FP10에서는 master-only로 변경, 기본적으로는 마스터 정책 파일만 사용할 수 있게 바뀌었다.

이러한 변경은 악의적인 사용자가 게시판 글쓰기나 파일업로드 등의 방법으로 크로스 도메인 설정의 내용을
가지는 파일을 만들수 있고, 이를 이용해 loadPolicyFile() 메소드를 이용하여 로드하는 경우, 실제로는 권한이
없는 사이트에서도 데이터를 가져갈 수 있는 문제를 야기 시키기에 서버 관리자가 마스터 설정 파일을 가지고,
이런 악의적인 적근을 제한하기 위해 추가된 기능이다.

이슈해결
1. 서비스 서버(http://www.a.com) 의 root의 기존 crossdomain.xml 내용변경.

[ 기존설정 ]

1.<?xml version="1.0"?>
2.<cross-domain-policy>
3. <allow-access-from domain="*" />
4.</cross-domain-policy>

[ 변경 설정 ]

1.<?xml version="1.0"?>
2.<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
3.<cross-domain-policy>
4. <allow-access-from domain="*" />
5. <allow-http-request-headers-from domain="*" headers="*"/>
6.</cross-domain-policy>


2. 파일 생성 서버(http://file.a.com) 의 root의 새로운 crossdomain.xml 내용변경.

[ 기존설정 ]
c
rossdomain.xml 파일 없었음.

[ 변경설정 ]
서비스 파일 서버의 crossdomain.xml 동일하게 생성.

3. SWF 임베디드 코드 페이지 수정요.

[ 기존설정 ]

1.<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.adobe.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="550" height="400" align="middle">
2. <param name="movie" value="http://www.a.com/ex.swf">
3. <param name="allowScriptAccess" value="sameDomain">
4. <embed type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer" width="550" height="400" align="middle" src="http://www.a.com/ex.swf" allowScriptAccess="sameDomain"></embed>
5.</object>

[ 변경설정 ]

1.<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.adobe.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="550" height="400" align="middle">
2. <param name="movie" value="http://www.a.com/ex.swf">
3. <param name="allowScriptAccess" value="always">
4. <embed type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer" width="550" height="400" align="middle" src="http://www.a.com/ex.swf" allowScriptAccess="always"></embed>
5.</object>


관련 자료
Cross-domain policy file specification
http://www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html#site-control-permitted-cross-domain-policies

Links from SWF files in HTML page no longer function(Flash Player 9)http://kb.adobe.com/selfservice/viewContent.do?externalId=50c1cf38&sliceId=2


컨텐츠의 동적 로드 - Loader 클래스


출처 : http://jasu.tistory.com/240

Loader 클래스

Loader 오브젝트를 사용하여 어플리케이션에 SWF 파일 및 그래픽 파일을 로드 할 수 있다. Loader 클래스는 DisplayObjectContainer 클래스의 서브 클래스이므로 Loader 오브젝트에는 표시 리스트 표시 오브젝트를 사용할 수 있다. SWF 파일 또는 그래픽 파일을 나타내는 표시 오브젝트는 Loader로 작성된 인스턴스 1개당 1 개만 포함할 수 있다. 표시 리스트에 Loader 오브젝트를 추가할 때는 다음의 코드와 같이 표시 오브젝트의 로드가 완료하면 로드 된 표시 오브젝트도 표시 리스트에 추가해야 화면에서 확인이 가능하다
var pictLdr:Loader = new Loader();

var pictURL:String = "banana.jpg"
var pictURLReq:URLRequest = new URLRequest(pictURL);
pictLdr.load(pictURLReq);
this.addChild(pictLdr);

SWF 파일 또는 이미지가 로드 되면 로드 된 표시 오브젝트를 아래 코드처럼 container DisplayObjectContainer 오브젝트등의 다른 표시 오브젝트 컨테이너로 이동할 수 있다

import flash.display.*;
import flash.net.URLRequest;
import flash.events.Event;
var container:Sprite = new Sprite();
addChild(container);
var pictLdr:Loader = new Loader();
var pictURL:String = "banana.jpg"
var pictURLReq:URLRequest = new URLRequest(pictURL);
pictLdr.load(pictURLReq);
pictLdr.contentLoaderInfo.addEventListener(Event.COMPLETE, imgLoaded);
function imgLoaded(e:Event):void {
container.addChild(pictLdr.content);
}

LoaderInfo 클래스

파 일이 로드 되면 LoaderInfo 오브젝트가 작성된다. 이 오브젝트는 Loader 오브젝트 및 로드 된 표시 오브젝트 양쪽 모두의 프롭퍼티다. 즉, LoaderInfo 오브젝트는 Loader 오브젝트의 contentLoaderInfo 프롭퍼티를 경유하는 Loader 오브젝트의 프롭퍼티이며 또, 표시 오브젝트의 loaderInfo 프롭퍼티도 로드된 표시 오브젝트의 프롭퍼티이다. 로드 된 표시 오브젝트의 loaderInfo 프롭퍼티는 Loader 오브젝트의 contentLoaderInfo 프롭퍼티와 같다. 즉, LoaderInfo 오브젝트는 로드 된 오브젝트와 로드하는 Loader 오브젝트간 ( 로드 되는 측과 로드하는 측) 공유하게 된다.

LoaderInfo 클래스는 로드의 진행 상황 로드하는 측과 로드 되는 측의 URL 미디어의 총바이트수, 미디어의 규격, 높이와 폭등의 정보를 제공한다. LoaderInfo 오브젝트는 로드의 진행 상황을 감시하기 위한 이벤트를 송출한다.

로드 된 컨텐츠의 프롭퍼티에 액세스 하려면 다음의 코드와 같이 LoaderInfo 오브젝트에 이벤트 청취자를 추가해야 한다.

import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;

var ldr:Loader = new Loader();
var urlReq:URLRequest = new URLRequest("eventDispatcher.swf");
ldr.load(urlReq);
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded);
addChild(ldr);

function loaded(event:Event):void {
trace("loaded");
}


LoaderContext 클래스

Loader 클래스의 load() 또는 loadBytes() 메소드를 사용해 Flash Player 에 외부 파일을 로드하는 경우, context 파라미터를 지정할 수도 있다. 이 파라미터는 LoaderContext 오브젝트이다.

LoaderContext 클래스에는 로드 된 컨텐츠의 사용 방법의 문맥을 정의할 수 있는 다음과 같은 프롭퍼티가 포함되어 있다.

checkPolicyFile-- 이미지 파일을 로드하는 경우에게만 이 프롭퍼티를 사용한다. 이 프롭퍼티를 true로 설정하면 Loader 에 의해서 오리지날 서버로 크로스 도메인 폴리시 파일의 유무가 체크된다. 이것은 Loader 오브젝트를 포함하는 SWF가 있는 도메인 이외의 다른 도메인에 있는 컨텐츠를 로드할 경우에만 사용된다. 서버로부터 Loader 도메인에 액세스 허가가 주어지고 있는 경우라면 Loader 도메인 내의 SWF 파일의 ActionScript는 로드 된 이미지내의 데이터에 액세스 할 수 있다. 즉, BitmapData.draw() 커멘드를 사용하여 로드 된 이미지내의 데이터에 액세스 할 수 있다.
Loader 오브젝트의 도메인 이외의 다른 도메인에 SWF가 있을 경우에 Security.allowDomain()을 호출해 특정의 도메인을 허가할 수가 있다.

securityDomain - SWF 파일을 로드하는 경우에게만 이 프롭퍼티를 사용한다. Loader 오브젝트를 포함한 파일이 있는 도메인 이외의 도메인에 있는 SWF 파일에 대해서 이 프롭퍼티를 지정한다.이 옵션을 지정하면 Flash Player는 크로스 도메인 폴리시 파일이 존재할지를 체크하게 된다. 파일이 존재하는 경우는 크로스 도메인 폴리시 파일로 허가되고 있는 도메인의 SWF 파일은 로드된 SWF 컨텐츠를 크로스 스크립트 할 수 있다. 이 파라미터로서 flash.system.SecurityDomain.currentDomain을 지정할 수 있다.

다음은 다른 도메인으로부터 비트 맵을 로드할 때, 크로스 도메인 폴리시 파일의 유무를 체크하는 예를 나타낸다.

var loaderContext:LoaderContext = new LoaderContext();
loaderContext.checkPolicyFile = true;
var urlReq:URLRequest = new URLRequest("photo11.jpg");
var ldr:Loader = new Loader();
ldr.load(urlReq, loaderContext);

다 음은 SWF 파일을 Loader 오브젝트와 같은 시큐러티 샌드 박스에 두기 위해서 다른 도메인으로부터 SWF 파일을 로드할 때 크로스 도메인 폴리시 파일의 유무를 체크하는 예를 나타낸다. 또, 이 코드는 로드된 SWF 파일의 클래스를 Loader 오브젝트와 같은 어플리케이션 도메인에 추가한다.

var loaderContext:LoaderContext = new LoaderContext();
loaderContext.securityDomain = SecurityDomain.currentDomain;
loaderContext.applicationDomain = ApplicationDomain.currentDomain;
var urlReq:URLRequest = new URLRequest("library.swf");
var ldr:Loader = new Loader();
ldr.load(urlReq, loaderContext);
Posted by JASU (Jasu's Twitter)