2013-04-02 8 views
8

Abbiamo un sito html e un server node.js che serve quel sito web. Il sito Web e il server scambiano dati utilizzando socke.io. Abbiamo trovato questo nella documentazione:come impostare socket.io origini per limitare le connessioni a un url

origini default*:* Le origini che sono autorizzati a connettersi al server Socket.IO.

Il nostro html.site è il http://questionexample.com/page1. Solo questo sito può connettersi al nostro server. (Ma chiunque può connettersi a quel sito Web.) Come dobbiamo impostare le origini?

risposta

-1

Penso io.set('origins', http://questionexample.com/page1) dovrebbe farlo

+0

thx per la tua risposta, ma questo non funziona per noi. Riceviamo il seguente avviso: _illegal origin_ quando cariciamo il sito Web e non si connette. –

+0

cosa stai cercando di ottenere? Penso che l'origine sia l'ip del cliente. Per sicurezza la limitazione dell'origine, che hai suggerito non funziona, perché l'url potrebbe essere cambiato facilmente. Potresti voler dare un'occhiata a [Autorizzazione] (https://github.com/LearnBoost/socket.io/wiki/Authorizing) per il cliente. – csicar

+1

È necessario anche un numero di porta –

8

ho avuto problema simile. Provare a eseguire il nodo in modalità di produzione NODE_ENV=production node app.js. ho avuto che il codice (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:*'); 
}); 

e Nodo Rans in modalità di sviluppo in modo che semplicemente non potrebbe funzionare. Dopo aver attivato la modalità di produzione, tutto è ok.

So che si tratta di una risposta tardiva po 'ma forse qualcun altro che utilizzerà

+1

non funziona su socket.io v1 + – felipekm

25

Se si scava nel codice sorgente Socket.io, troverete queste linee:

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); 

Come si può vedere Socket.io prende origine (o referer) proveniente dal client, recupera nome dominio e porta, e confronta con l'opzione origins specificata.

Così i origins valori validi sono (* significa "qualsiasi"):

  • testsite.com:80
  • http://testsite.com:80
  • http://*:8080
  • *:8080
  • testsite.com:* http://someotherdomain.com:8080(origini multiple separate da uno spazio)
  • testsite.com:*/somepath(presa.io ignorerà/somepath)
  • *:*

E questi non sono validi (perché nessun numero di porta):

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

Si noti inoltre che se si specifica sub.testsite.com come valore di origine, testsite.com sarà valido origine.

Problemi correlati