sirve - javascript eval dynamic function
eval en la aplicaciĆ³n de paquete de cromo (6)
Este es un ejemplo de lo que NO funcionará, ya que todas las cadenas con código se rechazarán en las aplicaciones empaquetadas de Chrome:
//To run some code from a string without `eval` just do this:
var code = new Function(yourCodeString);
code();
Me gustaría crear una extensión de chrome de la aplicación del paquete para permitir que el usuario escriba y ejecute código javascript (como una consola javascript).
Me gustaría usar la función eval()
para ejecutar el código JS.
La función de eval
javascript clásica eval
un error cuando se llama desde una extensión de Chrome:
Error no detectado: generación de código a partir de cadenas no permitidas para este contexto
Para usar eval
en una extensión de Chrome, la gente necesita usar un sandbox , pero cuando escribo el sandbox en el manifiesto, aparece este error:
Hubo advertencias al intentar instalar esta extensión: ''sandbox'' no está permitido para el tipo de paquete especificado (tema, aplicación, etc.).
ACTUALIZAR
De acuerdo con este problema , las cajas de arena no son compatibles con las aplicaciones de paquetes, por lo que tengo dos preguntas:
¿Hay otro método que pueda usar en lugar de
eval()
?¿Es posible utilizar
eval
sin un sandbox? (Creo que probablemente no por razones de seguridad?)
Llegué a esta respuesta después de que una aplicación de chrome de Angular.js que estaba iniciando me dio el mismo error. El autor no mencionó Angular.js, pero si alguien más encuentra esto, debe agregar una directiva adicional a su página web, por ejemplo:
<html ng-app ng-csp>
...
Esto pone angular en modo seguro para CSP https://docs.angularjs.org/api/ng/directive/ngCsp
Podría usar: $ scope. $ Eval () de angular.
Supongo que está hablando de la nueva aplicación empaquetada (versión de manifiesto 2), ¿verdad?
Las cajas de arena se pueden usar en las nuevas aplicaciones empaquetadas, absolutamente. La semana pasada, acabo de cargar una muestra que hace exactamente eso: una ventana envía un mensaje a un iframe de caja de arena oculta, el iframe compila una plantilla de manillar (aquí podría usar eval) y devuelve el HTML compilado a la página de alojamiento, que muestra el resultado.
También puede consultar esta otra muestra , que hace exactamente lo que quiere.
Por lo tanto, para responder directamente a sus preguntas:
1) No, debido a las restricciones de CSP. La única forma de evaluar JavaScript dinámico en las aplicaciones empaquetadas de Chrome es mediante el marco flotante. Si esa no es una opción para su aplicación, también puede enviar y evaluar el contenido de JavaScript en su servidor y devolver solo los resultados al usuario (aunque esto rompe la función fuera de línea de las aplicaciones empaquetadas de Chrome)
2) No, solo puede utilizar eval () en un iframe de espacio aislado.
Tu podrías intentar...
function evalMe(code){
var script = document.createElement(''script'');
script.innerText = code;
document.querySelector(''head'').appendChild(script);
}
Esto debería crear el mismo efecto, a menos que también lo hayan desactivado, pero por lo que sé, está bien. Por supuesto, si el script se errors
, no lo oirá a menos que haga un ajuste de la string
para eval
por ejemplo.
function myHandler(err){
// handle errors.
}
function evalMe(code){
var script = document.createElement(''script'');
var wrapper = ''(function(){ try{ @@ }catch(err){ myHandler(err); } })()'';
// Make sure the string has an ending semicolon
code = code[code.length-1] === '';'' ? code : code + '';'';
script.innerText = wrapper.replace(''@@'', code);
document.querySelector(''head'').appendChild(script);
}
Alternativamente podrías usar el mecanismo oficial.
http://developer.chrome.com/beta/extensions/tabs.html#method-executeScript
Sin embargo, esto requerirá que tenga una página de fondo y emplee el paso de mensajes entre la página de su app
y la página de fondo.
ACTUALIZACIÓN: Método de trabajo
Puede crear un método similar a eval
utilizando un iframe y un dataURI
codificado en base64
que maneje el paso de mensajes entre la página de extensión y el <iframe>
. Puedes agarrar una copia de trabajo del código en github . Para usar simplemente clone o descargue el repositorio, e instale el dir
''cliente'' como una extensión desempaquetada en el administrador de extensiones de chrome. El código que controla el complemento reside en app.js
Utilice el iframeEval para probar, la notificación de error es un poco con errores, pero bueno, la eval
funciona.
@appsillers Para que su complemento funcione sin ningún código adicional, puede sobrescribir el método eval
en su window
extensiones con el método iframeEval
en el código.
ACTUALIZAR:
Desde al menos enero de 2013, Chrome ahora permite la directiva de Política de Seguridad de Contenido (CSP) unsafe-eval
, que permite la ejecución eval
fuera de una caja de arena:
La política contra
eval()
y sus parientes comosetTimeout(String)
,setInterval(String)
y lanew Function(String)
se puede relajar agregando''unsafe-eval''
a su política
Agregue un CSP apropiado a su manifiesto de extensión, como:
"content_security_policy": "script-src ''self'' ''unsafe-eval''; object-src ''self''"
El error al que te refieres ahora está marcado como fixed
y se ha incluido desde Chrome 22.
Antes de la introducción de ''unsafe-eval''
, no había forma de que el CSP de una extensión manifest_version: 2
permitiera la ejecución de texto arbitrario como código. En ese momento , Google dejó en claro que no había manera de eliminar esta restricción (fuera del sandboxing):
El JavaScript en línea, así como los métodos peligrosos de cadena a JavaScript como
eval
, no se ejecutarán ... No hay ningún mecanismo para relajar la restricción contra la ejecución de JavaScript en línea. En particular, establecer una política de script que incluyaunsafe-inline
no tendrá ningún efecto. Esto es intencional.
Como se mencionó anteriormente, esta restricción ahora puede ser relajada.