Strona wykorzystuje ciasteczka by usprawnić komfort z jej korzystania. Korzystając ze strony akceptujesz naszą Politykę Ciasteczek. X

Ograniczanie dostępu do wybranych stron przez ActionScript

Nie ma co się oszukiwać, cokolwiek pojawi się w Internecie może być skopiowane i rozpowszechniane bez zgody właściciela i Flash nie jest tutaj wyjątkiem. Na szczęście w przeciwieństwie do zdjęcie czy muzyki, z odrobiną ActionScript można ograniczyć działanie aplikacji Flash tylko do wybranych stron.
Zadanie jest proste, pobierzemy adres z którego został uruchomiony nasz Flash i porównamy z adresem który chcielibyśmy aby był:
function checkDomain(...domains):Boolean {
	if(domains == null || domains.length==0) return false;
	
	var sList:String = ".*"+domains.join("|.*");
	var sURLswf:String = stage.loaderInfo.url;
	var sRegPattern:String = "^http(|s)://("+sList+")/";
	var regPattern:RegExp = new RegExp(sRegPattern,"i");
	
	return regPattern.test(sURLswf);
}
Funkcja checkDomain pobiera nazwy domen po przecinku i porównuje je z aktualnym adresem pliku SWF - jeśli któraś z podanych domen pasuje do URL, zwracane jest true. Do porównania wykorzystywane są wyrażenia regularne które nie są tematem tego artykuły, dlatego tylko pokrótce wyjaśnię, że zmienna "sURLswf" jest porównywana do schematu ze zmiennej "sRegPattern", a to z kolei została utworzona z listy dostarczonych domen.
Tyle w zasadzie wystarczy, ale istnieje jeszcze szansa, że nasz plik SWF zostanie wczytany przez zewnętrzny Loader, a wtedy "loaderInfo.url" zwróci oryginalni adres pliku pomimo że sam Loader jest na innej stronie. Rozwiązanie? Banalne, wystarczy do funkcji checkDomain dopisać:
var sURLLoader:String = stage.loaderInfo.loaderURL;
...
return regPattern.test(sURLswf) && regPattern.test(sURLLoader);
I gotowe, teraz już nikt nie uruchomi naszej aplikacji na niepowołanych serwerach.
Należy jednak pamiętać, że funkcja ta nie chroni nas przed tzw. hot-linkowaniem, czyli na wczytywaniu plików z naszego serwera, na zupełnie innej stronie WWW. To jednak już jest poza możliwościami Flash'a i powinno być zabezpieczone po stronie serwera - polecam poszukać informacji na temat hot-linkowania i "htaccess".
Co jednak jeśli nasz hosting po prostu nie oferuje takich zabezpieczeń?
Jest jeden trik który może nam pomóc, ale niestety nie gwarantuje 100% skuteczności - właściwie to nie jestem pewien czy w ogóle gwarantuje jakąkolwiek szansę na sukces. Za nim jednak wyjaśnię o co chodzi, upewnij się że podczas embedowania pliku SWF na swojej stronie ustawisz parametr allowScriptAccess na "sameDomain". Ten prosty zabieg pozwoli aplikacji Flash na wywoływanie poleceń JavaScript, a to z kolei pozwoli nam odczytać aktualny adres URL z paska przeglądarki. W tym celu należy do kodu ActionScript dopisać:
var  sURLTop:String;
if(ExternalInterface.available) {
	try {
		sURLTop = ExternalInterface.call("function(){return window.location.href}") as String;
	}catch(e:Error) {
		 sURLTop = "";
	}
} else {
	sURLTop = "";
}
W tym momencie osoby trzecie już nie będą w stanie zrobić wiele (jeśli wszystko poszło zgodnie z planem) - pozwalając na wykonanie JavaScript'u dostaniemy w naszym kodzie adres który od razu odrzucimy, a z kolei blokując go otrzymamy w kodzie Error który również potraktujemy jako brak dostępu (w końcu na naszej stronie JavaScript jest dostępny). To rozwiązanie byłoby idealne ale nie mamy gwarancji, że osoby przeglądające naszą stronę będą mieć JavaScript włączony...