2013-04-02 4 views
8

Mamy jedną stronę html i jeden serwer node.js, który obsługuje tę witrynę. Strona internetowa i serwer wymieniają dane za pomocą socke.io. Znaleźliśmy to w dokumentacji:jak ustawić początki socket.io, aby ograniczyć połączenia do jednego adresu URL?

początki domyślne do*:* pochodzeniu, które są dopuszczone do łączenia się z serwerem Socket.IO.

Nasz html.site jest na http://questionexample.com/page1. Tylko ta strona może łączyć się z naszym serwerem. (Ale każdy może połączyć się z tą witryną.) Jak musimy ustalić pochodzenie?

Odpowiedz

-1

myślę io.set('origins', http://questionexample.com/page1) powinien zrobić to

+0

thx za odpowiedź, ale to nie działa dla nas. Otrzymujemy następujące ostrzeżenie: _właściwe pochodzenie_, gdy ładujemy stronę internetową i ona się nie łączy. –

+0

co próbujesz osiągnąć? Myślę, że pochodzenie to adres IP klienta. Ze względów bezpieczeństwa sugerowane przez Ciebie ograniczenie pochodzenia również nie działa, ponieważ adres URL można łatwo zmienić. Możesz chcieć spojrzeć [Authorization] (https://github.com/LearnBoost/socket.io/wiki/Authorizing) dla klienta. – csicar

+1

Potrzebny jest również numer portu –

8

jakie miałem podobny problem. Spróbuj uruchomić węzeł w trybie produkcyjnym NODE_ENV=production node app.js. miałem ten kod (as recommended here):

io.configure('production', function(){ 
    console.log("Server in production mode"); 
    io.enable('browser client minification'); // send minified client 
    io.enable('browser client etag'); // apply etag caching logic based on version number 
    io.enable('browser client gzip'); // the file 
    io.set('log level', 1);   // logging 
    io.set('transports', [   // all transports (optional if you want flashsocket) 
     'websocket' 
     , 'flashsocket' 
     , 'htmlfile' 
     , 'xhr-polling' 
     , 'jsonp-polling' 
    ]); 
io.set('origins', 'http://questionexample.com/page1:*'); 
}); 

i Węzeł RAN w trybie rozwoju, więc po prostu nie mógł pracować. Po włączeniu trybu produkcji wszystko jest w porządku.

Wiem, że jest późno odpowiedź trochę ale może ktoś inny użyje że

+1

nie działa na socket.io v1 + – felipekm

25

Jeśli kopać w kodzie źródłowym Socket.io znajdziesz takie linie:

var origin = request.headers.origin || request.headers.referer 
    , origins = this.get('origins'); 

... 

var parts = url.parse(origin); 
parts.port = parts.port || 80; 
var ok = 
    ~origins.indexOf(parts.hostname + ':' + parts.port) || 
    ~origins.indexOf(parts.hostname + ':*') || 
    ~origins.indexOf('*:' + parts.port); 

jak ty można zobaczyć, że Socket.io bierze początek (lub referer), który pochodzi od klienta, pobiera nazwę domeny i port, i porównuje z podaną opcją origins.

Tak więc prawidłowe wartości origins są (* oznacza "dowolny"):

  • testsite.com:80
  • http://testsite.com:80
  • http://*:8080
  • *:8080
  • testsite.com:* http://someotherdomain.com:8080(kilka początki oddzielone spacją)
  • testsite.com:*/somepath(gniazdo.IO zignoruje/somepath)
  • *:*

A te są nieważne (bo żaden numer portu):

  • testsite.com
  • http://testsite.com
  • http://testsite.com/somepath

Zwróć również uwagę, że jeśli podasz sub.testsite.com jako wartość początkową, testsite.com będzie pochodzić ważne.