Aquí hay una idea. ¿Qué sucede si utiliza un analizador estático (algo que podría compilar con esprima, por ejemplo) para determinar qué variables externas usa el código evaluado, y alias ellos? Por "código externo" quiero decir variables el código evaluado usa pero no declara.He aquí un ejemplo:
eval(safeEval(
"var x = window.theX;"
+"y = Math.random();"
+"eval('window.z = 500;');"))
donde safeEval devuelve la cadena JavaScript modificado con un contexto que bloquea el acceso a variables externas:
";(function(y, Math, window) {"
+"var x = window.theX;"
+"y = Math.random();"
+"eval(safeEval('window.z = 500;');"
"})();"
Hay un par de cosas que puede hacer ahora con esta:
- Puede asegurarse de que el código evaluado no pueda leer los valores de las variables externas, ni escribir en ellos (pasando
undefined
como los argumentos de la función, o no pasando argumentos). O simplemente podría lanzar una excepción en los casos donde las variables están siendo accesadas de manera insegura.
- También aseguran que las variables creadas por eval no afectan el alcance que rodea
- Se podría permitir que eval para crear variables en el perímetro que rodea al declarar estas variables fuera del cierre en lugar de en función de los parámetros
- Usted podría permitir acceso de sólo lectura por copia valores de las variables externas y usarlos como argumentos a la función
- Se podría permitir lectura-escritura a variables específicas contando safeEval a no ser alias de esos nombres particulares
- puede detectar los casos en que el eval hace not modificar una variable particular y permitir que se excluya automáticamente de ser un alias (por ejemplo. Matemáticas, en este caso, no está siendo modificada)
- Se podría dar el eval un contexto en el que se ejecutará, mediante introducción de valores de los argumentos que pueden ser diferente que el contexto que rodea
- Usted podría captar los cambios de contexto también devolviendo los argumentos de función de la función para que pueda examinarlos fuera de la evaluación.
Tenga en cuenta que el uso de eval
es un caso especial, ya que por su naturaleza, en la práctica no puede ser envuelto en otra función (por lo que tenemos que hacer eval(safeEval(...))
).
Por supuesto, hacer todo este trabajo puede ralentizar su código, pero ciertamente hay lugares donde el golpe no tendrá importancia. Espero que esto ayude a alguien. Y si alguien crea una prueba de concepto, me gustaría ver un enlace aquí;)
no sé si va a trabajar para 'eval' pero se puede tratar de conmutador su contexto de ejecución (objeto de activación de google). – jfs
Eche un vistazo a la implementación de dojox.secure.sandbox. – jfs
Ahora, lo que probablemente quiera es un trabajador web. – bjb568