вторник, декабря 23, 2008

Сокеты, политика безопасности и SmartFox

Наконец-то я вплотную столкнулся с вопросом безопасности.
А собственно, когда настало время выложить многопользовательскую игру под SmartFox, я столкнулся со следующей проблемой: игра лежит на некотором доменном имени (somegame.ru). Сокетное соединение к SmartFoxServer (XX.XX.XX.XX:9339) просто не проходит:
"Ошибка: Запрос ресурса на xmlsocket://XX.XX.XX.XX:9339 источника запроса из h_ttp://somegame.ru.../Name.swf отклонен из-за отсутствия разрешений в файле политики."
"*** Нарушение безопасности изолированной среды *** Подключение к XX.XX.XX.XX:9339 прервано – нет разрешения от h_ttp://somegame.ru.../Name.swf".
Причем, при локальном запуске всё работает превосходно.

Долго я рыл статьи, форумы по кроссдоменным проблемам, особенности политики безопасности сокетных соединений, нашел много полезного:
External data not accessible outside a Flash movie's domain - общепознавательная статейка.
Про crossdomain.xml и как продолжение -
Security policy. Error #2044: Unhandled securityError:. text=Error #2048: Security sandbox violation. Поисследовал данные вопросы, ознакомился со статьей -
Setting up a socket policy file server.
Затем не обнаружив ничего подходящего, поискал аналогичные вопросы на ресурсе SmartFox:
bluebox problem, donot connect - имеют косвенное отношение к проблеме, но могут пригодиться.
Troubleshooting common runtime problems дает общее представление о проблемах связи и наводит на главную статью по теме:

Flash Security Policy guidelines.
После поверхностного ознакомления со статьей, у меня сразу закралось подозрение - я проверил файл конфигурации config.xml и в секции
PolicyAllowedDomains конечно же не обнаружил записи AllowedDomain, соответствующей нужного мне домена. Админы, включили какие угодно домены, но только не тот который мне был нужен.
Прописываем нужный домен, рестартуем сервер и мгновенно получаем соединение.
Проблема, к счастью, является простейшей. Получаем урок: прежде чем отчаиваться и глубоко вкапываться в интернет и документацию, хорошо для начала просто еще раз проверить конфигурацию сервера.

16 комментариев:

Анонимный комментирует...

у меня помоему там стоял домен "*"

Анонимный комментирует...

Здравствуйте, не могли бы мне разобраться с моей похожей проблемой? Вашу ICQ не нашел, оставлю свою 614-14-66, напишите пожалуйсто!

Racer комментирует...

Если смогу, помогу :)
У меня скайп - racer242

Bulec комментирует...

Помогите пожалуйста.
Как такое может быть?

(ActionScript 2.0, .jpg и .swf лежат на одном сервере)

1)Все отлично, изображение загружается в мувик:

url = 'http://project1/Uploads/Images/gallery/photo1.jpg';
mcLoader.loadClip(url,image_mc);

2)Все плохо, изображение не загружается:

url = gallery.childNodes[0].childNodes[0].nodeValue;

trace(url);

mcLoader.loadClip(url,image_mc);

******************************************************

Окно Output:

http://project1/Uploads/Images/gallery/photo1.jpg

*** Нарушение безопасности изолированной среды ***
Подключение к
http://project1/Uploads/Images/gallery/photo1.jpg
прервано – нет разрешения от file:///C|/WebServers/home/project1/www/project1.swf

Racer комментирует...

Ну здесь всё очевидно, локальная политика безопасности не дает забрать photo1.jpg с удаленного сервера. Судя по сообщению, ты запускаешь project1.swf локально. Если он будет запускаться с сервера, через http://..., то раз они лежат на одном сервере всё опять будет работать :).
Если всё же надо отлаживать локально, установи параметр в Publish Settings Local playback security в access network only.

Bulec комментирует...

На серваке - не работает.
У меня на локальном сервере - не работает.

СТРАННОСТЬ в том, что если переменной задавать значение (адрес изображения) вручную, то флеш не блокирует соединение, а вот если эта переменная была заполненная из XML - блокирует. Как он различает их вообще? И почему блокирует, как буд-то идет соединение двух мувиков на разных доменах?

Racer комментирует...

Попробуй указывать не абсолютный а относительный адрес. И проверь еще раз, может в логике ошибки есть.

Bulec комментирует...

Пробовал, относительный отлично работает, но вот только нужны прямые, да и вообще уже вопрос принципа - с ума схожу второй день : )

Racer комментирует...

1. Если файлы лежат на одном сервере, то зачем абсолютные?
2. Если есть необходимость в абсолютных путях, то значит надо будет иметь возможность брать файлы с других серверов? Тогда рекомендую почитать доки про кроссдоменные дела.
3. Не может быть разницы, как задается путь - константой или через хмл - тут мало вероятна ошибка, раз путь трейсится верно.
4. Меня очень смущает что здесь разные домены:
http://project1/Uploads/Images/gallery/photo1.jpg - домен project1

file:///C|/WebServers/home/project1/www/project1.swf - локальный запуск.

Bulec комментирует...

Ответ как всегда был под носом.

Если присмотреться в текст окна Output, то можно заметить маааленький нюанс - между "Подключение к" и "http://project1/Uploads/Images/gallery/photo1.jpg" есть переход на новую строку, которого в идеальном мире не существовало бы и я бы не потратил в тупую последние выходные лета.
Но я почему-то все равно счастлив : ) извините за беспокойство и Спасибо огромное за помощь.

Racer комментирует...

Мда, о таком подумать я даже не решался :)
Бывает.

Sovik комментирует...

Здравствуйте! Спасибо за Ваш блог. Помог реально изучить smartfoxserver.
У меня сейчас такая проблема. Я с помощью extension серверного скрипта обращаюсь к стороннему серверу, в ответ, я точно знаю, приходит в формате XML. Но не получается его распарсить, и вообще как то прочитать

Очень нужен совет!

Racer комментирует...

Почему не получается? Если он приходит - значит это можно посмотреть и понять что с ним делать :) может это не XML а к примеру json ? Там разные форматы обмена данных можно использовать.

Sovik комментирует...

Очень нужен совет по работе с смартфокс с другим сервером. Как отправлять, получать и обрабатывать запросы.
Может не через сервеный скрипт (extension). А как то еще?

Sovik комментирует...

Да, ответ приходи в формате XML. Так как делаю приложение для API вконтакте

var request = "http://api.vkontakte.ru/api.php?api_id=1671807&method=getVariable&key=1280&sig=0cd85aaeab01dfae3ba055a319c705f2"

var _send = new LoadVars()
var _load = new LoadVars()

_load.onLoad = function(success, errorMsg)
{
if (success)
{
var response = { }
response.answer = что здесь написать???
_server.sendResponse(response, -1, null, [user])
}
}

пробовал trace(this), trace(_load). В обоих случаях выдает [object Object]

response.answer = this или _load почему то не передаются в приложение

Sovik комментирует...

Добрый день!
Хотелось бы узнать, что делать в такой ситуации. При долгом простое приложения теряется соединение с сервером. Можно ли как то отследить данное событие? И что делать? Заново вызывать connect? Или как вариант посылать с некоторым интервалом запросы на сервер, чтобы не было простоя?

Спасибо!