Просмотр полной версии : WebSocket + NodeJs + SocketIO . Ошибка безопасности
Может кто то знать про такую проблему... Не удается подключится к сокету на своем сервере...
Спасибо всем откликнувшимся!
Сначала покажу ошибку
Error #2044: Unhandled securityError:. text=Error #2048: Security sandbox violation: https://pp.vk.me/c307509/u152812740/2e0c7dbd32f6c0.zip cannot load data from http://88.198.13.155:3003/socket.io/1/?time=1367423137699.
at com.pnwrain.flashsocket::FlashSocket()
at com.netease.pomelo::Client/init()
at ru.mamoyan.azo.server::Socket()
at ru.mamoyan.azo::AZO$/connect()
at Main/init()
at net.flashpunk::Engine/onStage()
at flash.display::DisplayObjectContainer/addChild()
at Preloader/startup()
at Preloader/checkFrame()
На клиентской стороне библиотека https://github.com/stokegames/pomelo-flashchat/blob/master/com/netease/pomelo/Client.as основанная на WebSocket SocketIO
На сервере у себя поставил nodejs и запустил скрипты с слушателями:
на порту 3000 - основной серверный код
на порту 843 - код который возвращает crossdomain
Скрипт Crossdomain
var server = require('net').createServer(function(stream){
console.log('connected'); // <-- log —---------
stream.on('error', function (extension) {
console.log('policy.socket.error');
});
stream.on('data',function(){
stream.write('<?xml version="1.0"?>');
stream.write('<cross-domain-policy>');
stream.write('<allow-access-from domain="*" to-ports="*" />');
stream.write('<allow-http-request-headers-from domain="*"/>');
stream.write('<allow-access-from domain="*" to-ports="843"/>');
stream.write('<allow-access-from domain="*" to-ports="3000"/>');
stream.write('</cross-domain-policy>\0');
stream.end();
});
});
server.listen(843, '88.198.13.155');
Код клиента на AS3
Security.loadPolicyFile("http://88.198.13.155:843");
Security.loadPolicyFile("xmlsocket://88.198.13.155:843");
client = new Client();
client.init('88.198.13.155', 3000,null, function():void{
client.addEventListener(ClientEvent.IO_ERROR,onError);
client.addEventListener(ClientEvent.SECURITY_ERROR,onError);
client.addEventListener(ClientEvent.MESSAGE,onMessage);
dispatchEvent(new Event(Event.CONNECT));
trace("Успех!");// -< Вот этого не происходит!! Так как не считывает crossdomain
});
gloomyBrain
01.05.2013, 21:44
Security.loadPolicyFile("http://88.198.13.155:843");
Security.loadPolicyFile("xnlsocket://88.198.13.155:843");
Первое не нужно, второе с опечаткой.
Проверьте, что 843 порт пингуется (по-умолчанию большинство операционных систем не дают запуститься на этом порту).
gloomyBrain, это я здесь просто опечатался... пингуется
http://88.198.13.155:843
Загрузив на сайт, там жму на F12 и вижу что пытается загрузить cross по адресу Request URL:http://88.198.13.155:3000/crossdomain.xml
mikhailk
02.05.2013, 01:01
Запрос на 843 не увидите.
Кроссдоменника по этому адресу нет:
http://88.198.13.155:3000/crossdomain.xml
Однако, не совсем понятно, почему он ломится на этот адрес по порту 3000.
Как подключаете swf?
подключаю загружая в вконтакте..
Может в этом дела? кстати с локального компьютера (с папки) swf открывается и там все работает
вот, в частности https://vk.com/app3551775
mikhailk
02.05.2013, 09:13
На мой взляд, надо все-таки отловить ошибку и получить точное ее значение (добавьте в клиента консоль для вывода ошибок или еще как).
Можно попробовать и в файле политик и в кроссдоменнике (это - два разных файла, правильно?) везде снять ограничения по адресам и портам, может где-то что-то настроено криво.
Ну и все-таки, если подключаться как iframe, то этих проблем точно нет.
я думал что crossdomain это и есть файл политик...)
Я его просто выдаю демоном на сервере на порту 843 ...
как вариант: флешки теперь лежат на https, а сервер у вас http, чтоб работало нужно добавить secure="false"
http://www.adobe.com/devnet-docs/acrobatetk/tools/AppSec/CrossDomain_PolicyFile_Specification.pdf
Нет, дело не в этом (
Я когда делал клиент с XMLSocket - все нормально работало... так как crossdomain грузился по xmlsocket://......
а сейчас этот SocketIO похоже работает совсем по другим линиям связи
вот куда он подключается
ws://88.198.13.155:3000/socket.io/1/flashsocket/le8-4VYn09eZGYzop_5D
Может как то оттуда надо отдавать crossdomain? вот как.. не знаю
import flash.net.Socket; - вот этот класс в конечном итоге подключается к серверу...
Когда подключался через XMLSocket - прокатывало... с тем же кросдоменником
Simplifier
02.05.2013, 17:19
вот куда он подключается
ws://88.198.13.155:3000/socket.io/1/flashsocket/le8-4VYn09eZGYzop_5D
ну так ws - это, судя по всему, протокол вебсокета, а нужен флешсокет же наверно. На странице конфигурирования (https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO) же описано как настраивать протокол, порт кроссдомена и тд. Все по инструкции делал?
Simplifier, Да, там написано что порт по умолчанию 10843,
но Клиент AS3 об этом же не знает. в Сервере ничего специально не настраивал. Все по умолчанию стоит.
Факт в том что с моего компа запускается нормально, а на сайтах нет
Simplifier
02.05.2013, 19:37
Да, там написано что порт по умолчанию 10843,
но Клиент AS3 об этом же не знает
Ну так поменяй его на стандартный для флеша 843. Ну или во флеше запрашивай кроссдомен с этого 10843. Или в чем затык-то?
Что только я не пробовал... ((
Сейчас еще раз попробую все настройки вернуть на default и как ты посоветовал запрашиваnm кроссдомен с этого 10843
Добавлено через 22 минуты
Не вышло....
Никто не знает, как сделать чтобы по адресу http://88.198.13.155:3000/crossdomain.xml ?
Simplifier
02.05.2013, 20:37
А, ну да, по диагонали прочитал и фигню сморозил =)
Добавлено через 6 минут
Security.loadPolicyFile("http://88.198.13.155:843");
Security.loadPolicyFile("xmlsocket://88.198.13.155:843");
client = new Client();
client.init('88.198.13.155', 3000,null, function():void{
client.addEventListener(ClientEvent.IO_ERROR,onError);
client.addEventListener(ClientEvent.SECURITY_ERROR,onError);
client.addEventListener(ClientEvent.MESSAGE,onMessage);
dispatchEvent(new Event(Event.CONNECT));
trace("Успех!");// -< Вот этого не происходит!! Так как не считывает crossdomain
});
Первые 2 строчки бесполезны. Класс Client сам же пытается кроссдомен запросить:
this.policyUrl = policyUrl || ("xmlsocket://" + host + ":843");
Да, видел тоже в клиенте этот код... однако не работает
Simplifier
02.05.2013, 20:54
Может все ж какой-то косяк кроссдоменом, который формируешь? Там же есть ссылка на код для него: https://github.com/stokegames/pomelo-flashpolicyserver/blob/master/lib/server.js . Хотя, раз с XMLSocket работало, то хз
ВОт кстати код кросдоменника
var server = require('net').createServer(
function(stream){
//console.log('connected'); // <-- log —---------
stream.on('error', function (extension) {
console.log('policy.socket.error');
});
stream.on('data',function(){
stream.write('<?xml version="1.0"?>\n');
stream.write('<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">\n');
stream.write('<!-- Policy file for xmlsocket://88.198.13.155 -->\n');
stream.write('<cross-domain-policy>\n');
stream.write('<!-- This is a master socket policy file -->\n');
stream.write('<site-control permitted-cross-domain-policies="all"/>\n');
stream.write('<!-- No other socket policies on the host will be permitted -->\n');
stream.write('<site-control permitted-cross-domain-policies="master-only"/>\n');
stream.write('<!-- Instead of setting to-ports="*", administrators can use ranges and commas -->\n');
stream.write('<!-- This will allow access to ports 123, 456, 457 and 458 -->\n');
stream.write('<allow-access-from domain="*" to-ports="*" secure="false" />\n');
stream.write('</cross-domain-policy>\0');
/*
stream.write('<?xml version="1.0"?>');
stream.write('<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">');
stream.write('<cross-domain-policy>');
stream.write('<allow-access-from domain="*" to-ports="*" />');
stream.write('<site-control permitted-cross-domain-policies="master-only" />');
stream.write('</cross-domain-policy>');
*/
stream.end();
});
});
server.listen(843, '88.198.13.155');
Добавлено через 59 секунд
Сейчас попробую тот
Добавлено через 27 минут
те же яйца, только в профиль ((
mikhailk
02.05.2013, 22:21
ВОт кстати код кросдоменника
Это файл политик все-таки.
У меня работает все по дефолту, без всяких плясок с бубнами. Есть виртуальный сервер по адресу 100.100.100.100 (условно):
1. На 843 порту запущен сервер, который отдает файл политик (пока вообще безо всяких ограничений):
var net = require('net');
var port = 843;
console.log("SecurityPolicy server started on port " + port);
var server = net.createServer(function(stream) {
stream.setEncoding('utf8');
stream.addListener('data', function(mess) {
var policy = '<?xml version="1.0" ?> <!DOCTYPE cross-domain-policy SYSTEM '
+'"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">'
+'<cross-domain-policy> <allow-access-from domain="*" '
+'to-ports="*" /> </cross-domain-policy>\0';
stream.write(policy);
console.log('SecurityPolicy sended to user, ip: '+stream.remoteAddress);
});
});
server.listen(port);
2. В корне сервера (каталог www) лежит кроссдоменник (тоже пока безо всяких настроек):
<cross-domain-policy>
<allow-access-from domain="*" to-ports="*"/>
</cross-domain-policy>
3. Непосредственно сокет-сервер (node.js) висит на порту 8080.
4. В каталоге на сервере лежит html-файл с флешкой, в которой подключение к сокет-серверу реализовано так:
socket = new FlashSocket("100.100.100.100:8080");
socket.addEventListener(FlashSocketEvent.CONNECT, onConnect);
Все заработало сразу после сборки.
mikhailk, Спасибо кончено, а попробуйте теперь переложить клиент на другой сервер?
Можете прислать ваш пример?
mikhailk
02.05.2013, 23:49
Все правильно, та же ситуация - ломится за кроссдоменником на тот же порт, что и у сокет-сервера.
Кстати, вот тут смотрели?
Сам не проверял, но у человека вроде все заработало:
http://www.flasher.ru/forum/showthread.php?t=194536
На третьей странице вверху.
mikhailk!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Спасибо!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Этож надо было додуматься! Ааааааааааааааааааааааааааааааааааааааа Я так рад!!!!
Всем Спасибо!!!
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.