วิธีเรียกใช้ Flex SWF จากโดเมนระยะไกลโดยใช้ Flash (AS3)

หากคุณเคยทำงานกับ Flash และ Flex คุณอาจเคยพบกับ SecurityError ที่น่ากลัวเมื่อพยายามเรียกใช้ไฟล์ SWF จากโดเมนที่แตกต่างกัน ข้อผิดพลาดนี้โดยเฉพาะ คือ Error #2119 สามารถเป็นอุปสรรคในการพัฒนาแอปพลิเคชันของคุณ ทำให้ไม่สามารถทำงานร่วมกันระหว่าง SWF ที่โฮสต์ในโดเมนที่แตกต่างกันได้ วันนี้เราจะมาดำดิ่งถึงปัญหาและสำรวจวิธีที่คุณสามารถจัดการกับปัญหานี้ได้อย่างมีประสิทธิภาพโดยใช้ ActionScript 3 (AS3).

ปัญหา: การละเมิด Security Sandbox

ลองนึกภาพว่าคุณมี Flex SWF ที่โฮสต์อยู่บนโดเมนหนึ่ง เช่น http://www.a.com/a.swf และคุณต้องการโหลด SWF อื่น http://services.nuconomy.com/n.swf จากโดเมนอื่น โค้ดของคุณอาจมีลักษณะคล้ายดังนี้:

_loader = new Loader();
var req:URLRequest = new URLRequest("http://services.nuconomy.com/n.swf");
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaderFinish);
_loader.load(req);

อย่างไรก็ตาม เมื่อดำเนินการ คุณจะได้รับข้อยกเว้นดังต่อไปนี้:

SecurityError: Error #2119: Security sandbox violation: caller http://localhost.service:1234/flashTest/Main.swf cannot access LoaderInfo.applicationDomain owned by http://www.b.com/b.swf.

ข้อผิดพลาดนี้มักเกิดขึ้นเพราะ Flash Player บังคับให้มีข้อจำกัดด้านความปลอดภัยของ Sandbox ซึ่งป้องกันไม่ให้ไฟล์ SWF ที่ให้บริการจากโดเมนที่แตกต่างกันโต้ตอบกันได้โดยตรง.

วิธีแก้ปัญหา: การอนุญาตการเข้าถึงด้วย Security.allowDomain()

เพื่อให้สามารถเข้าถึงข้ามโดเมนได้ คุณจำเป็นต้องอนุญาตอย่างชัดเจนโดยใช้วิธี Security.allowDomain() ใน ActionScript วิธีการตั้งค่านี้อย่างมีประสิทธิภาพมีดังนี้:

ขั้นตอนที่ 1: แก้ไข SWF ที่คุณพยายามโหลด

ในไฟล์ SWF ที่คุณพยายามโหลด (เรียกว่าคือ http://services.nuconomy.com/n.swf) คุณจำเป็นต้องรวมโค้ดบล็อกต่อไปนี้:

import flash.system.Security;

// อนุญาตโดเมนที่จะโต้ตอบกับ SWF นี้
Security.allowDomain("http://localhost.service:1234");

ขั้นตอนที่ 2: ใช้งาน Security.allowDomain() อย่างถูกต้อง

  • หลายโดเมน: หากแอปพลิเคชันของคุณต้องการอนุญาตการเข้าถึงจากโดเมนต่างๆ คุณสามารถเรียก Security.allowDomain() หลายครั้งสำหรับแต่ละโดเมน.
  • แนวทางปฏิบัติที่ดีที่สุด: ควรระมัดระวังในการใช้ allowDomain() โดยหลีกเลี่ยงการใช้มากเกินไป เนื่องจากอาจทำให้ไฟล์ SWF ของคุณเสียความปลอดภัย เพียงอนุญาตโดเมนที่เชื่อถือได้.

ขั้นตอนที่ 3: ทดสอบการกำหนดค่า

เมื่อคุณอัปเดตโค้ด SWF แล้ว คุณสามารถรันแอปพลิเคชันอีกครั้ง หากทุกอย่างถูกตั้งค่าอย่างถูกต้อง คุณควรจะสามารถโหลดคลาสจาก SWF ระยะไกลได้โดยไม่มีการละเมิดด้านความปลอดภัยใดๆ.

แหล่งข้อมูลเพิ่มเติม

เพื่อความเข้าใจเพิ่มเติม คุณสามารถดูเอกสารที่ครอบคลุมของ Adobe เกี่ยวกับความปลอดภัยใน Flash ได้ ดู The Adobe Flex 3 Programming ActionScript 3 PDF โดยเฉพาะบทที่ 27 ซึ่งครอบคลุมถึงความปลอดภัยใน Flash Player และการข้ามสคริปต์.

สรุป

การพบกับการละเมิด sandbox ด้านความปลอดภัยอาจทำให้หงุดหงิดโดยเฉพาะเมื่อคุณพยายามที่จะนำเสนอฟีเจอร์ที่เพิ่มขีดความสามารถในการทำงานของแอปพลิเคชันของคุณ โชคดีที่ด้วยวิธี Security.allowDomain() คุณสามารถจัดการกับข้อจำกัดเหล่านี้ได้ง่ายและเปิดใช้งานการสื่อสารที่ราบรื่นระหว่าง SWF จากโดเมนที่แตกต่างกัน ดำเนินการอย่างระมัดระวังและตรวจสอบการอนุญาตเฉพาะโดเมนที่เชื่อถือได้เท่านั้น แล้วคุณจะประสบความสำเร็จในการรวมระบบ.

อย่าลืมว่าการปฏิบัติตามแนวทางการเขียนโค้ดอย่างปลอดภัยเป็นสิ่งสำคัญสำหรับการรักษาความสมบูรณ์ของแอปพลิเคชันของคุณในสภาพแวดล้อมที่เชื่อมต่อ.