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.
אם יש בקשות/הערות/באגים, מוזמנים לשרשר בתגובות





אחלה פוסט. תודה רבה. סוף סוף משהו בעברית בנושא הסבוך הזה.
אתה נשמע כמו המשיח שיפתור לי את הבעיה.
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 ולא עוזר.
מה דעתך…..
תודה.
תומר.
A L L R I G H T
הצלחתי להריץ את זה והבעיה נפתרה.
תודה רבה.
בכיף
הצילו, יש לי בעיה דומה לבעיה של תומר ואין לי כלים לפתור אותה.
יש לי תוכנת שרת הבנויה בJAVA המשדרת מידע בזמן אמת לאפליקצית ה FLEX שלי באמצעות socket. כתובת IP 192.168.0.141 ופורט 2007.
אני מקבל את המידע באמצעות socket flash והכל טוב.
אפליקצית הflex נמצאת על שרת חיצוני (לא אותו שרת שיושבת עליה תוכנת הJAVA).
אפליקצית הFLEX יורדת לדפדפן אך כאשר אני מנסה ליצור תקשורת (socket) לתוכנת הJAVA - יש הודעת שגיאה של security.
הבנתי שצריך להוסיף קובץ cross-domain-policy ,
השאלה שלי היא לאן להוסיף אותו (לשרת שאפליקצית הFLEX יושב עליו או לשרת שתוכנת הJAVA יושב עליו)?
לאיזו תיקיה להוסיף?
איך אני מקשר בין אפליקצית הflex לקובץ הזה?
אשמח לתשובות, דוד
היי דוד,
האם השרתים הם אותו דומיין? אם כן לא אמורה להיות בעיה מעל פורט 1024. אם לא, אז צריך באמת להוסיף קובץ crossdomain או להתקין את התוכנה למעלה (אם מדובר ב-windows).
אחרת יש שתי אפשרויות:
בעקרון ה-flash player מנסה לפנות ל-port 843 בשביל לקבל אישור מה-crossdomain אז אתה יכול להוסיף מודול לשרת ה-java שלך שיאזין בפורט הזה ויזרוק לכל פניה אליו את ה-crossdomain.
האפשרות השניה היא לחכות שאני אוציא את גרסת ה-linux
גדי
היי גדי מה שלומך…
זה עובד היטב על XP אך לא על vista.
התוכנה נתקעת בהודעה שהיישום נכשל מאחר שתצורת "זה לצד זה" שלו שגויה.
רעיונות…
היי תומר,
כנראה שה-binding שונה ב-vista. מקוה שבקרוב אני אעלה גרסאות גם לויסטה וללינוקס.
@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 או לפחות תאור שלו(, כדי שאוכל לשלב בתוכנה שלי ?
תודה,
גיל.
לידיעתכם, פרסמתי את הקוד כאן:
http://tinyurl.com/lwhxjk
@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] = ";
מצטער על שיבוש הטקטס של הקוד בהדבקה,
גיל.
@gadi_sr
גדי,
נראה שה-PolicyServer אפקטיבי רק כשמריצים אותו מאותה הספריה שבה נמצא ה-HTML
שמארח את ה-FLASH.
האם יש דרך לעקוף את העניין כך שאוכל להריץ את ה-PolicyServer ממקום אחר ?
תודה,
גיל.
הרעיון בקובץ crossdomain הוא לאפשר לקבצי פלאש לבצע שאילתות מ-domain ספציפי. ה-policy server עצמו לא קשור לספריה, הוא צריך קבצי conf.txt ו-crossdomain.xml שיהיו בספריה איתו בשביל ההגדרות. הדבר היחיד שצריך לדאוג זה שהוא יאזין על אותו דומיין שבו נמצא הפורט אליו אתה רוצה לפנות אחכ.
לאיזה סוג שרת אתה פונה?
@gadi_sr
הי גדי,
מצטער על האיחור.
הבעיה נפתרה (למעשה היא בכלל לא היתה קשורה לספריות).
הסרבר עובד ללא תקלות !
תודה,
גיל.
שלום גדי
אנחנו מנסים לייצר תקשורת בין שרת לקוח באמצעות 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/
תודה
אלישבע
אופציה נוספת לכל מעונין - מודול ל-APACHE שמתקשר בפרוטוקול של ADOBE
http://www.beamartyr.net/articles/adobepolicyfileserver.html
@אלישבע
גם בפורטים מעל 1024 ישנה בעיית security כאשר פונים ל:xmlsocket protocol לדוגמא ב-smartfoxserver הסיטואציה קיימת בכל תקשורת לפורט שהוא.
@יצחק
אחלה פתרון!