앞에서 크로스 스크립팅에 대한 보안에 대하여 간략히 짚어 보았는데 속성과 메서드 정도만 다시 정리하여보자.
보안 이슈가 발생하는 상황은 그림과 같이 서로 다른 도메인에서 서로간 통신시 발생한다.

사용자 삽입 이미지

그림 처럼 다른 도메인의 무비가 한 무비를 불러들여 자신에게 포함한다. 포함한 무비 main.swf가 content.swf의 메서드나 속성을 제어하려고 하면 포함당한 무비입장에서는 '과연 자신의 정보를 보여주어야 하느냐?'에 대한 이슈가 발생한다. 만약 달라는대로 다 준다면...보안에 헛점이 많은 프로그램이였을 것이다. 어찌되었건 불려진 무비입장에서는 개발 당시 특정 도메인에 관해서는 자신의 정보를 주어도 좋다는 허락하에 속성이나 메서드등을 제공하게 된다.
개발시 content.swf에 Security.allowDomain("aaa.com");와 같이 aaa.com에 대하여 보안을 허용한다.

[ 속성 ]
exactSettings : Boolean

[static]
카메라 및 마이크 권한, 저장소 할당량 및 영구 공유 객체 저장에 대한 설정을 비롯한 특정 Flash Player 설정에 사용할 도메인을 선택하는 방법을 결정합니다.

sandboxType : String
[static] [read-only]
호출하는 SWF 파일이 작동 중인 보안 샌드박스의 유형을 나타냅니다.


[ 메서드 ]
allowDomain(... domains):void
[static]
지정된 도메인의 SWF 파일과 HTML 파일이 allowDomain() 호출을 포함하는 SWF 파일의 객체 및 변수에 액세스할 수 있도록 합니다. 단 도메인이 IP와 매핑되더라도 IP주소를 넣었을 때 허용되지 않는 경우가 있다. (여러개의 서버를 사용하여 한개의 도메인을 관리할 경우...등) 그때는 아래의 allowInsecureDomain를 사용한다. 가만히 보면 배열이 파라미터의 값이므로 여러개의 사이트를 등록할 수 있다.

allowInsecureDomain(... domains):void
[static]
지정된 도메인의 SWF 파일과 HTML 파일이, 호출하는 SWF 파일(HTTPS 프로토콜을 통해 호스팅되는)의 객체 및 변수에 액세스할 수 있도록 합니다. 이 보안 모드는 보안단계가 조금 취약할 수 있다.

loadPolicyFile(URL:String):void
[static]
 url 매개 변수에 지정된 위치에서 크로스 도메인 정책 파일을 로드합니다. XML파일명은 crossdomain.xml로 만들어 줍니다. 과거에는 사이트 루트 폴더에 같이있어야 했지만 지금은 경로를 통해 xml 파일을 읽어 올 수 있다.
Security.loadPolicyFile("http://www.example.com/sub/dir/crossdomain.xml");

* crossdomain 정책
<?xml version="1.0"?>
<cross-domain-policy>
    <allow-access-from domain="*" to-ports="507" />
    <allow-access-from domain="*.foo.com" to-ports="507,516" />
    <allow-access-from domain="*.bar.com" to-ports="516-523" />
    <allow-access-from domain="www.foo.com" to-ports="507,516-523" />
    <allow-access-from domain="www.bar.com" to-ports="*" />
</cross-domain-policy>



showSettings(panel:String = "default"):void
[static]
Flash Player에서 [보안 설정] 다이얼로그 패널을 열어준다.
첫번째 파라미터의 값은 SecurityPanel의 static속성으로 정의 되어있다.
가령 사용자가 로컬에 저장되는 정보를 설정하려 할 때 아래와 같이 코딩한고
Security.showSettings(SecurityPanel.LOCAL_STORAGE);

사용자 삽입 이미지
마이크의 음량을 조절하고 싶을 때는 아래와 같이 코딩한다.
Security.showSettings(SecurityPanel.MICROPHONE);
사용자 삽입 이미지

[ SecurityPanel의 상수 ]
CAMERA : String = "camera"
[static]
Security.showSettings()에 전달하면 Flash Player 설정에 [카메라] 패널이 표시됩니다.

DEFAULT : String = "default"
[static]
Security.showSettings()에 전달하면 사용자가 Flash Player 설정을 마지막으로 닫을 때 열려 있던 패널이 표시됩니다.

LOCAL_STORAGE : String = "localStorage"
[static]
Security.showSettings()에 전달하면 Flash Player 설정에 [로컬 저장 설정] 패널이 표시됩니다.

MICROPHONE : String = "microphone"
[static]
Security.showSettings()에 전달하면 Flash Player 설정에 [마이크] 패널이 표시됩니다.

PRIVACY : String = "privacy"
[static] Security.showSettings()에 전달하면 Flash Player 설정에 [개인 정보 설정] 패널이 표시됩니다.

SETTINGS_MANAGER : String = "settingsManager"
[static] Security.showSettings()에 전달하면 [설정 관리자]가 별도의 브라우저 윈도우에 표시됩니다.





Posted by 버터백통

플래시에는 Stage라고 하는 플레이어 가장 바깥에 감쌓여 있는 계층이 있다.
바로 이곳이 마우스 커서와 제일 먼저 닿는 부분이기도 하고 플레이어의 view패널 영역 전부를 차지하고 있는 유일무이한 영역이자 객체입니다.

그리고 SWF당 한개의 Stage가 주어지고 이를 통하여 작업한 객체를 addChild하거나 속성 등을 제어할 수 있습니다. (아래의 스테이지 보안 참고)

[ 속성 : 도움말 참조 ]
align : String

Flash Player 또는 브라우저에서 스테이지 정렬을 지정하는 StageAlign 클래스 값입니다.

세로 정렬 가로 쓰기
       StageAlign.TOP    위쪽    중앙
       StageAlign.BOTTOM    아래쪽    중앙
       StageAlign.LEFT    중앙    왼쪽
       StageAlign.RIGHT    중앙    오른쪽
       StageAlign.TOP_LEFT    위쪽    왼쪽
       StageAlign.TOP_RIGHT    위쪽    오른쪽
       StageAlign.BOTTOM_LEFT    아래쪽    왼쪽
       StageAlign.BOTTOM_RIGHT    아래쪽    오른쪽



 displayState : String
사용할 표시 상태를 지정하는 StageDisplayState 클래스의 값입니다.
StageDisplayState.FULL_SCREEN : 플레이어 전체 화면에 걸쳐 Stage를 확장하도록 설정
StageDisplayState.NORMAL  : 플레이어를 표준 Stage 표시 모드로 되돌리도록 설정

focus : InteractiveObject
키보드 포커스가 있는 대화형 객체입니다. 포커스가 설정되어 있지 않거나 포커스 객체가 호출하는 객체에서 액세스할 수 없는 보안 샌드박스에 속한 경우에는 null입니다.
 stage.focus = 대상입력텍스트필드

frameRate : Number
스테이지의 프레임 속도를 확인하고 설정합니다.
stage.frameRate = 60

height : Number
표시 객체의 높이를 픽셀 단위로 나타냅니다.
단 값의 입력은 불가능 하고 값의 참조만 가능하다.

width : Number
표시 객체의 폭을 픽셀 단위로 나타냅니다.
* 위의 크기에 관련된 값은 무비의 크기가 아닌 무비에서 객체들이 있을 때 그 객체들의 폭의 합과 높이의 합이 반환된다. 가령 폭 500인 무비에 아무 객체도 없다면 stage.width는 0을 반환하고 폭이 100인 객체가 화면에 한개 있다면 stage.width는 100을 반환한다.


mouseChildren : Boolean
해당 객체의 자식에서 마우스 기능을 사용할 수 있는지 여부를 결정합니다.
복잡한 구조안에서 버튼이 중복되거나 마우스 사용 중지하고자 할 때 유용하다.
객체.mouseChildren = false 하면 해당 객체에 포함된 모든 계층의 마우스가 비활성화된다.
 
numChildren : int
[read-only]
해당 객체에 addChild()/addChildAt()등으로 붙어있는 자식 수를 반환합니다.
   
quality : String
Flash Player에서 사용할 렌더링 품질을 지정하는 StageQuality 클래스 값입니다.

StageQuality.LOW : 낮은 렌더링 품질입니다.
그래픽이 앤티앨리어싱되지 않고 비트맵이 다듬어지지 않습니다.

StageQuality.MEDIUM : 중간 렌더링 품질입니다.
2 x 2 픽셀 격자를 사용하여 그래픽이 앤티앨리어싱되고 비트맵이 매끄럽게 다듬어지지 않습니다.
이 설정은 텍스트가 포함되지 않은 무비에 적합합니다.

StageQuality.HIGH : 높은 렌더링 품질입니다.
4 x 4 픽셀 격자를 사용하여 그래픽이 앤티앨리어싱되고 무비가 정적일 때 비트맵이 매끄럽게 다듬어집니다. Flash Player에서 사용하는 기본 렌더링 품질 설정입니다.

StageQuality.BEST : 가장 높은 렌더링 품질입니다.
4 x 4픽셀 격자를 사용하여 그래픽이 앤티앨리어싱되고 비트맵은 항상 매끄럽게 처리됩니다.

scaleMode : String
사용할 크기 조절 모드를 지정하는 StageScaleMode 클래스 값입니다.

Stage
ScaleMode
.EXACT_FIT
 : 응용 프로그램의 원래 종횡비를 유지하면서 왜곡 없이 전체 Flash 응용 프로그램을 지정된 영역에 표시합니다. 응용 프로그램의 두 면에 테두리가 표시될 수 있습니다.

StageScaleMode.SHOW_ALL : 원래 종횡비를 유지하지 않고 전체 Flash 응용 프로그램을 지정된 영역에 표시합니다. 내용이 찌그러질 수 있습니다.

StageScaleMode.NO_BORDER : 응용 프로그램의 원래 종횡비를 유지하면서 왜곡 없이(일부는 잘릴 수 있음) 전체 Flash 응용 프로그램이 지정된 영역을 채웁니다.

StageScaleMode.NO_SCALE : 플레이어 창의 크기가 변경되는 경우에도 전체 Flash 응용 프로그램이 변경되지 않고 유지되도록 고정합니다. 플레이어 윈도우가 내용보다 작으면 내용이 잘릴 수 있습니다.



showDefaultContextMenu : Boolean
Flash Player 컨텍스트 메뉴에서 기본 항목의 표시 또는 숨김을 지정합니다.

stageFocusRect : Boolean
포커스를 받은 객체의 경계선을 광선으로 표시할지 여부를 지정합니다.

stageHeight : int
Stage의 현재 높이를 픽셀 단위로 지정합니다.

stageWidth : int
Stage의 현재 폭을 픽셀 단위로 지정합니다.

tabChildren : Boolean
객체의 자식에서 탭 기능을 사용할 수 있는지 여부를 결정합니다.

textSnapshot : TextSnapshot
[read-only] 이 DisplayObjectContainer 인스턴스에 대한 TextSnapshot 객체를 반환합니다.

[ 스테이지 이벤트 테스트 ]
function run() {
 stage.scaleMode = StageScaleMode.NO_SCALE;
 stage.align = StageAlign.BOTTOM_RIGHT;
 stage.frameRate = 60
 stage.addEventListener(Event.ACTIVATE, activateHandler);
 stage.addEventListener(Event.RESIZE, resizeHandler);
 stage.addEventListener(MouseEvent.CLICK, clickHandler);
 stage.addEventListener(Event.ENTER_FRAME, mouseChk)
}

function activateHandler(event:Event):void {
 trace("활성화된 이벤트: " + event.type);
}

function resizeHandler(event:Event):void {
 trace("크기 재설정 이벤트: " + event.type);
 sizeinfo.text = "무비폭: " + stage.stageWidth + " 무비높이: " + stage.stageHeight;
}
function clickHandler(event:MouseEvent):void {
 selectInfo.text = event.target + "를 클릭하였다";
}
function mouseChk(event:Event):void {
 xinfo.text = String( stage.mouseX )
 yinfo.text = String( stage.mouseY )
}
run();

이 코드는 stage객체에 이벤트를 걸어서 스테이지 활성화 될때나 크기가 변화할 때
resize이벤트등 stage에 관한 테스트입니다.




위의 파일은 다운받아  플래시 플레이어에서 크기를 줄이거나 늘려 보세요~





[ 참고 : 크로스 스크립팅에 대한 스테이지 보안 ]
경우에 따라서 이 Stage에 접근하려는 불려들여진 다른 SWF또는 불러온 SWF에서 불러들인 SWF의 메서드를 호출(크로스 스크립팅)하려면 Security.allowDomain()에서 보안샌드박스를 맞추어 주어야 한다.
가령 이미 Stage에 불려진 A.swf에서 B.swf를 불러들여 B의 run()이라는 메서드를 호출할 때 B.swf에는 A에 관하여 Security.allowDomain(A.swf가 있는 도메인) 허용해야 합니다.


스테이지 보안 항목은 아래와 같다.

                       속성                                   

              메서드            

align

         showDefaultContextMenu

       addChild()

displayState

     stageFocusRect

       addChildAt()

frameRate

     stageHeight

       addEventListener()

height

     stageWidth

       dispatchEvent()

mouseChildren

         tabChildren

       hasEventListener()

numChildren

         textSnapshot

       setChildIndex()

quality

         width

       willTrigger()

scaleMode





Posted by 버터백통

AS3에서는 이전 버전에 이어 시스템의 정보를 읽어오는 Capabilities라는 클래스와 Stage나 Security등을 제공하고 있다. 이들 중에 시스템 환경 검사에 관련된 Capabilities클래스를 다루어보자.
이 클래스는 시스템 정보를 반환하는 여러가지 속성이 있다

[ 속성 : 도움말 참조 ]
avHardwareDisable : Boolean
[static] [read-only]
사용자의 카메라와 마이크에 대한 액세스가 금지되었는지(true) 또는 허용되었는지(false) 여부를 지정합니다.

hasAccessibility : Boolean
[static] [read-only]
플레이어가 실행되는 환경에서 액세스 가능성 도구와의 통신을 지원하는지(true) 또는 지원하지 않는지(false)를 지정합니다.

hasAudio : Boolean
[static] [read-only]
플레이어가 실행되는 시스템에 오디오 기능이 있는지 여부를 지정합니다.

hasAudioEncoder : Boolean
[static] [read-only]
플레이어에서 마이크 입력 등의 오디오 스트림을 인코딩할 수 있는지(true) 또는 인코딩할 수 없는지(false)를 지정합니다.

hasEmbeddedVideo : Boolean
[static] [read-only]
플레이어가 실행되는 시스템에서 포함된 비디오를 지원하는지(true) 또는 지원하지 않는지(false)를 지정합니다.

hasIME : Boolean
[static] [read-only]
플레이어가 실행되는 시스템에 IME가 설치되어 있는지(true) 또는 설치되어 있지 않은지(false)를 지정합니다.

hasMP3 : Boolean
[static] [read-only]
플레이어가 실행되는 시스템에 MP3 디코더가 있는지(true) 또는 없는지(false)를 지정합니다.

hasPrinting : Boolean
[static] [read-only] 플레이어가 실행되는 시스템에서 인쇄를 지원하는지(true) 또는 지원하지 않는지(false)를 지정합니다.

hasScreenBroadcast : Boolean
[static] [read-only]
플레이어에서 Flash Media Server를 통해 실행되는 스크린 브로드캐스트 응용 프로그램 개발을 지원하는지(true) 또는 지원하지 않는지(false)를 지정합니다.

hasScreenPlayback : Boolean
[static] [read-only]
플레이어에서 Flash Media Server를 통해 실행되는 스크린 브로드캐스트 응용 프로그램 재생을 지원하는지(true) 또는 지원하지 않는지(false)를 지정합니다.

hasStreamingAudio : Boolean
[static] [read-only]
플레이어에서 스트리밍 오디오를 재생할 수 있는지(true) 또는 재생할 수 없는지(false)를 지정합니다.

hasStreamingVideo : Boolean
[static] [read-only]
플레이어에서 스트리밍 비디오를 재생할 수 있는지(true) 또는 재생할 수 없는지(false)를 지정합니다.

hasTLS : Boolean
[static] [read-only]
플레이어가 실행되는 시스템에서 NetConnection을 통한 네이티브 SSL 소켓을 지원하는지(true) 또는 지원하지 않는지(false)를 지정합니다.

hasVideoEncoder : Boolean
[static] [read-only]
플레이어에서 웹 카메라 입력 등의 비디오 스트림을 인코딩할 수 있는지(true) 또는 인코딩할 수 없는지(false)를 지정합니다.

isDebugger : Boolean
[static] [read-only]
플레이어가 특수 디버깅 버전인지(true) 또는 정식으로 출시된 버전인지(false)를 지정합니다.

language : String
[static] [read-only]
플레이어가 실행되는 시스템의 언어 코드를 지정합니다.

언어
체코어 cs
덴마크어 da
네덜란드어 nl
영어 en
핀란드어 fi
프랑스어 fr
독일어 de
헝가리어 hu
이탈리아어 it
일본어 ja
한국어 ko
노르웨이어 no
기타/알 수 없음 xu
폴란드어 pl
포루투갈어 pt
러시아어 ru
중국어 간체 zh-CN
스페인어 es
스웨덴어 sv
중국어 번체 zh-TW
터키어 tr



localFileReadDisable : Boolean
[static] [read-only]
사용자의 하드 디스크에 대한 읽기 액세스가 금지되었는지(true) 또는 허용되었는지(false)를 지정합니다.

manufacturer : String
[static] [read-only]
Flash Player의 제조자를 "Adobe OSName" 형식으로 지정합니다.

os : String
[static] [read-only]
현재 운영 체제를 지정합니다.

pixelAspectRatio : Number
[static] [read-only]
스크린의 픽셀 종횡비를 지정합니다.

playerType : String
[static] [read-only]
플레이어 유형을 지정합니다.

screenColor : String
[static] [read-only]
스크린 색상을 지정합니다.

screenDPI : Number
[static] [read-only]
스크린의 dpi(인치당 도트 수) 해상도를 픽셀 단위로 지정합니다.

screenResolutionX : Number
[static] [read-only]
 스크린의 최대 수평 해상도를 지정합니다.

screenResolutionY : Number
[static] [read-only]
스크린의 최대 수직 해상도를 지정합니다.

serverString : String
[static] [read-only]
각 Capabilities 속성의 값을 지정하는 URL 인코딩 문자열입니다.

version : String
[static] [read-only]
Flash Player 플랫폼 및 버전 정보를 지정합니다.


다음은 trace()를 몇 차례 호출하여 flash.system.Capabilities 객체에 있는 값을 출력합니다.
package {
    import flash.display.Sprite;
    import flash.system.Capabilities;

    public class CapabilitiesExample extends Sprite {
        public function CapabilitiesExample() {
            showCapabilities();
        }
       
        private function showCapabilities():void
        {
            trace("avHardwareDisable: "     + Capabilities.avHardwareDisable);
            trace("hasAccessibility: "      + Capabilities.hasAccessibility);
            trace("hasAudio: "        + Capabilities.hasAudio);
            trace("hasAudioEncoder: "     + Capabilities.hasAudioEncoder);
            trace("hasEmbeddedVideo: "     + Capabilities.hasEmbeddedVideo);
            trace("hasMP3: "         + Capabilities.hasMP3);
            trace("hasPrinting: "       + Capabilities.hasPrinting);
            trace("hasScreenBroadcast: "    + Capabilities.hasScreenBroadcast);
            trace("hasScreenPlayback: "     + Capabilities.hasScreenPlayback);
            trace("hasStreamingAudio: "     + Capabilities.hasStreamingAudio);
            trace("hasVideoEncoder: "     + Capabilities.hasVideoEncoder);
            trace("isDebugger: "       + Capabilities.isDebugger);
            trace("language: "       + Capabilities.language);
            trace("localFileReadDisable: "    + Capabilities.localFileReadDisable);
            trace("manufacturer: "      + Capabilities.manufacturer);
            trace("os: "          + Capabilities.os);
            trace("pixelAspectRatio: "      + Capabilities.pixelAspectRatio);
            trace("playerType: "        + Capabilities.playerType);
            trace("screenColor: "       + Capabilities.screenColor);
            trace("screenDPI: "        + Capabilities.screenDPI);
            trace("screenResolutionX: "     + Capabilities.screenResolutionX);
            trace("screenResolutionY: "     + Capabilities.screenResolutionY);
            trace("serverString: "       + Capabilities.serverString);
            trace("version: "         + Capabilities.version);
       
        }
    }
}





Posted by 버터백통