# Same origin policy

In informatica, la same origin policy (regola della stessa origine) è un importante concetto di sicurezza informatica per un ampio gruppo di linguaggi di scripting lato client, come per esempio JavaScript. La regola permette agli script in esecuzione in pagine che provengono dallo stesso sito di accedere ai reciproci metodi e proprietà senza specifiche restrizioni, impedendo invece l'accesso alla maggior parte dei metodi e delle proprietà tra pagine provenienti da siti diversi.
Questo meccanismo è diventato di particolare importanza per le moderne applicazioni web che dipendono in modo esteso dai cookie HTTP per mantenere le sessioni utente autenticate, dal momento che i server agiscono in base alle informazioni dei cookie per mostrare informazioni riservate o per effettuare azioni di cambio di stato. Una rigorosa separazione tra i contenuti che provengono da siti non correlati tra loro deve essere garantita dal lato client per prevenire la perdita dell'integrità e riservatezza dei dati.

## Storia

Il concetto di same origin policy è da far risalire a Netscape Navigator 2.0. Tutti i browser moderni usano una versione molto simile al progetto progenitore; i suoi principi sono spesso estesi anche per altri linguaggi di scripting come per esempio Adobe Flash o per meccanismi diversi dalla manipolazione diretta del DOM, come per esempio XMLHttpRequest.

## Regole per la determinazione dell'origine

Il termine "origine" è definito usando il nome di dominio, il protocollo di livello di applicazioni usato, e (nella maggior parte dei browser) la porta TCP del documento HTML di cui vengono eseguiti gli script. Due risorse sono considerate avere la stessa origine se e solo se tutti e tre i valori sono esattamente gli stessi. Per illustrare meglio il concetto, la seguente tabella riporta i risultati del controllo della same origin policy rispetto all'URL "http://www.example.com/dir/page.html".
| URL controllato | Risultato | Motivo |
| http://www.example.com/dir/page.html | Successo | Stesso protocollo e host |
| http://www.example.com/dir2/other.html | Successo | Stesso protocollo e host |
| http://www.example.com:81/dir/other.html | Fallimento | Stesso protocollo e host ma porta diversa |
| https://www.example.com/dir/other.html | Fallimento | Protocollo diverso |
| http://en.example.com/dir/other.html | Fallimento | Host diverso |
| http://example.com/dir/other.html | Fallimento | Host diverso (è necessario che siano esattamente uguali) |
| http://v2.www.example.com/dir/other.html | Fallimento | Host diverso (è necessario che siano esattamente uguali) |

## Logica aggiuntiva del document.domain

Un'importante estensione della same origin policy prevista per l'accesso al DOM da parte di JavaScript (ma non per la maggior parte degli altri tipi di controllo di "stessa origine") è che due siti che condividono uno stesso dominio di secondo livello possono optare di comunicare malgrado non abbiano lo stesso host se entrambi impostano la propria proprietà DOM document.domain alla comune parte destra del proprio nome di host.
Per esempio, se http://en.example.com/ e http://fr.example.com/ entrambi impostassero document.domain a "example.com", a partire da quel momento, essi potrebbero considerarsi come aventi la stessa origine nel caso si stiano eseguendo modifiche del DOM.

## Espedienti

Per permettere agli sviluppatori di eludere la Same Origin Policy, sempre però in maniera controllata, esistono un certo numero di "hack" come l'utilizzo dell'Identificatore di Frammento o la proprietà window.name per passare dati tra documenti che risiedono su domini differenti. Con l'avvento dello standard HTML5 è stato finalmente formalizzato a tale scopo l'interfaccia postMessage, che è però disponibile solo nei browser più recenti.
Per supportare i browser più vecchi, può essere usata la libreria JavaScript easyXDM che fornisce un'API (interfaccia) unificata sia per l'interfaccia postMessage che per un certo numero di hack usati per permettere la Cross Domain Communication (XDM) (comunicazione tra diversi domini). Questa libreria permette anche di creare metodi per effettuare chiamate di procedure remote, e può quindi essere usata per accedere facilmente a metodi con argomenti in ingresso e valori di ritorno che valicano i confini del dominio; questo sempre garantendo che la comunicazione sia sicura. easyXDM è al momento usata dai maggiori siti come Disqus, Twitter e Scribd.