Silverlight arendajad on mõelnud turvalisusele ja see on väga tore, aga vahel ajab see närvi ka. Näiteks siis, kui sa püüad kasutada mõnda avalikku veebiteenust ja su programm lihtsalt ei tööta ja veebiteenuselt ei tule mingit vastust. Võtad siis Firebugi lahti ja avastad, et miskipärast otsib Silverlight kaht faili crossdomain.xml ja clientaccesspolicy.xml. Mis failid need on ja miks mu rakendus neid ilma minult käsku saamata otsib?
Mis need on?
Silverlight turvalisuse üks põhiprintsiipe on see, et päringuid teistesse domeenidesse (crossdomain scripting) tehakse vaid siis, kui veebiteenus ütleb selge sõnaga, et jah ma luban programmil X domeenis Y teha minu domeeni päringuid. Need lubamised ja keelamised pannaksegi failidesse crossdomain.xml ja clientaccesspolicy.xml.
Millised need välja näevad?
- crossdomain.xml
Pildil nähtav lubab Flickr API-le ligipääsu kõikjalt. crossdomain.xml on samasugune nagu see, mida Flash on juba aastaid kasutanud. AGA Silverlight tunnistab ainult neid crossdomain faile, mis lubavad ligipääsu kõikjalt. Miks see nii on, ma ei tea, ju mingi turvalisuse värk jälle.
- clientaccesspolicy.xml
Teine võimalus veebiteenus Silverlight rakenduste jaoks kasutatavaks teha on luua clientaccesspolicy.xml. Tegelikult võib kasutada ka mõlemat. clientaccesspolicy eeliseks on see, et ei pea teenust tegema avalikuks kõikidele domeenidele ja Silverlight ei hakka seejuures pirtsutama. Teine eelis on see, et saab seadistada rakenduste töö soklitega, see on aga teema, milles ma ei ole kaugeltki kodus. Lugeda saab siit: Working with sockets.
Meeles tuleb pidada, et mõlemad failid peavad kindlasti olema domeeni juurkataloogis, muidu nad ei tööta.
Kumba oma veebiteenuse jaoks kasutada?
Mõlemat! crossdomain.xml on kasutatav ka Flash rakenduste jaoks ja kui on vaja teha Silverlight rakendustele mingeid erilisi piiranguid või laiendusi, siis Silverlight vaatab crossdomain failist üle ja liigub otse clientaccesspolicy juurde.
crossdomain.xml failideta veebiteenused
Aga mida siis teha, kui veebiteenuse crossdomain.xml fail ei ole Silverlighti jaoks sobilik (ei luba ligipääsu kõigilt) või siis on üldse puudu? Just selline probleem mind inspireeriski seda postitust kirjutama. Lahendasin selle olukorra ühe PHP skriptiga (samas domeenis), mis võtab Silvelright rakenduse käest päringu, edastab selle veebiteenusele ning väljundi saadab jällegi Silverlight rakendusele. Lihtne ja geniaalne
<? header('Content-type: text/xml'); $url=$_GET['url']; $vastus=file_get_contents($url); echo $vastus; ?>
Kõik päringud edastan sellele skriptile läbi muutuja url-i: http://www.minuleht.ee/edastaja.phpurl=http://h6bevalge.wordpress.com/feed/
Lõpptulemus
Nüüd peaks lugeja teadma, et ilma crossdomain.xml või clientaccesspolicy.xml failita Silverlight rakendused veebiteenustele päringuid ei saada ja kuna võõrate veebiteenuste üle meil kontrolli ei ole, siis aitab meid välja lihtne skript, mis meie päringuid vahendab.
