Eval is Evil

{ October 2nd, 2007 }


cmilfont

Autor: cmilfont

Uma das formas de trocar informações entre as camadas físicas cliente e servidor, é através da serialização de objetos, talves a forma mais simples, usando o formato JSON. Frameworks como DWR utilizam esse conceito.

Uma das formas de processar esses objetos serializados na forma de texto é usando a função “eval”. Definida na especificação ECMA262, página 77 (15.1.2.1), o Eval é uma função que interpreta um porção de código baseado em texto comum, falando a grosso modo.

objetoServidor = "{'id':'1','name':'milfont'}";
 
var objetodesserialiazado = eval("(" + objetoServidor + ")");
 
alert(objetodesserialiazado .name); // resposta: "milfont"

Uma das formas de evitar o uso do “Eval”, já que ele é considerado nocivo por permitir a injeção de código malicioso, é usar o conceito de “Quine”. O quine é um conceito que representa um programa, uma forma de metaprograma, que gera seu próprio código fonte, em outras palavras, como ele manipula sua própria estrutura de código fonte, podemos alterar dinamicamente sua estrutura, dessa forma podemos montar um objeto em tempo de execução. Programas que apenas recebem código fonte como entrada não são considerados quine.

// objeto serializado no servidor
 
objetoServidor = "{'id':'1','name':'milfont'}";
 
// separa um array das propriedades
 
var source = objetoServidor.split(",");
 
// cria um objeto base para desserializar
 
var objeto = new Object;
 
// percorre o array
 
for(var t = 0; t < source.length; t++){ //filtra as propriedades
 
 var temp = source[t].replace(/'/g,"")
 
              .replace("{","").replace("}","");
 
//monta o objeto base com os pares chave,valor do array
 
 objeto[temp.split(":",1)]  = temp.split(":",2)[1];
 
}
 
alert(objeto.name); //resposta: "milfont"

No site Json.org você encontra um parser json que filtra códigos maliciosos e é usado por grande parte dos frameworks que necessitam desse tipo de código.

A estratégia mais eficiente, usada pelos grandes players do mercado, é dispor uma api que devolva um json, passando para uma função de callback e deixando o próprio browser resolver a interpretação, exemplo retirado da área do yahoo destinado ao json:

 
function ws_results(obj) {
 
alert(obj.ResultSet.totalResultsAvailable);
 
}
<script type="text/javascript" 
src="http://search.yahooapis.com/ImageSearchService/V1/imageSearch?
appid=YahooDemo&query=Madonna&output=json&callback=ws_results">
</script>

Observe que o a API do Yahoo! devolve um objeto JSON passado para a assinatura da function que eu criei e informei na própria url do recurso, quando o javascript é processado pelo Browser, ele se encarrega de executar a função de callback e interpretar o JSON recebido.

Categories: JavaScript ~ ~ Trackback


Assine os comentários deste artigo.


Adicionar ao Rec6

4 Responses to “Eval is Evil”

  1. 1
    Script Tag - CMilfont Tech

    [...] vimos em um post passado, a técnica de usar o XHR nos proporciona trabalhar com o parsing de XML ou a montagem dinâmica de [...]

  2. 2
    O que é JSON - CMilfont Tech

    [...] forma você pode usar as estratégias de “Eval” ou “Scripttag” para processar o JSON de forma transparente em sua aplicação [...]

  3. 3
    JSONRequest para evitar o Eval - CMilfont Tech

    [...] 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 [...]

  4. 4
    Resumo javascript - Jan 2008 - CMilfont Tech

    [...] http://www.milfont.org/tech/2007/10/02/eval-is-evil/ [...]

Leave a Reply