WebSocket: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
rimuovo annotazioni non tradotte dall'inglese e che danno errore
Nessun oggetto della modifica
Etichette: Modifica da mobile Modifica da web per mobile
 
(13 versioni intermedie di 12 utenti non mostrate)
Riga 1:
'''WebSocket''' è una tecnologiaun [[webprotocollo di comunicazione|protocollo]] che fornisce canali di comunicazione [[full-duplex]] attraverso una singola connessione [[Transmission Control Protocol|TCP]]. L'[[Application programming interface|API]] del WebSocket è stata standardizzata dal [[World Wide Web Consortium|W3C]] e il protocollo WebSocket è stato standardizzato dall'[[Internet Engineering Task Force|IETF]] come RFC 6455.
 
WebSocket è disegnatoprogettato per essere implementato sia lato [[browser]] che [[lato server]], ma può essere utilizzato anche da qualsiasi applicazione client-server. Il protocollo è un'implementazione basata sul protocollo TCP. La sua unica correlazione con l'HTTP è nel modo in cui fa l'[[handshake]] durante una Upgrade request tra server. Il protocollo WebSocket permette maggiore interazione tra un browser e un server, facilitando la realizzazione di applicazioni che forniscono contenuti e giochi in tempo reale. Questo è reso possibile fornendo un modo standard per il server di mandare contenuti al browser senza dover essere sollecitato dal client e permettendo ai messaggi di andare e venire tenendo la connessione aperta.
 
In aggiunta, le comunicazioni sono fatte attraverso la porta TCP 80, che è un vantaggio per gli ambienti che bloccano porte non standard utilizzando dei [[firewall]]. Il protocollo WebSocket è supportato da numerosi browser, incluso [[Google Chrome]], [[Internet Explorer]], [[Firefox]], [[Safari (browser)|Safari]] e [[Opera (browser)|Opera]].
Riga 10:
!Data del progetto
!Internet Explorer
!Firefox<ref>{{citeCita web|url=https://developer.mozilla.org/en/WebSockets|titletitolo=WebSockets (support in Firefox)|publishereditore=Mozilla Foundation|websitesito=developer.mozilla.org|datedata=2011-09-30 settembre 2011|access-dateaccesso=2011-12-10 dicembre 2011|dataarchivio=26 maggio 2012|urlarchivio=https://web.archive.org/web/20120526230019/https://developer.mozilla.org/en/WebSockets|urlmorto=sì}}</ref> (PC)
!Firefox (Android)
!Chrome (PC, Mobile)
Riga 18:
|-
![https://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-75 hixie-75]
|4 Febbraiofebbraio, 2010
|
|
Riga 28:
|-
![https://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-76 hixie-76][https://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-00 hybi-00]
|6 Maggiomaggio
2010
23 Maggiomaggio 2010
|
|4.0 (disabilitato)
Riga 40:
|-
![https://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07 hybi-07], v7
|22 Aprileaprile 2011
|
|6<ref>{{citeCita web|url=https://bugzilla.mozilla.org/show_bug.cgi?id=640003|titletitolo=Bug 640003 - WebSockets - upgrade to ietf-06|publishereditore=Mozilla Foundation|datedata=8 marzo 2011-03-08|access-dateaccesso=10 dicembre 2011-12-10}}</ref>
|
|
Riga 50:
|-
![https://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10 hybi-10], v8
|11 Luglioluglio 2011
|
|7<ref>{{citeCita web|url=https://bugzilla.mozilla.org/show_bug.cgi?id=640003#c91|titletitolo=Bug 640003 - WebSockets - upgrade to ietf-07(comment 91)|publishereditore=Mozilla Foundation|datedata=22 luglio 2011-07-22}}</ref>
|7
|14<ref>{{citeCita web|url=https://code.google.com/p/chromium/issues/detail?id=64470|titletitolo=Chromium bug 64470|websitesito=code.google.com|datedata=2010-11-25 novembre 2010|access-dateaccesso=2011-12-10 dicembre 2011}}</ref>
|
|
Riga 62:
|Dicembre
2011
|10<ref>{{citeCita web|url=https://blogs.msdn.com/b/ie/archive/2012/03/19/websockets-in-windows-consumer-preview.aspx|titletitolo=WebSockets in Windows Consumer Preview|publishereditore=Microsoft|workopera=IE Engineering Team|datedata=19 marzo 2012-03-19|access-dateaccesso=23 luglio 2012-07-23}}</ref>
|11
|11
|16<ref>{{citeCita web|url=https://trac.webkit.org/changeset/97249|titletitolo=WebKit Changeset 97247: WebSocket: Update WebSocket protocol to hybi-17|websitesito=trac.webkit.org|access-dateaccesso=10 dicembre 2011-12-10}}</ref>
|6
|12.10<ref>{{citeCita web|url=http://my.opera.com/ODIN/blog/2012/08/03/a-hot-opera-12-50-summer-time-snapshot|titletitolo=A hot Opera 12.50 summer-time snapshot|publishereditore=Opera Developer News|datedata=3 agosto 2012-08-03|access-dateaccesso=3 agosto 2012-08-03|archive-urlurlarchivio=https://web.archive.org/web/20120805234006/http://my.opera.com/ODIN/blog/2012/08/03/a-hot-opera-12-50-summer-time-snapshot|archive-datedataarchivio=5 agosto 2012-08-05}}</ref>
|4.4
|}
 
== Handshake del protocollo ==
Per stabilire una connessione WebsocketWebSocket, il client invia una richiesta di [[handshake]] ede il server invia una risposta come indicato nell'esempio<ref>{{Cite IETF|title=RFC 6455 The WebSocket Protocol|publisher=[[Internet Engineering Task Force|IETF]]|section=1.2|sectionname=Protocol Overview|rfc=6455|date=December 2011|author1=Ian Fette|author2=Alexey Melnikov}}</ref>.
 
Richiesta del client:
Riga 95:
</syntaxhighlight>
 
L'handshake ricorda l'implementazione HTTP così il server può gestirla come una normale richiesta di connessione sulla stessa porta. All'interno della richiesta vengono specificati degli opportuni campi che identificano una richiesta WebsocketWebSocket.
 
Ognuna delle linee termina con un EOL, <code>\n</code> o <code>\r\n</code> e deve essere presente una linea vuota alla fine.
 
Il client invia un <code>Sec-WebSocket-Key</code> che è un valore casuale codificato con [[base64]]. Per generare un codice di risposta, il codice <code>258EAFA5-E914-47DA-95CA-C5AB0DC85B11</code> è concatenato alla chiave ricevuta, che '''non''' viene decodificata. Il risultato èviene codificatodato conin input alla funzione hash [[SHA-1]] e il ''digest'' viene successivamente codificato con base64. Infine, la stringa risultante viene inserita nella risposta con l'header <code>Sec-WebSocket-Accept</code>.
Infine, la stringa risultante viene inserita nella risposta con l'header <code>Sec-WebSocket-Accept</code>.
 
Dettagli per generare la chiave di risposta:
* Della stringa concatenata <code>x3JJHMbDL1EzLkh9GBhXDw==258EAFA5-E914-47DA-95CA-C5AB0DC85B11</code> codificatasi concalcola il digest SHA-1, restituisce il valoreche esadecimalevale <code>0x1d29ab734b0c9585240069a6e4e3e91b61da1969</code>.
* Codificando questai stringabyte del digest con base64 si ottiene il codice <code>HSmrc0sMlYUkAGmm5OPpG2HaGWk=</code>, che è il valore inserito nella risposta.
Quando viene stabilita la connessione, il client ed il server possono inviare dati tramite il WebsocketWebSocket in entrambe le direzioni<ref>{{citeCita web|url=https://trac.tools.ietf.org/wg/hybi/trac/wiki/FAQ|titletitolo=Main Goal of WebSocket protocol|publishereditore=IETF|access-dateaccesso=25 Julyluglio 2015|quotecitazione=The computation [...] is meant to prevent a caching intermediary from providing a WS-client with a cached WS-server reply without actual interaction with the WS-server.}}</ref><ref>{{Cite IETF|title=RFC 6455 The WebSocket Protocol|page=8|publisher=[[Internet Engineering Task Force|IETF]]|section=1.3|sectionname=Opening Handshake|rfc=6455|date=December 2011|author1=Ian Fette|author2=Alexey Melnikov}}</ref><ref>{{Cite IETF|title=RFC 6455 The WebSocket Protocol|publisher=[[Internet Engineering Task Force|IETF]]|section=5.2|sectionname=Base Framing Protocol|rfc=6455|date=December 2011|author1=Ian Fette|author2=Alexey Melnikov}}</ref><ref>{{cite IETF|draft=draft-ietf-hybi-websocket-multiplexing|title=A Multiplexing Extension for WebSockets|author1=John A. Tamplin|author2=Takeshi Yoshino|publisher=[[Internet Engineering Task Force|IETF]]|year=2013}}</ref>.
 
== Estensioni sperimentali ==
Google Chrome ha un'opzione a riga di comando (<code>--enable-websocket-over-spdy</code>) che permette di abilitare una versione sperimentale dei WebsocketWebSocket veicolati dal protocollo [[SPDY]].<ref>{{Cita web|url=http://peter.sh/experiments/chromium-command-line-switches/ |titolo=List of Chromium Command Line Switches |editore=Peter.sh |data= |accesso=10 dicembre 2011}}</ref>
 
== Sviluppo ==
Utilizzando il Google Chrome Developer Tools, lo sviluppatore può controllare l'handshake ed i pacchetti che vengono scambiati nel canale.<ref>{{Cita libro |cognome=Wang |nome=Vanessa |cognome2=Salim |nome2=Frank |cognome3=Moskovits |nome3=Peter |titolo=The Definitive Guide to HTML5 WebSocket |url=http://my.safaribooksonline.com/book/-/9781430247401/appendix-a-inspecting-websocket-traffic/sec1_xhtml |datadiaccesso=7 aprile 2013 |anno=2013 |mese=febbraio |editore=Apress |capitolo=APPENDIX A: WebSocket Frame Inspection with Google Chrome Developer Tools |isbn=978-1-4302-4740-1 |urlmorto=sì |accesso=19 luglio 2013 |urlarchivio=https://web.archive.org/web/20151231184436/http://my.safaribooksonline.com/book/-/9781430247401/appendix-a-inspecting-websocket-traffic/sec1_xhtml |dataarchivio=31 dicembre 2015 }}</ref>
 
== Implementazione del server web ==
[[Nginx]] supporta WebSocket dal 2013, implementato nella versione 1.3.13 inclusa la funzione di proxy inverso e bilanciamento del carico delle applicazioni WebSocket<ref>{{CiteCita web|url=https://www.nginx.com/blog/websocket-nginx/|titletitolo=Using NGINX as a WebSocket Proxy|datedata=May 17, maggio 2014|websitesito=NGINX}}</ref>.
 
[[Apache HTTP Server]] supporta WebSocket da luglio 2013, implementato nella versione 2.4.5<ref>{{CiteCita web|url=http://httpd.apache.org/docs/trunk/new_features_2_4.html|titletitolo=Overview of new features in Apache HTTP Server 2.4|websitesito=Apache}}</ref><ref>{{CiteCita web|url=https://www.apachelounge.com/Changelog-2.4.html|titletitolo=Changelog Apache 2.4|websitesito=Apache Lounge}}</ref>.
 
[[Internet Information Services]] ha aggiunto il supporto per WebSocket nella versione 8 che è stata rilasciata con [[Windows Server]] 2012<ref>{{citeCita web|url=https://docs.microsoft.com/en-us/iis/get-started/whats-new-in-iis-8/iis-80-websocket-protocol-support|titletitolo=IIS 8.0 WebSocket Protocol Support|datedata=28 Novembernovembre 2012|workopera=Microsoft Docs|access-dateaccesso=18 febbraio 2020-02-18}}</ref>.
 
[[Lighttpd]] supporta WebSocket dal 2017, implementato nella versione 1.4.46.<ref>[https://redmine.lighttpd.net/projects/lighttpd/wiki/Release-1_4_46]</ref> lighttpd mod_proxy può fungere da proxy inverso e bilanciatore del carico delle applicazioni WebSocket. lighttpd mod_wstunnel può facilitare un tunnel WebSocket, consentendo a un client di utilizzare WebSocket per eseguire il tunneling di un protocollo più semplice, come [[JavaScript Object Notation|JSON,]] a un'applicazione di backend.
 
== Considerazioni sulla sicurezza ==
A differenza delle normali richieste HTTP tra domini, le richieste WebSocket non sono limitate dalla politica della stessa origine. Pertanto i server WebSocket devono convalidare l'intestazione "Origin" rispetto alle origini previste durante la creazione della connessione, per evitare attacchi di dirottamento WebSocket tra siti (simili alla contraffazione di richieste tra siti ), che potrebbero essere possibili quando la connessione è autenticata con cookie o autenticazione [[Hypertext Transfer Protocol|HTTP]]. È preferibile utilizzare token o meccanismi di protezione simili per autenticare la connessione WebSocket quando vengono trasferiti [[dati sensibili]] (privati) su WebSocket<ref>{{citeCita web|url=https://www.christian-schneider.net/CrossSiteWebSocketHijacking.html#main|titletitolo=Cross-Site WebSocket Hijacking (CSWSH)|authorautore=Christian Schneider|workopera=Web Application Security Blog|datedata=August 31, agosto 2013}}</ref>.   Un esempio dal vivo di vulnerabilità è stato visto nel 2020 sotto forma di Cable Haunt.
 
== Attraversamento proxy ==
Le implementazioni del client del protocollo WebSocket tentano di rilevare se l' agente utente è configurato per utilizzare un proxy durante la connessione all'host e alla porta di destinazione e, in tal caso, utilizza il [[metodo HTTP]] CONNECT per impostare un tunnel persistente.
 
Sebbene il protocollo WebSocket stesso non sia a conoscenza dei server proxy e dei firewall, presenta un handshake compatibile con HTTP che consente ai server HTTP di condividere le loro porte HTTP e HTTPS predefinite (443 e 80) con un gateway o un server WebSocket. Il protocollo WebSocket definisce un prefisso ws: // e wss: // per indicare rispettivamente una connessione WebSocket e WebSocket Secure. Entrambi gli schemi utilizzano un meccanismo di aggiornamento HTTP per eseguire l'aggiornamento al protocollo WebSocket. Alcuni server proxy sono trasparenti e funzionano bene con WebSocket; altri impediranno a WebSocket di funzionare correttamente, causando il fallimento della connessione. In alcuni casi, potrebbe essere necessaria una configurazione aggiuntiva del server proxy e alcuni server proxy potrebbero dover essere aggiornati per supportare WebSocket.
 
Se il traffico WebSocket non crittografato passa attraverso un server proxy esplicito o trasparente senza il supporto di WebSocket, è probabile che la connessione non riesca<ref>{{citeCita web|url=http://www.infoq.com/articles/Web-Sockets-Proxy-Servers|titletitolo=How HTML5 Web Sockets Interact With Proxy Servers|websitesito=Infoq.com|datedata=March 16, marzo 2010|publishereditore=C4Media Inc.|authorautore=Peter Lubbers|access-dateaccesso=10 dicembre 2011-12-10}}</ref>.
 
Se viene utilizzata una connessione WebSocket crittografata, l'utilizzo di [[Transport Layer Security]] (TLS) nella connessione WebSocket Secure garantisce che un comando HTTP CONNECT venga emesso quando il browser è configurato per utilizzare un server proxy esplicito. Questo imposta un tunnel, che fornisce comunicazioni TCP end-to-end di basso livello attraverso il proxy HTTP, tra il client WebSocket Secure e il server WebSocket. Nel caso di server proxy trasparenti, il browser non è a conoscenza del server proxy, quindi non viene inviato alcun CONNECT HTTP. Tuttavia, poiché il traffico cablato è crittografato, i server proxy trasparenti intermedi possono semplicemente consentire il passaggio del traffico crittografato, quindi è molto più probabile che la connessione WebSocket riesca se viene utilizzato WebSocket Secure. L'utilizzo della crittografia non è privo di costi in termini di risorse, ma spesso fornisce la più alta percentuale di successo poiché viaggerebbe attraverso un tunnel sicuro.
 
Una bozza di metà 2010 (versione hixie-76) ha rotto la compatibilità con proxy inversi e gateway includendo otto byte di dati chiave dopo le intestazioni, ma non pubblicizzando tali dati in un'intestazione<code>Content-Length: 8</code><ref>{{citeCita web|url=https://www.ietf.org/mail-archive/web/hybi/current/msg02149.html|titletitolo=WebSocket -76 is incompatible with HTTP reverse proxies|websitesito=ietf.org|publishereditore=Internet Engineering Task Force|datedata=6 luglio 2010-07-06|access-dateaccesso=10 dicembre 2011-12-10|authorautore=Willy Tarreau|typetipo=email}}</ref>. Questi dati non sono stati inoltrati da tutti gli intermedi, il che potrebbe portare al fallimento del protocollo. Le bozze più recenti (ad esempio, hybi-09<ref>{{cite IETF|url=https://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-09#section-11.4|title=The WebSocket protocol, draft hybi-09|sectionname=Sec-WebSocket-Key|section=11.4|date=June 13, 2011|access-date=June 15, 2011|author=Ian Fette}}</ref>) inseriscono i dati chiave in <code>Sec-WebSocket-Key</code>un'intestazione, risolvendo questo problema.
 
== Voci correlate ==
Line 146 ⟶ 145:
 
{{Browser Internet}}
{{Interfacce web}}
{{Portale|internet|telematica}}