javascript - injection - owasp cross site request forgery prevention cheat sheet




Por que o Google precede enquanto(1); às suas respostas JSON? (4)

Por que o Google precede while(1); às suas respostas JSON (privadas)?

Por exemplo, aqui está uma resposta ao ativar e desativar um calendário no Google Agenda :

while(1);[['u',[['smsSentFlag','false'],['hideInvitations','false'],
  ['remindOnRespondedEventsOnly','true'],
  ['hideInvitations_remindOnRespondedEventsOnly','false_true'],
  ['Calendar ID stripped for privacy','false'],['smsVerifiedFlag','true']]]]

Eu diria que isso é para impedir que as pessoas façam um eval() sobre ele, mas tudo que você realmente tem que fazer é substituir o while e, em seguida, você seria definido. Eu diria que a prevenção eval é para garantir que as pessoas escrevam código JSON de análise seguro.

Eu já vi isso usado em alguns outros lugares também, mas muito mais com o Google (Mail, Agenda, Contatos, etc.) Por incrível que pareça, o Google Docs começa com &&&START&&& , e o Google Contacts parece começar com while(1); &&&START&&& while(1); &&&START&&& .

Oque esta acontecendo aqui?


Como a tag <script> está isenta da Política de mesma origem, que é uma necessidade de segurança no mundo da web, while(1) quando adicionada à resposta JSON impede o uso indevido dela na tag <script> .


Ele impede o seqüestro de JSON , um importante problema de segurança JSON que é formalmente fixed em todos os principais navegadores desde 2011 com o EMCA5.

Exemplo sugerido: o Google tem um URL como mail.google.com/json?action=inbox que retorna as primeiras 50 mensagens da sua caixa de entrada no formato JSON. Sites maléficos em outros domínios não podem fazer solicitações AJAX para obter esses dados devido à política de mesma origem, mas podem incluir o URL por meio de uma tag <script> . A URL é visitada com seus cookies e, sobrescrevendo o construtor de matriz global ou métodos de acesso, eles podem ter um método chamado sempre que um atributo de objeto (matriz ou hash) é definido, permitindo que eles leiam o conteúdo JSON.

O while(1); ou &&&BLAH&&& impede isso: uma solicitação AJAX em mail.google.com terá acesso total ao conteúdo de texto e poderá removê-lo. Mas uma inserção de tag <script> executa cegamente o JavaScript sem qualquer processamento, resultando em um loop infinito ou em um erro de sintaxe.

Isso não aborda a questão da falsificação de solicitações entre sites .


Isso é para garantir que algum outro site não possa fazer truques desagradáveis ​​para tentar roubar seus dados. Por exemplo, substituindo o construtor de matriz , incluindo essa URL JSON por meio de uma tag <script> , um site de terceiros mal-intencionado poderia roubar os dados da resposta JSON. Colocando um while(1); no começo, o script irá travar.

Por outro lado, uma solicitação no mesmo site usando XHR e um analisador JSON separado pode facilmente ignorar o while(1); prefixo.


Isso impede que ele seja usado como o destino de uma tag <script> simples. (Bem, isso não impede, mas torna desagradável.) Dessa forma, os caras mal-intencionados não podem simplesmente colocar essa tag de script em seu próprio site e confiar em uma sessão ativa para tornar possível buscar seu conteúdo.

edit - anote o comentário (e outras respostas). O problema tem a ver com recursos embutidos subvertidos, especificamente os construtores Object e Array . Essas podem ser alteradas de forma que o JSON, que é inofensivo quando analisado, possa acionar o código do invasor.





security