2010-03-15 15 views

Respuesta

31

La cita en la respuesta de Nick lo insinúa. No es realmente una gran diferencia, pero la sensación es que eval es 'peor' que new Function. No en términos de seguridad, ambos son igualmente inútiles frente a los datos que no son de confianza, pero con suerte su webapp no ​​está devolviendo cadenas JSON que no son de confianza, sino en términos de rareza a nivel de lenguaje y, por lo tanto, resistencia a la optimización.

Específicamente:

function victim() { 
    var a= 1; 
    eval('a= 2'); 
    return a; 
} 

da 2.¡La cadena ed eval ha operado en el alcance de variable local de victim! Esto es algo que una función común escrita por el usuario nunca podría hacer; eval solo puede hacerlo porque es magia oscura.

Utilizando una función regular en vez quita este elemento de la magia:

function victim() { 
    var a= 1; 
    (new Function('a= 2;'))(); 
    return a; 
} 

en lo anterior, el a regresado queda 1; la nueva Función solo puede operar en sus propias variables locales o en el window.a global.

Ese conocimiento permite que las herramientas de análisis de código, que pueden incluir motores de JavaScript y particularmente minificadores inteligentes, apliquen más optimizaciones. Por ejemplo, la segunda función victim podría tener la variable a completamente optimizada a return 1. Un uso de eval y muchas optimizaciones potenciales no serán factibles.

Por supuesto, en la práctica por una pequeña función como un er JSON eval, no va a haber una diferencia notable, pero en general el pensamiento es:

  • evitar ambos enfoques siempre que sea posible (que ambos no están permitidos en el modo estricto de ECMAScript Fifth Edition);
  • si tiene que usar uno, new Function es preferible a eval, a menos que realmente necesite el código para acceder a las variables locales de la función de llamada.
3

http://www.json.org/js.html

La función eval es muy rápido. Sin embargo, puede compilar y ejecutar cualquier programa de JavaScript, por lo que puede haber problemas de seguridad. El uso de eval se indica cuando la fuente es confiable y competente. Es mucho más seguro utilizar un analizador JSON. En las aplicaciones web sobre XMLHttpRequest, la comunicación solo se permite en el mismo origen que proporciona esa página, por lo que es de confianza. Pero podría no ser competente. Si el servidor no es riguroso en su codificación JSON, o si no valida escrupulosamente todas sus entradas, entonces podría entregar texto JSON no válido que podría llevar script peligroso. La función eval sería ejecutar la secuencia de comandos, desatando su malicia.

¿Qué quiere decir exactamente con caja fuerte? código malicioso Al menos no se ejecuta;)

Consulte también: Alternatives to JavaScript eval() for parsing JSON

Otro punto que sea, que new Function() se considera que es una de little fastereval.

Actualización:

Básicamente puede leer sobre los mismos argumentos en el comments on jQuery's .parseJSON() function.

+0

suena como una buena respuesta para una pregunta extraña =) –

+5

pero con 'nueva función();' código malicioso está siendo ejecutado. –

+4

¿Cómo es esta una buena respuesta? Luca quería saber cómo 'eval' es diferente de' new Function (...) ', y esto simplemente dice qué pasa con' eval'. – Gabe

11

cuanto a por qué jQuery utiliza específicamente new Function(), John Resig answered this on the jQuery forums

Usando eval provoca todo tipo de problemas para minifiers de código, ya que no está claro lo que podría ser ejecutando en el eval. Al observar los últimos resultados de esa ejecución, parece que la nueva función es bastante equivalente a eval e incluso ligeramente más rápida a veces. La única excepción fue Safari 4, pero esos resultados están fechados, Safari 4 se envió con una implementación nativa de JSON.parse, que usamos.

Cuestiones relacionadas