Exécuter le code JavaScript stocké sous forme de chaîne


173

Comment exécuter du JavaScript qui est une chaîne?

function ExecuteJavascriptString()
{
    var s = "alert('hello')";
    // how do I get a browser to alert('hello')?
}

Réponses:



133

Vous pouvez l'exécuter à l'aide d'une fonction. Exemple:

var theInstructions = "alert('Hello World'); var x = 100";

var F=new Function (theInstructions);

return(F());

3
mais à la fin - n'est-ce pas la même chose que d'appeler var F=function(){eval(theInstructions);};?
Jörn Berkefeld

14
oui et non: avec eval, le code serait également exécuté, tandis qu'avec Function (), le code n'est pas exécuté avant F () (cas d'utilisation? vérifier l'erreur de syntaxe mais ne veut pas exécuter le code)
G3z

2
@stefan It's beatifull ...new Function("alert('Hello World');")()
Andrés Morales

J'ai essayé cela dans un bloc try / catch, et cela fonctionne parfaitement. Je peux maintenant prendre n'importe quel code JavaScript saisi dans un bloc de texte, le transmettre à ma fonction et l'exécuter. Le bloc catch peut ensuite insérer des messages d'erreur du moteur JavaScript dans un élément DOM et afficher toutes les erreurs dans le code. Si quelqu'un veut la fonction que j'ai écrite, une fois que je l'ai arrangée, je peux la publier ici.
David Edwards

@DavidEdwards Ce serait génial si vous l'avez toujours et que vous le postez.
Anoop

60

La evalfonction évaluera une chaîne qui lui est passée.

Mais l'utilisation de evalpeut être dangereuse , alors utilisez-la avec prudence.

Edit: annakata a un bon point - Non seulement est eval dangereux , il est lent . En effet, le code à évaluer doit être analysé sur place, ce qui nécessitera des ressources informatiques.


34
super dangereux ET lent - vous devriez gras, italique, souligner et h1 que
annakata

5
Je doute que ce soit plus lent que de charger JavaScript n'importe où ailleurs sur la page, cela doit également être analysé. Si c'est plus lent, c'est parce que c'est fait dans une portée différente, ce qui pourrait forcer la création de ressources pour cette portée.
cgp le

6
Si vous dites que eval()c'est dangereux. Y a-t-il une alternative?
white_gecko

4
@coobird Je sais que c'est un peu tard mais pourquoi est-ce dangereux? L'utilisateur peut facilement exécuter du code JavaScript sur votre site Web à l'aide de la console.
jkd

8
si votre sécurité dépend du tout du javascript côté client, vous avez foutu en l'air et cela n'a rien à voir avec eval.
Matthew

20

Utilisez eval ().

Visite des écoles W3 d'Eval . Le site a quelques exemples utilisables de eval. La documentation de Mozilla couvre cela en détail.

Vous recevrez probablement de nombreux avertissements concernant son utilisation en toute sécurité. N'autorisez PAS les utilisateurs à injecter RIEN dans eval () car c'est un énorme problème de sécurité.

Vous voudrez également savoir que eval () a une portée différente .


11
w3fools.com . Le W3C n'a même rien à dire sur eval. Si vous souhaitez créer un
Bergi

7
Je ne voulais pas "créer un lien vers quelque chose d'officiel, je voulais créer un lien vers quelque chose de lisible - En regardant ce que vous avez lié, cela ne donne aucune explication sur la façon dont il est utilisé, aucun exemple, aucun moyen de bricoler et décrit la méthode de manière isolée . Pour un débutant, c'est un lien complètement inapproprié. Hé, vous ne seriez pas @bjorninge, n'est-ce pas?
cgp

1
La spécification evalme décrit mieux que cet article de W3Schools. Quelque chose de lisible avec une bonne explication et des exemples serait developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… . Et non, je ne suis pas bjorninge
Bergi

Je conviendrai que ce n'est pas de la documentation, et je conviendrai que la page de Mozilla en est une meilleure image globale. Légèrement modifié ma réponse en fonction des commentaires
cgp

1
En ce qui concerne ce lien ecma-international.org, je le décrirais comme lisible et appréciable par tous ceux qui ont plus de 15 minutes d'expérience avec JS. C'est très gentil.
i336_

16

Essaye ça:

  var script = "<script type='text/javascript'> content </script>";
  //using jquery next
  $('body').append(script);//incorporates and executes inmediatelly

Personnellement, je ne l'ai pas testé mais semble fonctionner.


1
Vous avez oublié d'échapper à la fermeture> dans le script: var script = "<script type = \" text / javascript \ "> content </ script \>";
rlib

1
Pourquoi avez-vous besoin d'échapper à la fermeture>?
Jools

11

Un peu comme ce que disait @Hossein Hajizadeh alerady, mais plus en détail:

Il existe une alternative à eval().

La fonction setTimeout() est conçue pour exécuter quelque chose après un intervalle de millisecondes, et le code à exécuter se trouve être formaté sous forme de chaîne.

Cela fonctionnerait comme ceci:

ExecuteJavascriptString(); //Just for running it

function ExecuteJavascriptString()
{
    var s = "alert('hello')";
    setTimeout(s, 1);
}

1 signifie qu'il attendra 1 milliseconde avant d'exécuter la chaîne.

Ce n'est peut-être pas la manière la plus correcte de le faire, mais cela fonctionne.


Pourquoi perdre une milliseconde alors que vous pouvez passer 0 (zéro) à setTimeout? Notez que dans tous les cas, cela rendra l'exécution asynchrone. Cela signifie que tout le code qui suit l' setTimeoutappel sera appelé avant le code transmis à setTimeout(même s'il est appelé avec 0 (zéro)).
jox

🤷‍♀️ Je pensais juste que cela expliquait mieux le fonctionnement de setTimeout
Anton Juul-Naber

8
new Function('alert("Hello")')();

Je pense que c'est la meilleure façon.


7

Utilisez eval comme ci-dessous. Eval doit être utilisé avec précaution, une simple recherche sur " eval is evil " devrait lancer quelques pointeurs.

function ExecuteJavascriptString()
{
    var s = "alert('hello')";
    eval(s);
}

2
Bon conseil à ce sujet, une simple recherche sur "eval is evil" Merci!
Taptronic

5

Vérifié cela sur de nombreux scripts complexes et obscurcis:

var js = "alert('Hello, World!');" // put your JS code here
var oScript = document.createElement("script");
var oScriptText = document.createTextNode(js);
oScript.appendChild(oScriptText);
document.body.appendChild(oScript);

5

Si vous souhaitez exécuter une commande spécifique (c'est-à-dire une chaîne) après un temps spécifique - cmd = votre code - InterVal = délai d'exécution

 function ExecStr(cmd, InterVal) {
    try {
        setTimeout(function () {
            var F = new Function(cmd);
            return (F());
        }, InterVal);
    } catch (e) { }
}
//sample
ExecStr("alert(20)",500);

@SteelBrain ajoute un exemple exécuté par ExecStr ("alert (20)", 500);
Hossein Hajizadeh

1
Pourquoi est Valen InterValmajuscule?
Programmes Redwolf

4

Pour les utilisateurs qui utilisent node et qui sont concernés par les implications contextuelles des eval()offres nodejs vm. Il crée une machine virtuelle V8 qui peut sandbox l'exécution de votre code dans un contexte distinct.

Pousser les choses un peu plus loin est vm2ce qui renforce vmpermettant à la VM d'exécuter du code non approuvé.

const vm = require('vm');

const x = 1;

const sandbox = { x: 2 };
vm.createContext(sandbox); // Contextify the sandbox.

const code = 'x += 40; var y = 17;';
// `x` and `y` are global variables in the sandboxed environment.
// Initially, x has the value 2 because that is the value of sandbox.x.
vm.runInContext(code, sandbox);

console.log(sandbox.x); // 42
console.log(sandbox.y); // 17

console.log(x); // 1; y is not defined.

2
Plutôt que de dire «eval is evil» et de ne donner ni contexte ni solution, cela tente en fait de résoudre le problème. +1 pour vous
Programmes Redwolf

3
eval(s);

Mais cela peut être dangereux si vous prenez des données d'utilisateurs, bien que je suppose que s'ils plantent leur propre navigateur, c'est leur problème.


1
exactement. Eval est dangereux côté serveur. Sur le client ... pas tellement. L'utilisateur peut simplement taper javascript: someevilcode à l'adresse du navigateur et boom. Eval ici.
Esben Skov Pedersen le

@EsbenSkovPedersen Cela est empêché dans Chrome au moins, et cela nécessite une action de l'utilisateur, par opposition à un site qui evalcode des utilisateurs, ce qui pourrait par exemple permettre aux utilisateurs de voler les comptes d'autres utilisateurs sans qu'ils le sachent simplement en chargeant la page.
1j01

1
@ 1j01 Pour être honnête, mon commentaire a cinq ans.
Esben Skov Pedersen

@EsbenSkovPedersen C'est vrai :)
1j01

2

Je ne sais pas si c'est de la triche ou non:

window.say = function(a) { alert(a); };

var a = "say('hello')";

var p = /^([^(]*)\('([^']*)'\).*$/;                 // ["say('hello')","say","hello"]

var fn = window[p.exec(a)[1]];                      // get function reference by name

if( typeof(fn) === "function") 
    fn.apply(null, [p.exec(a)[2]]);                 // call it with params


2

Je répondais à une question similaire et j'ai eu encore une autre idée comment y parvenir sans utiliser eval():

const source = "alert('test')";
const el = document.createElement("script");
el.src = URL.createObjectURL(new Blob([source], { type: 'text/javascript' }));
document.head.appendChild(el);

Dans le code ci-dessus, vous créez essentiellement un Blob, contenant votre script, afin de créer une URL d'objet (représentation de l'objet File ou Blob dans la mémoire du navigateur). Puisque vous avez une srcpropriété sur la <script>balise, le script sera exécuté de la même manière que s'il avait été chargé depuis n'importe quelle autre URL.


2
function executeScript(source) {
    var script = document.createElement("script");
    script.onload = script.onerror = function(){ this.remove(); };
    script.src = "data:text/plain;base64," + btoa(source);
    document.body.appendChild(script);
}

executeScript("alert('Hello, World!');");


0
eval(s);

Rappelez-vous cependant que cette évaluation est très puissante et peu sûre. Il vaut mieux être sûr que le script que vous exécutez est sûr et non modifiable par les utilisateurs.


1
Dans JS, tout peut être modifié par l'utilisateur, tapez simplement "javascript: document.write (" Hello World ");" dans la barre d'adresse de presque tous les navigateurs.
UnkwnTech

1
Oui, mais vous pouvez lui compliquer la
tâche en

0

On peut utiliser mathjs

Extrait du lien ci-dessus:

// evaluate expressions
math.evaluate('sqrt(3^2 + 4^2)')        // 5
math.evaluate('sqrt(-4)')               // 2i
math.evaluate('2 inch to cm')           // 5.08 cm
math.evaluate('cos(45 deg)')            // 0.7071067811865476

// provide a scope
let scope = {
    a: 3,
    b: 4
}
math.evaluate('a * b', scope)           // 12
math.evaluate('c = 2.3 + 4.5', scope)   // 6.8
scope.c                                

scopeest n'importe quel objet. Donc, si vous passez la portée globale à la fonction evalute, vous pourrez peut-être exécuter alert () dynamiquement.

Mathjs est également une bien meilleure option que eval () car il fonctionne dans un bac à sable.

Un utilisateur peut essayer d'injecter du code JavaScript malveillant via l'analyseur d'expression. L'analyseur d'expression de mathjs offre un environnement sandbox pour exécuter des expressions qui devraient rendre cela impossible. Il est possible cependant qu'il existe des vulnérabilités de sécurité inconnues, il est donc important d'être prudent, en particulier lorsque vous autorisez l'exécution côté serveur d'expressions arbitraires.

Les nouvelles versions de mathjs n'utilisent ni eval () ni Function ().

L'analyseur empêche activement l'accès à l'évaluation interne de JavaScripts et à la nouvelle fonction, qui sont la principale cause d'attaques de sécurité. Les versions 4 et plus récentes de Mathjs n'utilisent pas l'évaluation de JavaScript sous le capot. Les versions 3 et antérieures utilisaient eval pour l'étape de compilation. Ce n'est pas directement un problème de sécurité, mais il en résulte une plus grande surface d'attaque possible.


0

Utiliser à la fois eval et créer une nouvelle fonction pour exécuter javascript comporte de nombreux risques de sécurité.

const script = document.createElement("script");
const stringJquery = '$("#button").on("click", function() {console.log("hit")})';
script.text = stringJquery;
document.body.appendChild(script);

Je préfère cette méthode pour exécuter le Javascript que je reçois sous forme de chaîne.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.