דף הבית > כללי > Policy service עבור socket באפליקציות Flash

Policy service עבור socket באפליקציות Flash

בעיה קלאסית שקיימת בתקשורת של Binary Sockets ב-actionscript3 היא שלא ניתן לפנות ללא הרשאות מתאימות ל-ports מתחת ל-1024. נניח סיטואציה שבה אני רוצה למשוך באופן בינארי קובץ swf או קובץ תמונה ישירות מהשרת ללא אובייקטים מתווכים כמו Loader  או URLLoader, בשביל זה אני צריך גישה לפורט 80 של ה-Web Server, וזה אומר פניה לפורט מתחת ל-1024 ואין אישור בדרך הסטנדרטית.

ה-error שמתקבל:

Error #2044: Unhandled securityError:. text=Error #2048: Security sandbox violation: file:///xxx.swf cannot load data from [server]:80.

קריאה של התקשורת שמתבצעת בשלב הזה מראה על שליחת הבקשה: <policy-file-request/> לשרת, במטרה לקבל אישור על קריאת התוכן מהעמוד המבקש. העניין הוא שהבקשה לאישור נשלחת ל-port שונה מזה שאליו נשלחת הבקשה, שהוא ה-port עליו צריך להאזין השרת.

הפתרון הרגיל במקרה כזה הוא שימוש ב-crossdomain.xml עבור כל ה-ports, או ports מוגדרים ברשימה כגון זאת:

<cross-domain-policy>
<allow-access-from domain="flashdev.co.il" to-ports="*" />
</cross-domain-policy>

במקרה הזה היאשצריך שהפניה ל-crossdomain תתבצע באמצעות xmlsocket ולא באמצעות http, כלומר הגדרת ה-loadPolicyFile של המערכת צריך להיות משהו כזה:

Security.loadPolicyFile("xmlsocket://flashdev.co.il:portNumber/crossdomain.xml");

מה שאומר שלא ניתן להשתמש בשרת ה-webserver הרגיל עבור זה.

אופציה נוספת היא לא להגדיר בכלל loadPolicyFile והשרת יפנה ישירות ל-port כאשר תתבקש קריאה ל-socket

מה עושים? משתמשים ב-policyServer, מיני שרת שכתבתי ל-windows (גרסה ל-linux בקרוב), שניתן לקנפג לאיזה פורט רוצים שהיא תאזין ומה ה-crossdomain.xml שתזרוק למשתמש שמבקש.

השרת מאזין ב-default לפורט 843 (ניתן לשינוי, שימו לב לשנות את loadPolicyFile בהתאם) . ניתן גם להגדיר את הקובץ שיאזין ל-ip ספיציפי (לשימוש בכמה interfaces) ולשנות את מבנה ה-crossdomain.

אם יש בקשות/הערות/באגים, מוזמנים לשרשר בתגובות

win32 PolicyServer 1.0

  • Share/Save/Bookmark
קטגוריות:כללי תגיות:
  1. תומר
    7 יוני, 2009 מתוך 12:18 | #1

    אחלה פוסט. תודה רבה. סוף סוף משהו בעברית בנושא הסבוך הזה.
    אתה נשמע כמו המשיח שיפתור לי את הבעיה.

    1) הורדתי את התוכנה, הרצתי וקיבלתי את ההודעה הבאה:
    Starting PolicyServer by Gadi Srebnik
    Listening for connections
    Failed to bind socket

    2) תיאור הבעיה שלי:
    יש תוכנה ב C++ שמשדרת מידע בזמן אמת לאפליקצית ה FLEX שלי באמצעות socket. כתובת IP 127.0.0.1 ופורט 4102.
    אני מקבל את המידע באמצעות socket flash והכול נפלא. זה מפסיק לעבוד כאשר אני מעביר את הקבצים מחוץ לספריית bin-debug של flex או עושה release export. שם אני מקביר error 2048 sandbox violation.
    מניסיוני בתקשורת url, webservice התופעה הזאת מתרחשת בגלל ה crossdomain.xml.
    ניסיתי להפעיל שרת ISS ולשים קובץ בספריית C:\Inetpub\wwwroot ולא עזר. ניסיתי לקרוא לו עם load PolicyFile ולא עוזר.

    מה דעתך…..

    תודה.
    תומר.

  2. תומר
    7 יוני, 2009 מתוך 13:41 | #2

    A L L R I G H T

    :-) :-)

    הצלחתי להריץ את זה והבעיה נפתרה.

    תודה רבה.

  3. 7 יוני, 2009 מתוך 14:29 | #3

    בכיף :)

  4. דוד
    9 יוני, 2009 מתוך 12:25 | #4

    הצילו, יש לי בעיה דומה לבעיה של תומר ואין לי כלים לפתור אותה.
    יש לי תוכנת שרת הבנויה בJAVA המשדרת מידע בזמן אמת לאפליקצית ה FLEX שלי באמצעות socket. כתובת IP 192.168.0.141 ופורט 2007.
    אני מקבל את המידע באמצעות socket flash והכל טוב.

    אפליקצית הflex נמצאת על שרת חיצוני (לא אותו שרת שיושבת עליה תוכנת הJAVA).
    אפליקצית הFLEX יורדת לדפדפן אך כאשר אני מנסה ליצור תקשורת (socket) לתוכנת הJAVA - יש הודעת שגיאה של security.

    הבנתי שצריך להוסיף קובץ cross-domain-policy ,
    השאלה שלי היא לאן להוסיף אותו (לשרת שאפליקצית הFLEX יושב עליו או לשרת שתוכנת הJAVA יושב עליו)?
    לאיזו תיקיה להוסיף?
    איך אני מקשר בין אפליקצית הflex לקובץ הזה?

    אשמח לתשובות, דוד

  5. 9 יוני, 2009 מתוך 14:37 | #5

    היי דוד,
    האם השרתים הם אותו דומיין? אם כן לא אמורה להיות בעיה מעל פורט 1024. אם לא, אז צריך באמת להוסיף קובץ crossdomain או להתקין את התוכנה למעלה (אם מדובר ב-windows).
    אחרת יש שתי אפשרויות:
    בעקרון ה-flash player מנסה לפנות ל-port 843 בשביל לקבל אישור מה-crossdomain אז אתה יכול להוסיף מודול לשרת ה-java שלך שיאזין בפורט הזה ויזרוק לכל פניה אליו את ה-crossdomain.
    האפשרות השניה היא לחכות שאני אוציא את גרסת ה-linux :)

    גדי

  6. תומר
    24 יוני, 2009 מתוך 13:55 | #6

    היי גדי מה שלומך…

    זה עובד היטב על XP אך לא על vista.
    התוכנה נתקעת בהודעה שהיישום נכשל מאחר שתצורת "זה לצד זה" שלו שגויה.
    רעיונות…

  7. 25 יוני, 2009 מתוך 11:07 | #7

    היי תומר,
    כנראה שה-binding שונה ב-vista. מקוה שבקרוב אני אעלה גרסאות גם לויסטה וללינוקס.

  8. גיל
    3 אוגוסט, 2009 מתוך 15:42 | #8

    @gadi_sr
    גדי שלום,
    נתקלטי בבעיה דומה, אבל למרות שיש לי XP,
    לא הצלחתי להריץ את ה-policyServer.
    קיבלתי את ההודעה הבאה:
    "The application failed to start because the application configuration is incorrect.Reinstalling the application may fix the problem."

    1. האם תוכל לעזור ?
    2. אם מדובר בקוד פשוט - האם תוכל לשלוח snippet או לפחות תאור שלו(, כדי שאוכל לשלב בתוכנה שלי ?
    תודה,
    גיל.

  9. 4 אוגוסט, 2009 מתוך 08:23 | #9

    לידיעתכם, פרסמתי את הקוד כאן:
    http://tinyurl.com/lwhxjk

  10. גיל
    4 אוגוסט, 2009 מתוך 19:07 | #10

    @gadi_sr
    גדי תודה-
    הבעיה נפתרה!
    אבל נדמה לי שמצאתי שני באגים קטנים בקוד:

    1. חישוב אורך קובץ ה-crossdomain.xml לפני הקריאה (הקוד המקורי חישב תמיד אורך 0) :

    // get length of file:
    inCrossDomain.seekg (0, ios::end);
    len = inCrossDomain.tellg();
    inCrossDomain.seekg (0, ios::beg);

    inCrossDomain.read(data, 1024);

    2. סיום המחרוזת ב-NULL במקום len ולא len-1:
    str[len] = ";

    מצטער על שיבוש הטקטס של הקוד בהדבקה,
    גיל.

  11. גיל
    5 אוגוסט, 2009 מתוך 05:14 | #11

    @gadi_sr
    גדי,
    נראה שה-PolicyServer אפקטיבי רק כשמריצים אותו מאותה הספריה שבה נמצא ה-HTML
    שמארח את ה-FLASH.
    האם יש דרך לעקוף את העניין כך שאוכל להריץ את ה-PolicyServer ממקום אחר ?
    תודה,
    גיל.

  12. 5 אוגוסט, 2009 מתוך 08:12 | #12

    הרעיון בקובץ crossdomain הוא לאפשר לקבצי פלאש לבצע שאילתות מ-domain ספציפי. ה-policy server עצמו לא קשור לספריה, הוא צריך קבצי conf.txt ו-crossdomain.xml שיהיו בספריה איתו בשביל ההגדרות. הדבר היחיד שצריך לדאוג זה שהוא יאזין על אותו דומיין שבו נמצא הפורט אליו אתה רוצה לפנות אחכ.
    לאיזה סוג שרת אתה פונה?

  13. גיל
    14 ספטמבר, 2009 מתוך 15:41 | #13

    @gadi_sr
    הי גדי,
    מצטער על האיחור.
    הבעיה נפתרה (למעשה היא בכלל לא היתה קשורה לספריות).
    הסרבר עובד ללא תקלות !
    תודה,
    גיל.

  14. אלישבע
    22 דצמבר, 2009 מתוך 14:04 | #14

    שלום גדי

    אנחנו מנסים לייצר תקשורת בין שרת לקוח באמצעות socket

    יש קובץ פלקס שמאתחל קלאס ב AS3

    קובץ ה MXML מאתחל קלאס שמאתחלת SOCKET

    telnetClient = new Telnet(serverName.text, int(portNumber.text

    ובתוך הקלאס של TELNET

    serverURL = server;
    portNumber = port;
    ta = output;
    msg("Telnet serverURL " + serverURL+"\n");
    msg("Telnet portNumber " + portNumber+"\n");

    Security.allowDomain("*");
    Security.allowInsecureDomain("*");
    Security.loadPolicyFile("http://" + serverURL + "/cross-domain.xml");

    // Create a new Socket object and assign event listeners.
    socket = new Socket();
    socket.addEventListener(Event.CONNECT, connectHandler);
    socket.addEventListener(Event.CLOSE, closeHandler);
    socket.addEventListener(ErrorEvent.ERROR, errorHandler);
    socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onSecurityError);
    socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
    socket.addEventListener(ProgressEvent.SOCKET_DATA, dataHandler);

    msg("Telnet before connect"+"\n");
    socket.connect(serverURL, portNumber);

    Compiler settings have -use-network=false

    ועדיין כל פעם שקוראים לCONNECT

    מקבלים

    Security error Error #2048: Security sandbox violation: http://192.168.20.17/TelnetSocket.swf cannot load data from 192.168.20.17:2000.

    אנחנו עובדים עם פורט גדול מ 1024
    ונראה שהגדרנו את כל הפרמטרים של ה SECURITY

    כאשר אנחנו שמים SNIFFER רואים שהנתונים עוברים לשרת וגם חוזרים, אז מדוע ההודעה הזו ???

    השרת הוא MONGOOSE

    http://code.google.com/p/mongoose/

    תודה

    אלישבע

  15. 13 מאי, 2010 מתוך 13:00 | #15

    אופציה נוספת לכל מעונין - מודול ל-APACHE שמתקשר בפרוטוקול של ADOBE

    http://www.beamartyr.net/articles/adobepolicyfileserver.html

  16. 14 מאי, 2010 מתוך 13:36 | #16

    @אלישבע
    גם בפורטים מעל 1024 ישנה בעיית security כאשר פונים ל:xmlsocket protocol לדוגמא ב-smartfoxserver הסיטואציה קיימת בכל תקשורת לפורט שהוא.

  17. 14 מאי, 2010 מתוך 13:37 | #17

    @יצחק
    אחלה פתרון!

  1. אין הפניות עדיין.