Moin!
man wird - hier auch - immer wieder darauf hingewisen, dass "eval() ist evil!".
Das möchte ich hinterfragen. Warum soll eval() so "böse" sein?
Wie anderweitig schon festgestellt wurde, hat eval() den in den meisten Fällen unnötigen Overhead, "Javascript in Javascript" zu sein, also zweimal den Interpreter anschmeißen zu müssen. Die Debug-Problematik wurde ebenfalls erwähnt. Performanter Code meidet mehrfache und in Schleifen vorkommende Aufrufe von eval() also ebenso stark, wie getElement(s)By(Id|Name|TagName), weil dies alles extrem lange dauert.
Andererseits ist eval() eine extrem mächtige Funktion. Wie Christian Kruse schon ausführte: Wer eval() in Javascript leichtfertig einsetzt, der tut das vielleicht auch in PHP, Perl oder sonst einer Skriptsprache.
Wie mächtig eval() ist, demonstrieren immer wieder Javascript-Webseitenverschlüsselungen. Na klar, ihre eigentliche Aufgabe, den Quellcode vor neugierigen und wissenden Augen zu verbergen, erfüllen sie nicht - aber dazu nutzen sie intensiv eval(). Eine mögliche Vorgehensweise ist, die Dekodierungsroutine (also eine komplette Funktion) mit urldecode() in einen String zu entschlüsseln und dann durch eval() überhaupt erst zu definieren.
Das Beispiel in SELFHTML http://de.selfhtml.org/javascript/objekte/unabhaengig.htm#eval ist wirklich harmlos. Viel spannender ist z.B. dies hier (ich hab einfach mal irgendeine der angeblichen Copy-Protection-Tools genommen und dies aus dem Demo-Seitencode kopiert):
<script>eval(unescape('%6b%3d%75%6e%65%73%63%61%70%65%28%22%25%30%44%25%30%41%22%29%3b%67%31%3d%20%63%6b%6a%28%6f%63%29%3b%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%67%31%29%3b%66%75%6e%63%74%69%6f%6e%20%63%6b%6a%28%73%29%20%7b%76%61%72%20%75%6e%3d%22%22%3b%6c%3d%73%2e%6c%65%6e%67%74%68%3b%6f%68%3d%4d%61%74%68%2e%72%6f%75%6e%64%28%6c%2f%32%29%3b%66%6f%72%28%69%3d%30%3b%69%3c%3d%6f%68%3b%69%2b%2b%29%7b%61%3d%73%2e%63%68%61%72%41%74%28%69%29%3b%62%3d%73%2e%63%68%61%72%41%74%28%69%2b%6f%68%29%3b%63%3d%61%2b%62%3b%75%6e%3d%75%6e%2b%63%3b%7d%3b%4c%3d%75%6e%2e%73%75%62%73%74%72%28%30%2c%6c%29%3b%4c%3d%4c%2e%72%65%70%6c%61%63%65%28%2f%60%2f%67%2c%22%27%22%29%3b%4c%3d%4c%2e%72%65%70%6c%61%63%65%28%2f%40%40%2f%67%2c%22%5c%5c%22%29%3b%66%20%3d%20%2f%71%67%2f%67%3b%4c%3d%4c%2e%72%65%70%6c%61%63%65%28%66%2c%6b%29%3b%72%65%74%75%72%6e%20%4c%3b%7d%3b'));</script>
Nach der Funktion unescape() kommt raus:
k=unescape("%0D%0A");g1= ckj(oc);document.write(g1);function ckj(s) {var un="";l=s.length;oh=Math.round(l/2);for(i=0;i<=oh;i++){a=s.charAt(i);b=s.charAt(i+oh);c=a+b;un=un+c;};L=un.substr(0,l);L=L.replace(/`/g,"'");L=L.replace(/@@/g,"\");f = /qg/g;L=L.replace(f,k);return L;};
Übersichtlicher geschrieben:
k=unescape("%0D%0A");
g1= ckj(oc);
document.write(g1);
function ckj(s) {
var un="";
l=s.length;
oh=Math.round(l/2);
for(i=0;i<=oh;i++) {
a=s.charAt(i);
b=s.charAt(i+oh);
c=a+b;
un=un+c;
};
L=un.substr(0,l);
L=L.replace(/`/g,"'");
L=L.replace(/@@/g,"\");
f = /qg/g;
L=L.replace(f,k);
return L;
};
Hier wird also sowohl die Funktion als auch ihr Aufruf innerhalb von eval() realisiert.
In PHP kann man auf diese Weise mit eval() auch im laufenden Skript Funktionen definieren, die auch außerhalb von PHP gelten. Für Javascript nehme ich ähnliche Dinge an.
Damit ist man aber sehr schnell bei selbstmodifizierendem Code! Und DER ist nun wirklich richtig eklig, nur was für echte Hacker, und auch nur was für hinreichend simple Aufgaben, wenn man nicht a) den Überblick verlieren und b) beim Debugging wahnsinnig werden will.
Deshalb ist eval() böse - abgesehen davon, dass man eben in 99% aller Fälle ohne eval() auskommen kann.
Zitat: "If eval() is the answer, you're almost certainly asking the
wrong question." -- Rasmus Lerdorf, BDFL of PHP
- Sven Rautenberg