JSONRequest para evitar o Eval

{ January 4th, 2008 }


cmilfont

Autor: cmilfont

Em artigo passado, vimos a proposta de Douglas Crockford, denominado de JSON (JavaScript Object Notation) para a troca de dados. Ele propôs também uma especificação para um novo objeto como serviço nativo nos navegadores, JSONRequest, devido a ineficiência do objeto XMLHttpRequest para as novas aplicações nas próximas geração WEB (WEB 2+). Um dos pontos principais desse novo objeto é a troca segura de objetos por meio de JSON entre o lado cliente e servidor sem expô-los ao perigo.

A especificação do XHR define, por medida de segurança, que uma chamada remota só pode ser efetuada ao mesmo caminho de onde o script foi baixado, o JSONRequest resolveria esse problema habilitando o navegador a uma chamada remota a outros servidores diferentes do host original da página, possibilitando a facilidade de acesso a WEB Services REST na camada javascript.

Hoje como alternativa a esse modelo do XHR temos o Scripttag, dessa forma conseguimos acessar recursos remotos de outros servidores mas com o problema de XSS (cross site scripting). O problema principal do XSS é a injeção de código malicioso pelo parser a partir do método “Eval” para processar o código recebido. Vimos uma alternativa de contornar o problema mas mesmo assim não é suficiente. Uma das vantagens principais do JSONRequest seria evitar o XSS.

Esse objeto JSONRequest seria nativo e global, desenhado para ser simples, teria apenas 3 métodos: get, post e cancel.

Existe já plugin para o Firefox que habilita o navegador a oferecer nativamente o objeto JSONRequest.

Para todos os navegadores somente com javascript na camada mais alta, para isso existe também o projeto JSONRequest de Andrea Giammarchi, que criou o objeto em javascript seguindo a especificação. Compatível com os principais navegadores: Opera, IE, Firefox, Safari e konqueror.

try {
    JSONRequest.get("processaJSON.jsp",
        function(sn, response, exception){
             alert(exception || response);
        });
} catch(e) {
 
      alert(e);
 
}

O W3C especificou medidas seguras para acesso a recursos web em outro servidores, assim como já existem movimentos para uma nova especificação do um novo XHR, seria algo como um XHR2. A diferença no meu entendimento é que o JSONRequest trata exclusivamente da troca de objetos nativos com base em JSON entre os dois ambientes físicos, enquanto o XHR trata da troca via XML, portanto uma nova especificação do XHR não seria suficiente para substituir a proposta do JSONRequest, a não ser que ele fizesse o parser também de JSON como faz com XML.

Categories: Ajax, JavaScript, JSON, XMLHttpRequest ~ ~ Trackback


Assine os comentários deste artigo.


5 Responses to “JSONRequest para evitar o Eval”

  1. 1
    Rafael Ponte

    Muito bom :) Mas eu só não entendi direito este trecho,
    “A especificação do XHR define, por medida de segurança, que uma chamada remota só pode ser efetuada ao mesmo caminho de onde o script foi baixado […]”

    Poderia explicar? 😛

  2. 2
    cmilfont

    a especificação determina que o objeto XHR só pode efetuar uma requisição a um serviço que esteja na mesma uri de origem dela, conhecido como “same-domain policy”, exemplo:

    http://www.milfont.org/scriptComXHR.js
    http://www.milfont.org/recurso.php

    o objeto XHR contido no scriptComXHR.js só poderá requisitar do caminho http://www.milfont.org e paths abaixo dele como http://www.milfont.org/outrorecurso/
    se tentar de rponte.com.br por exemplo lançará uma SECURITY_ERR. Sacou?

    *
    “Two URIs are same-origin if after performing scheme-based normalization on both URIs as described in section 5.3.3 of RFC 3987 the scheme, ihost and port components are identical. If either URI does not not have an ihost component the URIs must not be considered same-origin. [RFC3987]”
    http://www.w3.org/TR/XMLHttpRequest/#terminology

  3. 3
    cmilfont

    esqueci de mencionar, para contornar esse problema uma das formas mais usadas é criar um mecanismo de proxy no mesmo servidor para buscar de outro host e enviar

  4. 4
    Resumo javascript - Jan 2008 - CMilfont Tech

    […] http://www.milfont.org/tech/2008/01/04/jsonrequest-para-evitar-o-eval/ […]

  5. 5
    Ajax Crossbrowser no IE8 e FF3 - CMilfont Tech

    […] confusão muito comum até em desenvolvedores profissionais é não saber que o objeto XHR segue o mesmo princípio de segurança do javascript e por isso não pode executar […]

Leave a Reply