14. september 2002 - 16:09Der er
4 kommentarer og 1 løsning
Hjælp til forklaring af "virus" scripts
Hej,
jeg har fået fta i to eksempler på virus script. Kan I forklare mig helt præcist hvad det er de gør?
Den første:
<html> <head><title> Test your computer</title> </head> <body> <h1> The Fibonacci Series</h1> <script> function fibonacci(n) { if(n>1) return fibonacci(n-1) + fibonacci(n-2); if (n<=0) return 0; return 1; } for (i=1;i<2000000;i++) { document.write("Fibonacci number "+i+" is "+fibonacci(i)+"<br>"); } </script> </body> </html>
Jeg ved ikke rigtigt hvorfor du kalder det "virus-scripts". Der er så vidt jeg kan se ikke noget odiøst i nogen af scriptene.
Det første script indeholder en rekursiv metode, dvs. en metode der kalder sig selv. Det får programstacken (det sted i rammen der holder øje med hvor programmet er nået til) til at vokse, men med multitasking operativ systemer, nutidens browsere (og lorte store ram-blokke) har jeg ikke fantasi til at se at det skulle kunne skade ret meget. I øvrigt finder scriptet de første 2mil. fibonacci tal (på en meget tung måde).
Det andet script concatenerer en streng med sig selv et par gange, og det udgør i mine øjne heller ikke den store sikkerhedsrisiko.
I øvrigt er det - selv hvis det havde virket - misvisende med ordet "virus" (men du havde det jo også i "'er). En virus er kendetegnet ved dens evne til at replikere sig selv, og på den måde sprede sig. Al ondsidet programkode er bestemt ikke virus!
I ovenstående tilfælde kunne man forestille sig at programmørerne prøvede bevidst at opnå en stack overflow fejl, eller noget i den stil, men i hvert fald IE har stall-detection (så der dukker en pæn alertbox op der spørger om man vil afbryde programafviklingen, hvis den koger for længe), og med multitask maskiner er det ikke værre end at man kan stoppe den tråd der går i selvsving (evt. ved bare at lukke det browservindue).
Men selv hvis det havde været en hjælpeløs gammel browser på et singletask system i en maskine med for lidt RAM, så ville man maksimalt kunne håbe på at opnå at maskinen gik ned. Alt ville være fint igen, når man havde rebootet, og så ville brugeren jo bare kunne lade være med at gå ind på den hjemmeside (med den hjælpeløse browser) igen !
Ergo: Hvis det ovenstående var ment som malicious code, så forekommer det mig pænt tandløst! :)
he he o-zone, du har helt ret - det er ikke noget grosomt kode. Jeg ønskede blot at forstå hvad de 2 scripts gjorde. Det har du givet et rigtigt godt svar på tak !!
Vi kan nok regne med at ihvertfald fibonacci scriptet vil stalle, selv ved beskedne værdier af N (omkring tusind) for hvert rekursivt kald skal der gemmes en returadresse og en parameter (8-16 bytes) og javascript allokerer ikke vældig meget ram til stakken. scriptet vil køre mange gange hurtigere hvis man laver det med en løkke der blot husker de 2 sidste værdier:
function fibonacci(n) { var memory = new Array( 0, 1 ); var toggle = 0; for (var i=1; i<n; i++) { memory[ toggle ] = memory[0] +memory[1]; toggle = 1 -toggle; } return memory[0] +memory[1]; } for (i=1;i<2000000;i++) { document.write("Fibonacci number "+i+" is "+fibonacci(i)+"<br>"); }
eller endnu bedre skriver ud efterhånden istedet for at starte forfra for hvert tal:
function fibonacci(n) { var memory = new Array( 0, 1 ); var toggle = 0; for (var i=1; i<=n; i++) { memory[ toggle ] = memory[0] +memory[1]; document.write("Fibonacci number "+i+" is "+memory[toggle]+"<br>"); toggle = 1 -toggle; } } fibonacci(2000000); // der kommer ikke stakoverflow, // men den kan nok stadig gå i timeout :(
mvh JakobA
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.