Programmēšana

Drošība un klases iekrāvēja arhitektūra

Iepriekšējā 1 2 2. lapa 2. lapa no 2

Klases iekrāvēji un nosaukuma vietas

Katrai ielādētajai klasei JVM seko, kurš klases iekrāvējs - neatkarīgi no tā, vai tas ir pirmatnējs vai objekts - ielādēja klasi. Kad ielādētā klase vispirms atsaucas uz citu klasi, virtuālā mašīna pieprasa atsauces klasi no tā paša klases iekrāvēja, kas sākotnēji ielādēja atsauču klasi. Piemēram, ja virtuālā mašīna ielādē klasi Vulkāns izmantojot noteiktu klases iekrāvēju, tas mēģinās ielādēt visas klases Vulkāns attiecas uz vienas klases iekrāvēju. Ja Vulkāns attiecas uz klasi, kuras nosaukums ir Lava, iespējams, klasē izmantojot metodi Lava, virtuālā mašīna pieprasīs Lava no klases iekrāvēja, kas iekrauj Vulkāns. The Lava klases iekrāvēja atgrieztā klase ir dinamiski saistīta ar klasi Vulkāns.

Tā kā JVM izmanto šo pieeju klašu ielādēšanai, klases pēc noklusējuma var redzēt tikai citas klases, kuras ir ielādējis tas pats klases iekrāvējs. Tādā veidā Java arhitektūra ļauj jums izveidot vairākus nosaukuma atstarpes vienā Java lietojumprogrammā. Vārds-telpa ir unikālu klašu nosaukumu kopa, ko ielādējis konkrēts klases iekrāvējs. Katram klases iekrāvējam JVM uztur nosaukuma vietu, kurā ir visu to klašu nosaukumi, kuras ir ielādētas, izmantojot šīs klases iekrāvēju.

Kad JVM ir ielādējis klasi ar nosaukumu Vulkāns piemēram, noteiktā nosaukuma telpā nav iespējams ielādēt citu klasi ar nosaukumu Vulkāns tajā pašā nosaukuma telpā. Jūs varat ielādēt vairākus Vulkāns klases JVM, jo Java lietojumprogrammā varat izveidot vairākas nosaukuma vietas. To var izdarīt, vienkārši izveidojot vairākus klases iekrāvējus. Ja darbināmā Java lietojumprogrammā izveidojat trīs atsevišķas nosaukuma vietas (vienu katram no trim klases iekrāvējiem), ielādējot vienu Vulkāns klases katrā nosaukuma telpā, jūsu programma varētu ielādēt trīs dažādas Vulkāns klases jūsu pieteikumā.

Java lietojumprogramma var noteikt vairākus klases iekrāvēja objektus no vienas klases vai no vairākām klasēm. Tāpēc tas var izveidot tik daudz (un tik daudz dažādu veidu) klases iekrāvēju objektu, cik nepieciešams. Dažādu klašu iekrāvēju ielādētās klases atrodas dažādās nosaukuma atstarpēs un nevar piekļūt viena otrai, ja vien lietojumprogramma to skaidri nepieļauj. Rakstot Java lietojumprogrammu, no dažādiem avotiem ielādētās klases var nošķirt dažādās nosaukuma atstarpēs. Tādā veidā jūs varat izmantot Java klases ielādes arhitektūru, lai kontrolētu jebkādu mijiedarbību starp kodu, kas ielādēts no dažādiem avotiem. Jūs varat novērst naidīga koda piekļuvi draudzīgam kodam un tā sagraušanu.

Klases iekrāvēji sīklietotnēm

Viens dinamiskā paplašinājuma piemērs ar klases iekrāvējiem ir tīmekļa pārlūkprogramma, kas izmanto klases iekrāvēja objektus, lai tīklā lejupielādētu klases sīklietotnes failus. Tīmekļa pārlūks iedarbina Java lietojumprogrammu, kas instalē klases iekrāvēja objektu - parasti to sauc par sīklietotņu klases iekrāvējs - kas zina, kā pieprasīt klases failus no HTTP servera. Sīklietotnes ir dinamiskā paplašinājuma piemērs, jo, palaižot Java lietojumprogrammu, tā nezina, kuras klases failus pārlūks lūgs to lejupielādēt visā tīklā. Lejupielādējamie klases faili tiek noteikti izpildes laikā, jo pārlūks sastop lapas, kurās ir Java sīklietotnes.

Tīmekļa pārlūka sāktā Java lietojumprogramma parasti izveido atšķirīgu sīklietotņu klases ielādes objektu katrai tīkla vietai, no kuras tā izgūst klases failus. Rezultātā klases failus no dažādiem avotiem ielādē dažādi klases iekrāvēja objekti. Tas ievieto tos dažādās nosaukuma telpās Java resursdatora lietojumprogrammā. Tā kā klases faili sīklietotnēm no dažādiem avotiem tiek ievietoti atsevišķās nosaukuma atstarpēs, ļaunprātīgas sīklietotnes kods nedrīkst ierobežot tiešu iejaukšanos klases failos, kas lejupielādēti no jebkura cita avota.

Sadarbība starp klases iekrāvējiem

Bieži vien klases iekrāvēja objekts paļaujas uz citiem klases iekrāvējiem - vismaz uz pirmatnējo klases iekrāvēju -, lai palīdzētu tam izpildīt dažus klases noslodzes pieprasījumus, kas rodas. Piemēram, iedomājieties, ka rakstāt Java lietojumprogrammu, kas instalē klases iekrāvēju, kura īpašais klases failu ielādes veids tiek sasniegts, lejupielādējot tos tīklā. Pieņemsim, ka Java lietojumprogrammas palaišanas laikā jūsu klases iekrāvējam tiek pieprasīts ielādēt klasi ar nosaukumu Vulkāns.

Viens veids, kā jūs varētu uzrakstīt klases iekrāvēju, ir panākt, lai tas vispirms palūgtu pirmreizējam klases iekrāvējam atrast un ielādēt klasi no tās uzticamās krātuves. Šajā gadījumā kopš Vulkāns nav Java API sastāvdaļa, pieņemsim, ka pirmklasīgais iekrāvējs nevar atrast klasi ar nosaukumu Vulkāns. Kad pirmatnējais klases iekrāvējs atbild, ka tas nevar ielādēt klasi, jūsu klases iekrāvējs pēc tam varētu mēģināt ielādēt Vulkāns klasei parastajā veidā, lejupielādējot to visā tīklā. Pieņemot, ka jūsu klases iekrāvējs varēja lejupielādēt klasi Vulkāns, tas Vulkāns klasei pēc tam varētu būt nozīme lietojumprogrammas turpmākajā izpildes gaitā.

Lai turpinātu ar to pašu piemēru, pieņemsim, ka kādu laiku vēlāk klases metode Vulkāns tiek izsaukts pirmo reizi un ka metode atsaucas uz klasi Stīga no Java API. Tā kā darbojas programma pirmo reizi izmanto atsauci, virtuālā mašīna jautā jūsu klases iekrāvējam (ielādētajam) Vulkāns) ielādēt Stīga. Tāpat kā iepriekš, jūsu klases iekrāvējs vispirms nodod pieprasījumu pirmklasīgajam iekrāvējam, bet šajā gadījumā pirmklasīgais iekrāvējs var atgriezt Stīga klasi atpakaļ pie sava klases iekrāvēja.

Pirmklasīgajam iekrāvējam, visticamāk, nebija faktiski jāielādējas Stīga šajā brīdī, jo, ņemot vērā to Stīga ir tik pamatklases Java programmās, tā gandrīz noteikti tika izmantota iepriekš un tāpēc jau bija ielādēta. Visticamāk, pirmklasīgais iekrāvējs tikko atgrieza Stīga klase, kuru tā iepriekš bija ielādējusi no uzticamās krātuves.

Tā kā pirmklasīgais iekrāvējs spēja atrast klasi, jūsu klases iekrāvējs nemēģina to lejupielādēt visā tīklā; tas tikai nodod virtuālajai mašīnai Stīga klasi, kuru atdeva pirmatnējās klases iekrāvējs. No šī brīža virtuālā mašīna to izmanto Stīga klase, kad vien klase Vulkāns atsauces uz klasi ar nosaukumu Stīga.

Klases iekrāvēji smilšu kastē

Java smilškastē klases iekrāvēja arhitektūra ir pirmā aizsardzības līnija pret ļaunprātīgu kodu. Galu galā tieši klases iekrāvējs ieved kodu JVM - kodā, kas varētu būt naidīgs.

Klases iekrāvēja arhitektūra veicina Java smilškasti divos veidos:

  1. Tas novērš ļaunprātīga koda iejaukšanos labestīgā kodā.
  2. Tas sargā uzticamo klases bibliotēku robežas.

Klases iekrāvēja arhitektūra apsargā uzticamo klases bibliotēku robežas, pārliecinoties, ka neuzticamas klases nevar izlikties par uzticamām. Ja ļaunprātīga klase varētu veiksmīgi maldināt JVM, uzskatot, ka tā ir uzticama klase no Java API, šī ļaunprātīgā klase potenciāli var izlauzties cauri smilškastes barjerai. Novēršot neuzticamu klašu uzdošanu par uzticamām klasēm, klases iekrāvēja arhitektūra bloķē vienu iespējamo pieeju Java izpildlaika drošības apdraudēšanai.

Vārda atstarpes un vairogi

Klases iekrāvēja arhitektūra novērš ļaunprātīga koda iejaukšanos labvēlīgā kodā, nodrošinot aizsargātu nosaukumu atstarpes klasēm, kuras ielādē dažādi klašu ielādētāji. Kā iepriekš minēts, nosaukums-telpa ir ielādēto klašu unikālo nosaukumu kopa, kuru uztur JVM.

Vārda atstarpes veicina drošību, jo faktiski jūs varat ievietot vairogu starp klasēm, kas ievietotas dažādās nosaukuma telpās. JVM iekšpusē klases vienā nosaukuma telpā var tieši mijiedarboties. Nodarbības dažādās nosaukuma telpās tomēr pat nevar noteikt viena otras klātbūtni, ja vien jūs skaidri nenodrošināt mehānismu, kas ļauj klasēm mijiedarboties. Ja pēc ielādes ļaunprātīgai klasei bija garantēta piekļuve visām citām klasēm, kuras pašlaik ielādēja virtuālā mašīna, šī klase potenciāli varēja iemācīties lietas, kuras tai nevajadzēja zināt, vai arī tas varētu traucēt pareizai jūsu programmas izpildei.

Drošas vides veidošana

Rakstot lietojumprogrammu, kas izmanto klases iekrāvējus, izveidojat vidi, kurā darbojas dinamiski ielādētais kods. Ja vēlaties, lai vidē nebūtu drošības caurumu, rakstot lietojumprogrammu un klases iekrāvējus, jāievēro noteikti noteikumi. Parasti jūs vēlaties uzrakstīt savu pieteikumu tā, lai ļaunprātīgais kods būtu pasargāts no labestīga koda. Jūs arī vēlaties rakstīt klases ielādētājus tā, lai tie aizsargātu uzticamu klases bibliotēku, piemēram, Java API, robežas.

Vārda atstarpes un kodu avoti

Lai izmantotu nosaukuma atstarpju piedāvātās drošības priekšrocības, jums jāpārliecinās, vai esat ielādējis klases no dažādiem avotiem, izmantojot dažādus klases iekrāvējus. Šī ir iepriekš aprakstītā shēma, ko izmanto tīmekļa pārlūkprogrammas, kurās iespējota Java. Tīmekļa pārlūkprogrammā palaistā Java lietojumprogramma parasti katram tīklam lejupielādētajam klašu avotam izveido atšķirīgu sīklietotņu klases ielādes objektu. Piemēram, pārlūkprogramma izmantos vienu klases iekrāvēja objektu, lai lejupielādētu klases no //www.niceapplets.com, un citu klases iekrāvēja objektu, lai lejupielādētu klases no //www.meanapplets.com.

Ierobežotu iepakojumu apsardze

Java ļauj klasēm vienā paketē piešķirt viena otrai īpašas piekļuves privilēģijas, kas netiek piešķirtas klasēm ārpus paketes. Tātad, ja jūsu klases iekrāvējs saņem pieprasījumu ielādēt klasi, kas pēc sava nosaukuma nekaunīgi paziņo, ka ir daļa no Java API (piemēram, klase ar nosaukumu java.lang.Virus), jūsu klases iekrāvējam jārīkojas piesardzīgi. Ja šī klase ir ielādēta, tā var iegūt īpašu piekļuvi uzticamajām klasēm java.lang un, iespējams, varētu izmantot šo īpašo piekļuvi viltus mērķiem.

Līdz ar to jūs parasti rakstāt klases iekrāvēju tā, ka tas vienkārši atsakās ielādēt jebkuru klasi, kas apgalvo, ka ir daļa no Java API (vai jebkuras citas uzticamas izpildlaika bibliotēkas), bet kuras nav vietējā uzticamajā repozitorijā. Citiem vārdiem sakot, pēc tam, kad jūsu klases iekrāvējs nodod pieprasījumu pirmklasīgajam klases iekrāvējam un primārais klases iekrāvējs norāda, ka tas nevar ielādēt klasi, jūsu klases iekrāvējam jāpārbauda, ​​vai klase nepaziņo sevi par biedru uzticamas paketes. Ja tā notiek, jūsu klases iekrāvējam, nevis mēģinot lejupielādēt klasi visā tīklā, vajadzētu mest drošības izņēmumu.

Aizliegto iepakojumu apsardze

Turklāt jūs, iespējams, uzticamajā repozitorijā esat instalējis dažas paketes, kas satur klases, kuras vēlaties, lai jūsu lietojumprogramma varētu ielādēt, izmantojot pirmatnējo klases iekrāvēju, taču nevēlaties, lai jums būtu piekļuve klasēm, kuras ielādētas, izmantojot klases iekrāvēju. Piemēram, pieņemsim, ka esat izveidojis pakotni ar nosaukumu absolūta vara un instalēja to vietējā repozitorijā, kam piekļuva pirmatnējās klases iekrāvējs. Pieņemsim arī, ka nevēlaties, lai klases iekrāvēja ielādētās klases varētu ielādēt jebkuru klasi no absolūta vara iepakojums. Šajā gadījumā jūs rakstāt savu klases iekrāvēju tā, lai pats pirmais, ko tā dara, ir pārliecināties, vai pieprasītā klase nepaziņo sevi par absolūta vara iepakojums. Ja tiek pieprasīta šāda klase, jūsu klases iekrāvējam, nevis nododot klases nosaukumu pirmatnējam klases iekrāvējam, vajadzētu mest drošības izņēmumu.

Vienīgais veids, kā klases iekrāvējs var uzzināt, vai klase ir vai nav no ierobežotas paketes, piemēram, java.langvai aizliegtu iepakojumu, piemēram, absolūta vara, ir klases nosaukums. Tādējādi klases iekrāvējam jāsniedz ierobežoto un aizliegto paku nosaukumu saraksts. Jo klases nosaukums java.lang.Virus norāda, ka tas ir no java.lang iepakojums un java.lang ir ierobežoto pakotņu sarakstā, jūsu klases iekrāvējam vajadzētu mest drošības izņēmumu, ja pirmklasīgais iekrāvējs to nevar ielādēt. Tāpat arī tāpēc, ka klases nosaukums absolutepower.FancyClassLoader norāda, ka tā ir absolūta vara iepakojums un absolūta vara pakete ir aizliegto paku sarakstā, jūsu klases iekrāvējam vajadzētu mest drošības izņēmumu.

Drošības klases klases iekrāvējs

Kopīgs veids, kā rakstīt uz drošību domājošu klases iekrāvēju, ir izmantot šādas četras darbības:

  1. Ja pastāv paketes, no kurām nav atļauts ielādēt šo klases iekrāvēju, klases iekrāvējs pārbauda, ​​vai pieprasītā klase ir vienā no iepriekš minētajām aizliegtajām pakotnēm. Ja tā, tas rada drošības izņēmumu. Ja nē, tas turpina otro soli.

  2. Klases iekrāvējs nodod pieprasījumu pirmatnējam klases iekrāvējam. Ja pirmatnējais klases iekrāvējs veiksmīgi atgriež klasi, klases iekrāvējs atgriež to pašu klasi. Pretējā gadījumā tas turpina soli trīs.

  3. Ja pastāv uzticamas pakotnes, kurām šim klases iekrāvējam nav atļauts pievienot klases, klases iekrāvējs pārbauda, ​​vai pieprasītā klase ir kādā no šiem ierobežotajiem paketēm. Ja tā, tas rada drošības izņēmumu. Ja nē, tas turpina turpināt ceturto soli.

  4. Visbeidzot, klases iekrāvējs mēģina klasi ielādēt pielāgotā veidā, piemēram, lejupielādējot to tīklā. Ja tas izdodas, tas atgriež klasi. Ja tas neizdodas, tas rada kļūdu "Nav atrasts klases definējums".

Veicot iepriekš aprakstīto pirmo un trešo darbību, klases iekrāvējs apsargā uzticamo paku robežas. Ar pirmo soli tas vispār neļauj ielādēt aizliegtās paketes klasi. Veicot trešo darbību, neuzticama klase neļauj ievietot sevi uzticamā paketē.

Secinājums

Klases iekrāvēja arhitektūra veicina JVM drošības modeli divos veidos:

  1. atdalot kodu vairākās nosaukuma atstarpēs un ievietojot "vairogu" starp kodu dažādās nosaukuma atstarpēs
  2. apsargājot uzticamu klases bibliotēku, piemēram, Java API, robežas

Programmētājiem pareizi jāizmanto abas šīs Java klases ielādes arhitektūras iespējas, lai izmantotu viņu piedāvātos drošības ieguvumus. Lai izmantotu nosaukumu-vietas vairoga priekšrocības, dažādu avotu kods jāielādē, izmantojot dažādus klases iekrāvēja objektus. Lai izmantotu uzticamu paku robežu apsardzi, ir jāuzraksta klases iekrāvēji, lai viņi pārbaudītu pieprasīto klašu nosaukumus, izmantojot ierobežoto un aizliegto paku sarakstu.

Lai iepazītos ar klases iekrāvēja rakstīšanas procesu, ieskaitot koda paraugu, skatiet Čaku Makmanisu JavaWorld raksts "Java klases iekrāvēju pamati".

Nākammēnes

Nākamā mēneša rakstā es turpināšu diskusiju par JVM drošības modeli, aprakstot klases verificētāju.

Bils Venners programmatūru profesionāli raksta 12 gadus. Atrodas Silīcija ielejā, viņš sniedz programmatūras konsultēšanas un apmācības pakalpojumus ar nosaukumu Artima Software Company. Gadu gaitā viņš ir izstrādājis programmatūru plaša patēriņa elektronikas, izglītības, pusvadītāju un dzīvības apdrošināšanas nozarēm. Viņš ir ieprogrammējis daudzās valodās uz daudzām platformām: montāžas valoda uz dažādiem mikroprocesoriem, C uz Unix, C ++ uz Windows, Java tīmeklī. Viņš ir grāmatas McGraw-Hill izdotās grāmatas: Inside the Java Virtual Machine autors.

Uzziniet vairāk par šo tēmu

  • Grāmata Java virtuālās mašīnas specifikācija (//www.aw.com/cp/lindholm-yellin.html), autori: Tim Lindholm un Frank Yellin (ISBN 0-201-63452-X), daļa no Java sērijas (//www.aw.com/cp /javaseries.html) no Addison-Wesley ir galīgā Java virtuālās mašīnas atsauce.
  • Droša skaitļošana ar JavaNow un nākotni (baltā grāmata) // www.javasoft.com/marketing/collateral/security.html
  • Bieži uzdotie jautājumi par sīklietotņu drošību

    //www.javasoft.com/sfaq/

  • Zema līmeņa drošība Java, autors Frenks Jellins //www.javasoft.com/sfaq/verifier.html
  • Java drošības mājas lapa

    //www.javasoft.com/security/

  • Skatiet vietni Hostile Applets

    //www.math.gatech.edu/~mladue/HostileApplets.html

  • Grāmata Java SecurityHostile sīklietotnes, caurumi un pretindes, Dr Gary McGraw un Ed Felton, sniedz rūpīgu Java problēmu analīzi. //www.rstcorp.com/java-security.html
  • Iepriekšējie raksti "Zem pārsega":
  • Lean, Mean Virtual Machine - sniedz ievadu Java virtuālajai mašīnai.
  • Java klases failu dzīvesveids - sniedz pārskatu par Java klases failu, faila formātu, kurā apkopotas visas Java programmas.
  • Java atkritumu savāktais kaudze - sniedz pārskatu par atkritumu savākšanu kopumā un jo īpaši Java virtuālās mašīnas atkritumu savākto kaudzi.
  • Bytecode pamati - iepazīstina ar Java virtuālās mašīnas baitkodiem un īpaši apspriež primitīvos veidus, konvertēšanas operācijas un kaudzes operācijas.
  • Peldošo punktu aritmētika - apraksta Java virtuālās mašīnas peldošā komata atbalstu un baitkodus, kas veic peldošā komata operācijas.
  • Loģika un aritmētika - apraksta Java virtuālās mašīnas atbalstu loģiskai un veselai skaitļai aritmētikai, kā arī saistītos baitkodus.
  • Objekti un masīvi - apraksta, kā Java virtuālā mašīna rīkojas ar objektiem un masīviem, un apspriež attiecīgos baitkodus.
  • Izņēmumi - apraksta, kā Java virtuālā mašīna rīkojas ar izņēmumiem, un apspriež attiecīgos baitkodus.
  • Izmēģiniet beidzot - apraksta, kā Java virtuālā mašīna ievieš izmēģinājuma klauzulas, un apspriež attiecīgos baitkodus.
  • Vadības plūsma - apraksta, kā Java virtuālā mašīna īsteno vadības plūsmu, un apspriež attiecīgos baitkodus.
  • Aglets arhitektūra - apraksta agletu, IBM autonomās Java programmatūras aģentu tehnoloģijas, iekšējo darbību.
  • Punkts Aglets - analizē mobilo aģentu, piemēram, agletu, IBM autonomās Java programmatūras aģentu tehnoloģijas reālo lietderību.
  • Metodes izsaukšana un atgriešana - apraksta četrus veidus, kā Java virtuālā mašīna izsauc metodes, ieskaitot attiecīgos baitkodus.
  • Thread Synchronization - parāda, kā darbojas pavedienu sinhronizācija Java virtuālajā mašīnā. Apspriež monitoru ievadīšanas un iziešanas baitkodus.
  • Java drošības arhitektūra - sniedz pārskatu par JVM iebūvēto drošības modeli un aplūko JVM iebūvētās drošības funkcijas.

Šo stāstu "Drošība un klases iekrāvēja arhitektūra" sākotnēji publicēja JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found