v Unity 3.0 implementuje webplayer bezpečnostní model velmi podobný tomu, který používá Adobe Flash player™. Tato bezpečnostní omezení platí pouze pro webplayer a pro editor, pokud je aktivním cílem sestavení WebPlayer. Bezpečnostní model má několik částí:
- omezení přístupu k datům v jiné doméně, než je doména hostující vaše .unity3d soubor.
- určité omezení použití soketů.
- zakázat vyvolání jakékoli metody, kterou jsme považovali za zakázané. (věci jako soubor.Smazat atd.).
- zakazuje používání systému.Odraz.* Chcete-li volat soukromé / interní metody ve třídách, které jste sami nenapsali.
v současné době jsou v editoru emulovány pouze první dvě části bezpečnostního modelu.
vestavěná síťová funkce muti-player Unity (UnityEngine.Network
, UnityEngine.NetworkView
třídy atd.) není ovlivněna.
tento dokument popisuje, jak zajistit, aby váš obsah nadále pracoval s verzí 3.0 Unity webplayer.
- informace o třídě WWW naleznete v odkazu Unity API.
- viz. Net API reference pro informace o třídě.Net Socket.
třída WWW a sokety používají stejné schéma zásad, ale kromě toho se jedná o zcela samostatné systémy. Zásady WWW definují pouze oprávnění ve webové službě, kde je politika hostována, ale zásady socketu se vztahují na všechna připojení socketu TCP / UDP.
Editor Unity je dodáván s funkcí „emulovat zabezpečení webu“, která ukládá model zabezpečení webplayeru.To usnadňuje detekci problémů z pohodlí editoru. Toto nastavení najdete VEdit – >Nastavení projektu – >Editor. Viz také nastavení editoru.
Unity webplayer očekává, že http served policy soubor s názvem crossdomain.xml
bude k dispozici na doméně, ke které chcete přistupovat pomocí třídy WWW(i když to není nutné, pokud se jedná o stejnou doménu, která hostuje soubor unity3d).
představte si například hru tetris, hostovanou na následující adrese url:
http://gamecompany.com/games/tetris.unity3d
potřebuje přístup k seznamu highscore z následující adresy url:
http://highscoreprovider.net/gethighscore.php
v tomto případě budete muset umístit soubor crossdomain.xml
do kořenového adresáře highscoreprovider.net doména jako je tato: http://highscoreprovider.net/crossdomain.xml
obsah souboru crossdomain.xml
je ve formátu používaném přehrávačem Flash player. Je velmi pravděpodobné, že najdetenajít soubor crossdomain.xml
, který je již na místě. Politika v souboru vypadá takto:
<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*"/></cross-domain-policy>
když je tento soubor umístěn na http://highscoreprovider.net/crossdomain.xml, vlastník této domény prohlašuje, že k obsahu webového serveru může přistupovat jakýkoli webplayer pocházející z jakékoli domény.
Unity webplayer nepodporuje značky<allow-http-request-headers-from domain > a<site-control allowed-Cross-domain-policies >. Všimněte si, že crossdomain.xml
by měl být soubor ASCII.
ladění
nastavení proměnné prostředí ENABLE_CROSSDOMAIN_LOGGING
na 1
způsobí generování zpráv konzoly, když Unity runtime načte a dekóduje soubor crossdomain.xml
. Na počítači Mac můžete nastavit globální proměnné prostředí v /etc/launchd.conf
. Na PC použijte ovládací Panel – >systém a zabezpečení – >systém – >pokročilá nastavení systému – >proměnné prostředí …
zde je příklad výstupu s touto sadou proměnných prostředí, když se webplayer pokusí načíst obrázek ze vzdáleného serveru:
Determining crossdomain.xml location for request: http://www.remoteserver.com/image.jpgAbout to parse url: http://www.remoteserver.com/image.jpgDetermining crossdomain.xml location for request: http://www.remoteserver.com/image.jpgAbout to parse url: http://www.remoteserver.com/crossdomain.xmlAbout to parse url: http://www.remoteserver.com/image.jpgDetermining crossdomain.xml location for request: http://www.remoteserver.com/image.jpgDownload had OK statuscodeReceived the following crossdomain.xml--------------------------------------<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*"/></cross-domain-policy>----------------------received policyParsing: cross-domain-policycross-domain-policyParsing: allow-access-fromallow-access-from domain: *done parsing policycrossdomain.xml was succesfully parsedAbout to parse url: http://www.remoteserver.com/image.jpgChecking if http://www.remoteserver.com/image.jpg is a valid domainChecking request-host: www.remoteserver.com against valid domain: *All requirements met, the request is approved
při spuštění v editoru jsou tyto zprávy zapsány do editoru.protokol. Pokus o čtení souboru crossdomain.xml
nesprávně uloženého jako utf16
s BOM
bude mít za následek selhání analýzy xml:
BuildFlashPolicy caught an exception while parsing http://www.remoteserver.com/crossdomain.xml: Expected element
je to proto, že se neočekává BOM
. Použití nepodporovaného souboru utf16
bez BOM
bude mít za následek:
BuildFlashPolicy caught an exception while parsing http://www.remoteserver.com/crossdomain.xml: Policy can't be constructed from empty stream.
je to proto, že první bajt v souboru je nulový, což způsobí, že si analyzátor myslí, že dosáhl konce souboru. Crossdomain.xml
musí být soubor ASCII.
implikace pro použití soketů:
Unity webplayer potřebuje zásadu socketu, aby se mohl připojit k určitému hostiteli. Tato zásada je ve výchozím nastavení hostována cílovým hostitelem na portu 843, ale může být hostována i na jiných portech. Funkční rozdíl oproti výchozímu portu spočívá v tom, že musí být ručně načten se zabezpečením.PrefetchSocketPolicy () volání API a pokud je hostováno na portu vyšším než 1024, politika může poskytnout přístup pouze k jiným portům vyšším než 1024.
při použití výchozího portu to funguje takto: Unity webplayer se pokusí vytvořit připojení TCP socket k hostiteli, nejprve zkontroluje, zda hostitelský server přijme connection.It dělá to otevřením soketu TCP na portu 843, vydá požadavek a očekává, že obdrží zásadu soketu nad novým připojením. Unity webplayer poté zkontroluje, zda zásady hostitele umožňují připojení pokračovat, a pokud ano, bude pokračovat bez chyby. Tento proces probíhá transparentně s kódem uživatele, který nemusí být upraven pro použití tohoto bezpečnostního modelu. Příklad politiky soketu vypadá takto:
<?xml version="1.0"?><cross-domain-policy> <allow-access-from domain="*" to-ports="1200-1220"/> </cross-domain-policy>"
Tato politika účinně říká ,že „obsah z jakékoli domény je zdarma k připojení soketů na portech 1200-1220“. Unity webplayer to bude respektovat a odmítne jakýkoli pokus o připojení soketu pomocí portu mimo tento rozsah (vyvolá se výjimka SecurityException).
při použití připojení UDP lze zásadu také automaticky načíst, když je třeba ji vynucovat podobným způsobem jako u TCP. Rozdíl je v tom, že automatické načítání pomocí protokolu TCP se stane, když se připojíte k něčemu (zajišťuje, že se můžete připojit k serveru), ale s UDP, protože je bez připojení, se také stane, když zavoláte jakýkoli bod API, který odesílá nebo přijímá data (zajišťuje, že máte povoleno odesílat / přijímat provoz na / ze serveru).
formát používaný pro zásady soketu je stejný jako formát používaný přehrávačem Flash player, s výjimkou některých značek, které nejsou podporovány. Unity webplayer podporuje pouze “ * „jako platnou hodnotu pro nastavení domény a nastavení“ do portů “ je povinné.
<?xml version="1.0" encoding="ISO-8859-1"?><!ELEMENT cross-domain-policy (allow-access-from*)><!ELEMENT allow-access-from EMPTY><!ATTLIST allow-access-from domain CDATA #REQUIRED><!ATTLIST allow-access-from to-ports CDATA #REQUIRED>
zásady soketu platí pro typy připojení TCP i UDP, takže provoz UDP i TCP může být řízen jedním serverem zásad.
pro vaše pohodlí poskytujeme malý program, který jednoduše poslouchá na portu 843; když na připojení obdrží řetězec požadavků, odpoví platnou zásadou soketu.Kód serveru lze nalézt uvnitř složky Unity install, v datech / Tools / SocketPolicyServer v systému Windows nebo / Unity.app / Contents / Tools / SocketPolicyServer na OS X. Všimněte si, že pre-postavený spustitelný lze spustit na Mac, protože se jedná o mono spustitelný soubor. Stačí zadat “ mono sockpol.exe “ spustit. Všimněte si, že tento příklad kód ukazuje správné chování serveru Socket policy. Konkrétně server očekává, že obdrží řetězec s nulovým ukončením, který obsahuje <policy-file-request / >. Odešle klientovi dokument xml Socket policy pouze tehdy, když byl tento řetězec (a přesně tento řetězec) přijat. Dále je nutné, aby záhlaví xml a tělo xml byly odeslány s jediným zápisem soketu. Rozbití záhlaví a těla do samostatných operací zápisu soketu může způsobit výjimky zabezpečení kvůli Unity, která obdrží neúplnou zásadu. Pokud narazíte na nějaké problémy s vlastním serverem, zvažte použití příkladu, který poskytujeme. To by vám mělo pomoci diagnostikovat, zda máte problémy se serverem nebo sítí.
síťové knihovny třetích stran, běžně používané pro síťování her pro více hráčů, by měly být schopny pracovat s těmito požadavky, pokud nezávisí na funkčnosti peer 2 peer (viz níže), ale využívají dedikované servery. Ty někdy dokonce vyjdou z krabice s podporou hostingových zásad.
Poznámka: Zatímco soubory zásad crossdomain.xml
a socket jsou oba dokumenty xml a jsou si velmi podobné, způsob, jakým jsou tyto dokumenty podávány, se velmi liší. Crossdomain.xml
(které se použilo na http požadavky) je načteno pomocí http na portu 80, kde – jako zásada soketu je načtena z portu 843 pomocí triviálního serveru, který implementuje <zásada-file-request / >. K vydání souboru zásad soketu nelze použít server http ani nastavit server, který jednoduše odešle soubor zásad soketu v reakci na připojení soketu na portu 843. Všimněte si také, že každý server, ke kterému se připojíte, vyžaduje vlastní server zásad soketu.
ladění
můžete použít telnet
pro připojení k serveru Socket policy. Příklad relace je uveden níže:
host$ telnet localhost 843Trying 127.0.0.1...Connected to localhost.Escape character is '^]'.<policy-file-request/><?xml version='1.0'?><cross-domain-policy> <allow-access-from domain="*" to-ports="*" /></cross-domain-policy>Connection closed by foreign host.host$
v tomto příkladu relace, telnet se používá pro připojení k localhost na portu 843. Telnet odpoví prvními třemi řádky a pak sedí a čeká, až uživatel něco zadá. Uživatel zadal řetězec požadavků na zásady <policy-file-request / >, který server Socket policy přijímá a odpovídá zásadami socketu. Server se poté odpojí, což způsobí, že telnet oznámí, že připojení bylo uzavřeno.
poslechové sokety
ve webplayeru nelze vytvořit poslechové sokety, nemůže fungovat jako server. Proto webplayers nemůže komunikovat mezi sebou přímo (peer 2 peer). Při použití soketů TCP se můžete připojit ke vzdáleným koncovým bodům pouze za předpokladu, že je to povoleno prostřednictvím systému Socket policy. Pro UDP to funguje stejně, ale koncept je trochu jiný, protože se jedná o protokol bez připojení, nemusíte se připojovat/poslouchat odesílat / přijímat pakety. Funguje tak, že vynucuje, že můžete přijímat pakety ze serveru, pouze pokud odpověděl nejprve platnou zásadou se značkou allow-access-from domain
.
to je všechno tak nepříjemné, proč všechny tyto věci existují?
bezpečnostní funkce soketu a WWW existují pro ochranu lidí, kteří instalují webový přehrávač Unity. Bez těchto omezení by byl možný útok, jako je následující:
- Bob pracuje v Bílém domě.
- Frank je zlo. Píše unity webgame, který předstírá, že je hra, ale v pozadí dělá WWW požadavek na http://internal.whitehouse.gov/LocationOfNuclearBombs.pdf. vnitřní.whitehouse.gov je server, který není dosažitelný z internetu, ale je dosažitelný z Bobovy pracovní stanice, protože pracuje v Bílém domě.
- Frank odešle tyto bajty pdf na http://frank.com/secretDataUploader.php
- Frank umístí tuto hru na http://www.frank.com/coolgame.unity3d
- Frank nějak přesvědčí Bob hrát hru.
- Bob hraje hru.
- hra tiše stáhne tajný dokument a odešle jej Frankovi.
s bezpečnostními funkcemi WWW a socket tento útok selže, protože před stažením pdf unity zkontroluje http://internal.whitehouse.gov/crossdomain.xml s úmyslem požádat tento server: „jsou data, která máte na svém serveru k dispozici pro veřejné použití?“. Umístění crossdomain.xml na webovém serveru lze považovat za odpověď na tuto otázku. V případě tohoto příkladu provozovatel systému internal.whitehouse.gov nebude klást crossdomain.xml na svém serveru, což povede Unity ke stažení pdf.
bohužel, za účelem ochrany lidí, kteří instalují webový přehrávač Unity, musí lidé, kteří se vyvíjejí v Unity, vzít tato bezpečnostní opatření v úvahu při vývoji obsahu. Stejná omezení jsou přítomna ve všech hlavních technologiích pluginů. (Flash, Silverlight, Shockwave)
výjimky
abychom našli správnou rovnováhu mezi ochranou uživatelů webového přehrávače a usnadněním života vývojářů obsahu, implementovali jsme výjimku z výše popsaného bezpečnostního mechanismu:
můžete stahovat obrázky ze serverů, které nemají crossdomain.xml soubor. Jediné, co s těmito obrázky můžete dělat, je použít je jako textury ve vaší scéně. Není dovoleno používat GetPixel() na ně. Rovněž není dovoleno číst zpět z obrazovky. Oba pokusy budou mít za následek vyvolání výjimky SecurityException:
SecurityException: No read access to the texture data: at (wrapper managed-to-native) UnityEngine.Texture2D:GetPixel (int,int)
důvodem je, že je v pořádku stáhnout obrázek, pokud k němu vývojář obsahu nemá přístup. Můžete jej tedy zobrazit uživateli, ale bajty obrázku nemůžete odeslat zpět na jiný server. Pokud potřebujete přístup k datům Pixelů, umístěte soubor crossdomain.xml
na server, ze kterého jsou obrázky načteny.