Blog · Publicado originalmente em inglês em .
Um site publicado é um arquivo que um estranho escreveu. Ele roda num navegador, o que quer dizer que roda JavaScript, o que quer dizer que pode fazer tudo o que o navegador deixa fazer a origem de onde ele é servido. Essa última parte da frase é o projeto inteiro.
Quanto vale uma origem
Os navegadores não protegem os arquivos uns dos outros. Protegem as origens umas das outras: o esquema, o host e a porta, juntos. Os cookies, o armazenamento local e a possibilidade de ler a resposta de outro site param todos nessa fronteira, e dentro dela não há fronteira nenhuma.
Então, se um site que alguém publicou fosse servido do mesmo host do aplicativo em que as pessoas entram com a conta, ele ficaria dentro da origem do aplicativo. Não perto dela. Dentro. Todo cookie que a sessão usa iria junto nas requisições dele, e ele mesmo poderia fazer essas requisições.
O caminho de limpar o arquivo, em resumo
A alternativa é tirar do arquivo o que é perigoso. Tentamos querer isso, porque é a versão em que tudo fica num domínio só e o produto inteiro é menor.
Isso não sobrevive ao contato com o trabalho de verdade. Os arquivos que as pessoas publicam são painéis, calculadoras e pequenos aplicativos. O script é a coisa. Tirá-lo deixa uma captura de tela. E limpar HTML bem o bastante para servir de fronteira de segurança é um problema com um longo histórico público de gente perdendo.
O que a separação custa
Dois certificados, um deles curinga (wildcard), que não pode ser emitido provando o controle de um único nome de host e por isso precisa de um token de DNS. Dois conjuntos de variáveis de ambiente. Toda conexão entre as duas metades é entre origens diferentes, então tudo o que precisa atravessar leva um token assinado, de vida curta e com uma só função.
Também custa uma pequena dose permanente de confusão: o aplicativo está num nome e os sites que ele publica estão em outro, e ninguém chega esperando isso.
O que ela traz em troca
Um site publicado pode ser tão hostil quanto o autor quiser e mesmo assim não alcançar nada. Ele não pode ler os seus cookies, porque não são cookies dele. Não pode chamar a API como se fosse você, porque o navegador não envia as suas credenciais para ele. Não pode reescrever a página em volta, porque não há site em volta: o frame em que ele vive é outra origem.
E isso quer dizer que podemos dizer sim por padrão. O que é enviado não precisa ser inspecionado em busca de hostilidade antes de poder rodar, porque rodar não é a parte perigosa. O lugar onde roda é.
Perguntas
Por que o Solta usa dois domínios?
Porque um site publicado é um arquivo que um estranho escreveu, e ele pode fazer tudo o que o navegador deixa fazer a origem de onde é servido. No mesmo host do aplicativo, ele ficaria dentro da origem do aplicativo, junto com a sua sessão.
Um site publicado pode ler os meus cookies do Solta?
Não. Ele é servido de outra origem, então os seus cookies não são dele, e o navegador não envia as suas credenciais para ele. Ele também não pode chamar a API como se fosse você.
Por que não tirar dos arquivos o que é perigoso?
Porque os arquivos que as pessoas publicam são painéis, calculadoras e pequenos aplicativos, e o script é a coisa. Tirá-lo deixa uma captura de tela. E limpar HTML bem o bastante para servir de fronteira de segurança tem um longo histórico público de gente perdendo.
O que custam os dois domínios?
Dois certificados, um deles curinga, que precisa de um token de DNS. Dois conjuntos de variáveis de ambiente. E tudo o que passa de uma metade para a outra leva um token assinado, de vida curta e com uma só função.
Um site precisa ser inspecionado antes de poder rodar?
Não em busca de hostilidade. Rodar não é a parte perigosa, o lugar onde roda é. Por isso o Solta pode dizer sim por padrão.

