www.gmapsapi.com

Kompleksowy kurs podstaw API, po którym mapowianie nie będzie miało przed Tobą żadnych tajemnic!

Setki przykładów, kursów i poradników z kodem gotowym do skopiowania i korzystania.

Największa strona o Google Maps API w Polsce, największe źródło informacji w języku polskim.

Szyfrowanie danych

Ten artykuł dotyczy API w wersji 2

« powrót do listy poradników

Wykorzystanie technologii AJAX przy pisaniu map jest bardzo wygodne, gdyż pozwala oddzielić warstwę prezentacyjną od danych. Ma jednak ono istotną wadę - wszystkie dane są praktycznie na wierzchu, więc każdy może skorzystać na przykład z zapisanych pozycji, nad którymi pieczołowicie pracowaliśmy kilka nocy. Czy jest jakiś sposób, by temu zapobiec? Tak, można znacznie utrudnić bezpośrednie odczytywanie przesyłanego pliku - to będzie właśnie tematyką tego poradnika.

W tym poradniku przerobimy nieco przykład 53 (http://gmapsapi.com/przyklad/053/02.html), w którym w pliku JSON zawarte był współrzędne przybliżonej granicy Polski. Jak widać, dane były zupełnie na wierzchu: http://gmapsapi.com/examples/053/dane2.php.

Krok I - zaszyfrowanie

Szyfrowania dokonamy po stronie serwera. Najprościej będzie zastosować algorytm base64 - w PHP istnieje funkcja base64_encode(), wykonująca całą pracę. Modyfikacja pliku z danymi polega więc tylko na zakodowaniu danych przed wysłaniem. Oto skrypt pliku zakodowane_dane.php:

<?
header('Content-Type: text/html; charset=utf-8');

include('jsonencoder.php');
$json = new Services_JSON();

$tablica = array();

$polilinia1 = array();
array_push($polilinia1, array('lat'=>53.748711, 'lon'=>14.238281));
array_push($polilinia1, array('lat'=>53.258641, 'lon'=>14.425049));
array_push($polilinia1, array('lat'=>53.067627, 'lon'=>14.304199));
/* i tak dalej i tak dalej */
array_push($polilinia1, array('lat'=>53.685290, 'lon'=>14.510520));
array_push($polilinia1, array('lat'=>53.690201, 'lon'=>14.375610));
array_push($polilinia1, array('lat'=>53.748711, 'lon'=>14.238281));

array_push($tablica,$polilinia1);

$wynik = $json->encode($tablica);
print(base64_encode($wynik));
?>

Modyfikacje sprowadziły się zatem do małej zmiany w ostatniej linii. Jaki jest rezultat tego, co dokonaliśmy? Sprawdźmy. Odpalenie skryptu zakodowane_dane.php daje kompletnie nieczytelny ciąg:

W1t7ImxhdCI6NTMuNzQ4NzExLCJsb24iOjE0LjIzODI4MX0seyJsYXQiOjUzLjI1ODY0MSwibG9uIjoxNC40MjUwNDl9LHsibGF0Ijo1My4wNjc2MjcsImxvbiI
6MTQuMzA0MTk5fSx7ImxhdCI6NTIuOTc1MTA4LCJsb24iOjE0LjE2MTM3N30seyJsYXQiOjUyLjg4MjM5MSwibG9uIjoxNC4xNjEzNzd9LHsibGF0Ijo1Mi43MTYzM
zEsImxvbiI6MTQuNDI1MDQ5fSx7ImxhdCI6NTIuNTc2MzUsImxvbiI6MTQuNjMzNzg5fSx7ImxhdCI6NTIuMzc1NTk5LCJsb24iOjE0LjU1Njg4NX0seyJsYXQiOjU
yLjIzNDUyOCwibG9uIjoxNC43MTA2OTN9LHsibGF0Ijo1Mi4wOTk3NTcsImxvbiI6MTQuNjk5NzA3fSx7ImxhdCI6NTEuODQyNTY2LCJsb24iOjE0LjU2Nzg3MX0se
yJsYXQiOjUxLjYxODAxNywibG9uIjoxNC43NDM2NTJ9LHsibGF0Ijo1MS41MDg3NDIsImxvbiI6MTQuNzMyNjY2fSx7ImxhdCI6NTEuNDQ3MTYsImxvbiI6MTQuOTY
zMzc5fSx7ImxhdCI6NTEuMjA2ODgzLCJsb24iOjE1LjAwNzMyNH0seyJsYXQiOjUwLjg4OTE3NCwibG9uIjoxNC44MjA1NTd9LHsibGF0Ijo1MC44ODkxNzQsImxvb
iI6MTQuOTMwNDJ9LHsibGF0Ijo1MS4wNjIxMTMsImxvbiI6MTUuMDk1MjE1fSx7ImxhdCI6NTAuOTM3NjYyLCJsb24iOjE1LjI5Mjk2OX0seyJsYXQiOjUwLjgwNTk
zNSwibG9uIjoxNS4zODA4NTl9LHsibGF0Ijo1MC42NTk5MDgsImxvbiI6MTYuMDYyMDEyfSx7ImxhdCI6NTAuNjU5OTA4LCJsb24iOjE2LjM2OTYyOX0seyJsYXQiO
jUwLjQ2NDQ5OCwibG9uIjoxNi4yMzc3OTN9LHsibGF0Ijo1MC4xMjA1NzgsImxvbiI6MTYuNjIyMzE0fSx7ImxhdCI6NTAuMjgyMzE5LCJsb24iOjE2Ljk4NDg2M30
seyJsYXQiOjUwLjQ3ODQ4MywibG9uIjoxNi44NzV9LHsibGF0Ijo1MC4yODIzMTksImxvbiI6MTcuNDAyMzQ0fSx7ImxhdCI6NTAuMjc1Mjk5LCJsb24iOjE3Ljc1M
zkwNn0seyJsYXQiOjUwLjE0ODc0NiwibG9uIjoxNy42MTEwODR9LHsibGF0Ijo0OS45ODY1NTIsImxvbiI6MTcuODYzNzd9LHsibGF0Ijo0OS45NDQxNSwibG9uIjo
xOC4zNDcxNjh9LHsibGF0Ijo0OS43MzE1ODEsImxvbiI6MTguNjY1NzcxfSx7ImxhdCI6NDkuNTE4MDc2LCJsb24iOjE4Ljg5NjQ4NH0seyJsYXQiOjQ5LjM5NjY3N
SwibG9uIjoxOS4wNzIyNjZ9LHsibGF0Ijo0OS42MTA3MSwibG9uIjoxOS41MDA3MzJ9LHsibGF0Ijo0OS40Mzk1NTcsImxvbiI6MTkuNjEwNTk2fSx7ImxhdCI6NDk
uMjEwNDIsImxvbiI6MTkuNzc1MzkxfSx7ImxhdCI6NDkuMjI0NzczLCJsb24iOjIwLjEwNDk4fSx7ImxhdCI6NDkuNDQ2NywibG9uIjoyMC42MjEzMzh9LHsibGF0I
jo0OS4zMTc5NjEsImxvbiI6MjAuOTI4OTU1fSx7ImxhdCI6NDkuMzk2Njc1LCJsb24iOjIxLjEyNjcwOX0seyJsYXQiOjQ5LjQ2ODEyNCwibG9uIjoyMS40MzQzMjZ
9LHsibGF0Ijo0OS4zODIzNzMsImxvbiI6MjEuOTM5Njk3fSx7ImxhdCI6NDkuMTc0NTIyLCJsb24iOjIyLjE1OTQyNH0seyJsYXQiOjQ5LjAzMDY2NSwibG9uIjoyM
i44NTE1NjN9LHsibGF0Ijo0OS4xNzQ1MjIsImxvbiI6MjIuNzYzNjcyfSx7ImxhdCI6NDkuNTg5MzQ5LCJsb24iOjIyLjY2NDc5NX0seyJsYXQiOjUwLjM3MzQ5Niw
ibG9uIjoyMy42NTM1NjR9LHsibGF0Ijo1MC40NjQ0OTgsImxvbiI6MjMuOTcyMTY4fSx7ImxhdCI6NTAuNzM2NDU1LCJsb24iOjI0LjAxNjExM30seyJsYXQiOjUwL
jg0MDYzNiwibG9uIjoyMy45NTAxOTV9LHsibGF0Ijo1MC45MDMwMzMsImxvbiI6MjQuMTU4OTM2fSx7ImxhdCI6NTEuMjY4Nzg5LCJsb24iOjIzLjc1MjQ0MX0seyJ
sYXQiOjUxLjQ4ODIyNCwibG9uIjoyMy41OTg2MzN9LHsibGF0Ijo1MS42NzI1NTUsImxvbiI6MjMuNTIxNzI5fSx7ImxhdCI6NTEuODQ5MzUzLCJsb24iOjIzLjU5O
DYzM30seyJsYXQiOjUyLjA4NjI1NywibG9uIjoyMy42OTc1MX0seyJsYXQiOjUyLjE4NzQwNSwibG9uIjoyMy40MTE4NjV9LHsibGF0Ijo1Mi4yODE2MDIsImxvbiI
6MjMuMTgxMTUyfSx7ImxhdCI6NTIuNDc2MDg5LCJsb24iOjIzLjM3ODkwNn0seyJsYXQiOjUyLjY0OTcyOSwibG9uIjoyMy43MDg0OTZ9LHsibGF0Ijo1Mi43MjI5O
DYsImxvbiI6MjMuODE4MzU5fSx7ImxhdCI6NTIuOTE1NTI3LCJsb24iOjIzLjkyODIyM30seyJsYXQiOjUzLjM2MzY2NSwibG9uIjoyMy43MTk0ODJ9LHsibGF0Ijo
1My45MDQzMzgsImxvbiI6MjMuNTU0Njg4fSx7ImxhdCI6NTQuMTMwMjYsImxvbiI6MjMuNDk5NzU2fSx7ImxhdCI6NTQuMjc4MDU1LCJsb24iOjIzLjMxMjk4OH0se
yJsYXQiOjU0LjMzNTc0NCwibG9uIjoyMy4wNzEyODl9LHsibGF0Ijo1NC40MjUzMjIsImxvbiI6MjIuODg0NTIxfSx7ImxhdCI6NTQuMzkzMzUyLCJsb24iOjIyLjU
5ODg3N30seyJsYXQiOjU0LjM2Nzc1OSwibG9uIjoyMC42NDMzMTF9LHsibGF0Ijo1NC40NDQ0OTIsImxvbiI6MTkuODE5MzM2fSx7ImxhdCI6NTQuMjM5NTUxLCJsb
24iOjE5LjM5MDg2OX0seyJsYXQiOjU0LjM1NDk1NiwibG9uIjoxOS4xNzExNDN9LHsibGF0Ijo1NC4zNjc3NTksImxvbiI6MTguNzc1NjM1fSx7ImxhdCI6NTQuNTI
xMDgxLCJsb24iOjE4LjUxMTk2M30seyJsYXQiOjU0Ljc1NjMzMSwibG9uIjoxOC40MDIxfSx7ImxhdCI6NTQuNjE2NjE3LCJsb24iOjE4Ljc1MzY2Mn0seyJsYXQiO
jU0Ljg1MTMxNSwibG9uIjoxOC4zNjkxNDF9LHsibGF0Ijo1NC44Mzg2NjQsImxvbiI6MTcuOTE4NzAxfSx7ImxhdCI6NTQuNjkyODg0LCJsb24iOjE3LjE3MTYzMX0
seyJsYXQiOjU0LjQ3MDAzOCwibG9uIjoxNi4zMTQ2OTd9LHsibGF0Ijo1NC4yODQ0NjksImxvbiI6MTYuMTI3OTN9LHsibGF0Ijo1NC4xOTQ1ODMsImxvbiI6MTUuN
TM0NjY4fSx7ImxhdCI6NTMuOTg4Mzk1LCJsb24iOjE0LjU4OTg0NH0seyJsYXQiOjUzLjkwNTI4LCJsb24iOjE0LjI1ODg5fSx7ImxhdCI6NTMuODY4NzI1LCJsb24
iOjE0LjU1MTM5Mn0seyJsYXQiOjUzLjc2ODE5NiwibG9uIjoxNC41ODk4NDR9LHsibGF0Ijo1My42ODUyOSwibG9uIjoxNC41MTA1Mn0seyJsYXQiOjUzLjY5MDIwM
SwibG9uIjoxNC4zNzU2MX0seyJsYXQiOjUzLjc0ODcxMSwibG9uIjoxNC4yMzgyODF9XV0=

Świetnie, teraz czas na napisanie funkcji, która odkoduje ten bałagan i wyciągnie niezbędne dane.

Odkodowanie

W internecie można znaleźć wiele gotowych skryptów, pozwalających na odkodowanie algorytmem base64. Wykorzystałem jeden z nich, lecz zamierzam utrudnić zadanie osobie, która może bliżej przyjrzeć się działaniu kodu. Zostawienie funkcji w kodzie w zwykłej, czytelnej postaci spowoduje, że odwiedzający pozna algorytm, i będzie mógł w dodatku użyć w prosty sposób funkcji do odkodowania tajemniczego ciągu. Skorzystałem więc z pomocy zaciemniania kodu, dzięki czemu kod ma zupełnie inną, nieczytelną dla człowieka postać. Ostatecznie, rezultatem tych zabiegów jest kod:

<script type="text/javascript">
eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('q t(5){8 9="u+/=";8 1="";8 f,g,h;8 e,a,7,d;8 i=0;p{e=9.c(5.b(i++));a=9.c(5.b(i++));7=9.c(5.b(i++));d=9.c(5.b(i++));f=(e<<2)|(a>>4);g=((a&s)<<4)|(7>>2);h=((7&3)<<6)|d;1=1+j.k(f);m(7!=l){1=1+j.k(g)}m(d!=l){1=1+j.k(h)}}r(i<5.n)o 1}',31,31,'|output||||input||enc3|var|keyStr|enc2|charAt|indexOf|enc4|enc1|chr1|chr2|chr3||String|fromCharCode|64|if|length|return|do|function|while|15|a8dffaaghv|ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'.split('|'),0,{}))
</script>

Jak widać, maksymalnie utrudnione zostało przejrzenie kodu. Powyższy fragment należy wstawić np. w nagłówku pomiedzy znacznikami HEAD. Właściwej funkcji odkodowującej dałem wcześniej nazwę a8dffaaghv(), więc przed wykonaniem funkcji eval() już po pobraniu danych należy odkodować je w sposób następujący:

var daneJSON = eval('('+a8dffaaghv(dane)+')');

I w taki oto nieskomplikowany sposób dane zostały zaszyfrowane, a dostęp do nich utrudniony.

Warto zwrócić uwagę, że taki sposób zabezpieczenia nie uchroni przed możliwością przeglądania danych przez zdeterminowane osoby, znające dobrze javascript. W rzeczywistości bowiem nie istnieje żaden w 100% skuteczny sposób na ukrycie danych, ponieważ na końcu i tak muszą one być odczytane przez przeglądarkę. Proste metody są jednak w zupełności wystarczające dla niezbyt wymagających zadań.

Kliknij na poniższy link, aby zobaczyć przykład w akcji:

przykład 1pokaż kod przykładu

Kod pliku zakodowane_dane.php dostępny jest tutaj: http://gmapsapi.com/examples/074/zakodowane_dane.php.txt.
Kod klasy jsonencoder dostępny jest pod adresem: http://gmapsapi.com/examples/074/jsonencoder.php.txt.

Dalsze możliwości usprawnień

  • Można zaciemnić cały kod aplikacji - wówczas odszyfrowanie danych będzie jeszcze trudniejsze,
  • W php można napisać funkcję, która zakodowany w base64 ciąg poddaje dalszym modyfikacjom (np. przepisuje na zmianę literę z początku i z końca), a potem analogicznie zmodyfikować funkcję odszyfrowującą, by zrobiła dokładnie to samo,
  • W miarę możliwości należy zaciemnić (choćby manualnie) kod w okolicy linijki, gdzie zostaje parsowany funkcją eval(). Zbyt czytelna postać w tym miejscu może zbyt łatwo oddać "sekretne" dane.

Polecane artykuły

Dodaj stronę do ulubionego serwisu społecznościowego

Oto, co najczęściej czytają internauci, którzy przeczytali ten artykuł:

Dodawanie markerów przez użytkownika

API v2

Poradnik pokazuje, w jaki sposób stworzyć formularz, pozwalający na dodawanie markerów


Wczytywanie danych z pliku XML

API v2

Kurs podstaw cz. X: Omówienie wczytywania danych z pliku XML za pomocą AJAXa


Pobieranie danych z bazy MySql

API v2

Zobacz, jak pobrać dane markerów, zawarte w bazie MySql i wyświetlić je na mapie


Wyszukiwanie markerów as-you-type

API v2

Jak stworzyć wyszukiwanie i filtrowanie markerów as-you-type przy użyciu bazy danych