Webcity.pl


  Wywiad z Wembzz /Inv...

  [tutorial] Realistyc...

  Własny mechanizm ses...

  Galeria w PHP

  SimpleXML nadchodzi!

 

 02.02.06 - [new] E-video - artykuł

 30.01.06 - [update] Artykuł o sesjach

 18.12.05 - [update] PDO - artykuł

 19.08.05 - [new+upd] Aktualizacja materia...

 26.04.05 - [update] Nowy artykuł



  Pomocy WML
[php]Sesje nie działają, ...
[actionscript 2.0] [flash...
Problem z talicami w php
[ocena] llll.pl darmowe a...
Kamera na stronie interne...
Kamera na stronie interne...
[xml] Jak wyciągnąć dane
Wizualizacja w JS - POMOC
Web Developer - stała / f...

... i wiele innych wątków na forum ›

Partnerzy
› allRSS.info - katalog zasobów RSS
› iloveflyer.org - webdesign
› webserv.pl - serverpack
› skryptoteka.pl - mnóstwo skryptów
› vel.pl - hosting
› TelePraca.net - pracuj swobodnie
› PHP Solutions - magazyn PHP
› HELION - wydawnictwo informatyczne

Ksišżka dnia

CityMag
Wpisz swój e-mail, aby zaprenumerować nasz Magazyn, który zawiera najnowsze informacje ze świata i najciekawsze teksty.
 

Szukasz czegoś?
Nasza wyszukiwarka znajdzie wszystko, czego szukasz.
 

Szukanie zawansowane


  Reklama
  Redakcja
  Hosting
  Kanał

© WebCity.pl Team
 
 
  Forum Forum
Kursy Kursy
Porady Porady
Recenzje Recenzje
Newsy Newsy
Katalog stron WWW Katalog
Skrypty PHP Skrypty
Download Oferty i praca
Artykuły:
 Teoria
 Praktyka
 Promocja
 Inne
 

 Webcity.pl |

Zdalna obsługa komputera poprzez telefon komórkowy

Autor: BuKoX
W poprzednim artykule opisałem dokładnie jak skonfigurować nasz serwer WWW do pracy jako WAP serwer z wykorzystaniem skryptów działających po stronie serwera. W tym artykule chcę pokazać praktyczne wykorzystanie tej technologii. Dlaczego nie wykorzystać telefonu komórkowego posiadającego obsługę protokołu WAP do obsługi komputera? Oczywiście od razu wyjaśniam, że nie będziemy mogli obsługiwać programów działających w środowisku graficznym systemu operacyjnego czy też grać w ulubione gry z peceta. Chodzi raczej o możliwości zbliżone do tych jakie daje nam telnet czy ssh, czyli np. wywoływanie komend wiersza poleceń w Windowsie i analogicznie poleceń powłoki w systemach uniksowych. Co nam to daje? Np. możliwość kopiowania plików, sprawdzania stanu systemu, wyłączania i restartowania go i wiele innych funkcji.


1. Bezpieczeństwo

Niezwykle ważnym elementem zdalnego dostępu do komputera jest bezpieczeństwo. Szczególnie dotyczy to momentu logowania czy też podawania samego hasła. W przypadku telnetu jak również większości innych usług nie wykorzystujących szyfrowania (SSL - Secure Socket Layer) zarówno login jak i hasło przesyłane są drogą jawną i przy pomocy snifferów można je przechwycić. Dlatego właśnie dość często administratorzy systemów uniksowych blokują usługę telnetu i pozwalają jedynie na zdalny dostęp poprzez ssh.

Przejdźmy do naszego zagadnienia i zajmijmy się konkretnie bezpieczeństwem przesyłania danych poprzez telefon komórkowy. W przypadku protokołu HTTP po odpowiednim skonfigurowaniu serwera www mamy możliwość stosowania protokołu SSL, który szyfruje przesyłane dane wykorzystując najlepsze metody jakie ma nasza przeglądarka (głownie chodzi tu o klucz szyfrujący - obecnie standardem jest 128 bitów).

Jeżeli chodzi o protokół WAP sytuacja przedstawia się nieco inaczej. Otóż protokół SSL wykorzystywany jest tylko od bramki WAP do serwera WWW. Jeśli chcemy więc szyfrować informacje pochodzące bezpośrednio od klienta (czyli telefonu) musimy dodatkowo zastosować protokół WTLS (Wireless Transport Layer Security) szyfrujący informacje od klienta do bramki WAP. Jednym słowem dane od telefonu najpierw szyfrowane są poprzez WTLS i trafiają do bramki WAP, tam są odszyfrowywane i szyfrowane na nowo poprzez SSL i w takiej postaci trafiają do serwera WWW (skonfigurowanego jako serwer WAP). Najniebezpieczniejszym miejscem na tej drodze jest oczywiście sama bramka WAP która źle "strzeżona" może stać się celem ataku w celu przechwycenia poufnych informacji. Teraz przejdźmy do praktyki. Otóż na dzień dzisiejszy operatorzy IDEA i Era GSM udostępniają bramki WAP obsługujące szyfrowanie WTLS i SSL. Tak więc pozostaje nam tylko przygotować serwer WWW do obsługi SSL'a i przekonfigurować nasz telefon. Przygotowania serwera WWW do pracy z SSL'em nie będę tutaj opisywać gdyż w internecie jest wiele informacji na ten temat (poniżej przykładowe linki):

   * http://linio.terramail.pl/apachessl.html - Apache i SSL
   * http://www.internecik.com/?p1=howto&a1=apachessl - Apache i SSL
   * http://www.certum.pl/pl/podreczniki/www/iis2/ - IIS i SSL
   * http://www.w2k.pl/tech/iis_ssl.html - IIS i SSL

Jeżeli chodzi o konfigurację telefonu to w większości aparatów polega ona na zmianie numeru portu na jakim pracuje bramka WAP z 9201 (domyślny bez szyfrowania) na 9203 (z szyfrowaniem WTLS). W przypadku telefonu Nokia 7110 należy wejść w opcję Usługi (Sevices) -> Zestaw -> Ustawienia -> Zabezpieczenia łącza (Connection security)-> Tak.

Jak już wcześniej pisałem jeśli nasz operator telefonii komórkowej nie posiada bramki WAP z obsługą szyfrowania wówczas możemy pokusić się o własną bramkę o ile mamy taką możliwość. Przykłady bramek WAP:

   * http://www.kannel.org/
     bramka open-source dla systemów uniksowych i po odpowiednim skompilowaniu
     także dla systemu Windows, obsługa szyfrowania

   * http://www.columbitech.com/
     bramka darmowa bez szyfrowania pod system Windows

   * http://www.atinav.com/download.htm
     30-dniowa wersja bramki WAP z obsługą szyfrowania pod system Windows

   * http://www.zaramond.com/product.html
     30-dniowa wersja bramki z szyfrowaniem pod system Windows

Można również skorzystać z już istniejących bramek WAP dostępnych w internecie.


2. 2. Logowanie

Tak więc sprawa szyfrowania została dokładnie omówiona. Teraz zajmijmy się samym logowaniem. Można je przeprowadzić poprzez zwykły formularz bądź wykorzystując mechanizm uwierzytelniania wbudowany w większość serwerów www. Ja zastosuje drugie rozwiązanie gdyż jest ono bezpieczniejsze ze względu na fakt, iż odpowiedni plik z zaszyfrowanymi hasłami można umieścić w miejscu nieodstępnym dla odwiedzających.

   Serwer Apache - podstawowa metoda uwierzytelniania

W przypadku serwera Apache należy w pliku conf/httpd.conf (w starszych wersjach conf/access.conf) zmienić ustawienie parametru AllowOverride na AuthConfig co będzie znaczyło że wywołując stronę znajdującą się w katalogu w którym znajduje się plik .htaccess pojawi się okienko autoryzacji proszące o nazwę użytkownika i hasło. Zakładam że nasza przyszła strona będzie znajdować się w katalogu c:\usr\www\wap\. Plik .htaccess] można umieścić w tym katalogu choć bezpieczniej jest trzymać go w miejscu niedostępnym dla odwiedzających. Tutaj dla ułatwienia umieścimy go w katalogu, w którym znajduję się nasza strona. W pliku tym musimy umieścić następujące elementy:

AuthType Basic
AuthName "Autentyfikacja"
AuthUserFile /home/httpd/users
require valid-user

W powyzszym przykładzie AuthType oznacza typ autentyfikacji (u nas jest to Basic), AuthName jest to tekst pojawiający się na ekranie (w przypadku telefonu komórkowego tekst ten nie zostanie wyświetlony), AuthUserFile jest bezwzględną ścieżką do pliku zawierającego nazwę użytkownika i hasło (w przypadku systemu Windnows będzie to np.: c:\usr\www\wap\users) oraz require valid-user oznacza, iż aby mieć dostęp do plików w danym katalogu należy podać login i hasło.

Teraz musimy wygenerować login i hasło. Wykonuje się to programem htpasswd (dołączanym do każdej dystrybucji Apache'a) znajdującym się w katalogu bin/htpasswd.exe (bądź w systemach uniksowych bin/htpasswd). Uruchamiamy program z linii poleceń:
W przypadku systemu Windows będzie to wyglądać następująco:

c:\>htpasswd c:\usr\www\wap\users wap
New password:
Re-type password:
Adding password for user wap

Po podaniu obu haseł użytkownik "wap" zostaje dodany do pliku c:\usr\www\wap\users.

Uwaga! Jeżeli plik nie istnieje jeszcze musimy wywołać polecenie z opcją -c, czyli htpasswd -c c:\usr\www\wap\users uzytkownik.

Dla systemów Uniksowych:

# htpasswd /home/httpd/wap/users wap
New password:
Re-type password:
Adding password for user wap

Chciałbym jeszcze dodać, że domyślnie hasło użytkownika zapisywane jest po wymieszaniu algorytmem MD5 choć można użyć innej metody np. CRYPT lub SHA dodając odpowiednie opcje przy tworzeniu pliku z hasłami.

   Serwer IIS - podstawowa metoda uwierzytelniania

W serwerze IIS konfiguracji uwierzytelniania dokonuje się narzędziem Menadżer Usług Internetowych. Rozwijamy drzewo serwer/Domyślna witryna sieci Web i klikamy prawym przyciskiem myszki na zastrzeżone. Wybieramy opcję właściwości i w otwartym oknie wybieramy zakładkę Zabezpieczenia katalogów, a następnie klikamy na przycisk Edytuj przy opcji Dostęp anonimowy i kontrola uwierzytelniania. W otwartym oknie wyłączamy Dostęp anonimowy a wybieramy Dostęp uwierzytelniony i klikamy na Edytuj, gdzie poproszeni zostaniemy o podanie loginu i hasła użytkownika mającego dostęp do plików w wybranym katalogu.

Od tej pory dostęp do wybranego katalogu wymaga uwierzytelnienia się.


3. Skrypt PHP generujący dokument WML

Przejdźmy wreszcie do najbardziej praktycznej części zagadnienia czyli do napisania skryptu. Wykorzystamy język PHP aby dynamicznie wygenerować dokument WML.

Na początku umieszczamy definicję typu dokumentu. Ponieważ nasz plik będzie miał rozszerzenie *.php musimy wysłać odpowiedni nagłówek informujący o tym, iż treść dokumentu będzie typu text/vnd.wap.wml czyli po prostu dokumentem WAP:

<?php
header("Content-type: text/vnd.wap.wml");
echo "<?xml version=\"1.0\" encoding=\"iso-8859-2\"?>\n";
echo "<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">\n";

Następnie otwieramy nowy dek (ang. deck) i nową kartę (ang. card), której przypisujemy identyfikator exec i tytuł wyświetlany na ekranie telefonu:

echo "<wml>\n";
echo "<card id=\"exec\" title=\"[ BuKoX BASH ]\">\n";

Sprawdzamy czy zmienna $polecenie, która będzie przesyłana z formularza jest pusta - jeśli tak wyświetlam formularz z jednym polem tekstowym gdzie wpisywane będzie polecenie:

if($polecenie=='')
{
   echo "<p>\n";
   echo "Podaj polecenie:\n";
   echo "<input type=\"text\" name=\"polecenie\"/>\n";
   echo "</p>\n";
   echo "<p align=\"center\">\n";
   echo "- powered by PHP -\n";
   echo "</p>\n";

Teraz czas na sam formularz. Jego budowa jest nieco inna niż w HTML'u. Nie ma tu otwierającego i zamykającego znacznika <form> a o tym jakie zmienne zostaną wysłane decyduje akcja <go href="...">. Znacznik <DO type="accept"> spowoduje wyświetlenie na ekranie telefonu opcji wykonaj, po wybraniu której formularz zostanie wysłany (trafi z powrotem do tego samego pliku czyli bash.php).

   echo "<do type=\"accept\" label=\"wykonaj\">\n";
   echo "<go href=\"bash.php?polecenie=$(polecenie)\"/>\n";
   echo "</do>\n";
}

Po wypełnieniu i wysłaniu formularza (zmienna $polecenie ma określoną wartość) następuje najważniejsza część skryptu:

else
{
   echo "<p>komenda: <b>".$polecenie."</b></p>";
   $wynik = `$polecenie`;
   $wynik = htmlspecialchars($wynik);
   if(!$wynik) echo "<p><b>WYSTAPIŁ BLAD</b></p>\n";
   else echo "<p>".$wynik."</p>\n"; echo "<p align=\"center\">\n";
   echo "- powered by PHP -\n";
   echo "</p>\n";

Następuje tutaj wyświetlenie na ekranie telefonu wpisanego polecenia oraz wykonanie go za pomocą znaków odwrotnego apostrofu. Efekt działania polecenia zapisywany jest do zmiennej $wynik, w której następnie dokonujemy zamiany znaków specjalnych zarezerwowanych dla znaczników na ich odpowiedniki znakowe czyli encje. Jeżeli zmienna $wynik ma wartość true, wówczas wynik działania polecenia wypisywany jest na ekranie telefonu, a jeżeli coś poszło nie tak, na ekranie pojawia się jedynie napis informujący o błędzie.

W ostatniej części skryptu przy pomocy znacznika <DO type="prev"> umieszczamy na ekranie telefonu przycisk wróc działający bardzo podobnie jak przycisk wstecz w przeglądarce internetowej.

   echo "<do type=\"prev\" label=\"wroc\">\n";
   echo "<prev/>\n";
   echo "</do>\n";
}
echo "</card>\n";
echo "</wml>";

?>

Jeżeli nie chcemy użyć podstawowej metody uwierzytelnienia serwera możemy zamiast tego wprowadzić dodatkowe pole w formularzu, gdzie wpisywane bedzie hasło i wysłać je razem z poleceniem:

echo "<p>Podaj hasło:\n";
echo "<input type=\"text\" name=\"haslo\"/>\n";
echo "<do type=\"accept\" label=\"wykonaj\">\n";
echo "<go href=\"bash.php?polecenie=$(polecenie)&haslo=$(haslo)\"/>\n";
echo "</do>\n";

A następnie w drugiej części skryptu sprawdzając czy formularz został wypełniony weryfikujemy poprawność wprowadzonego hasła:

if($haslo == 'moje_haslo') {


4. Prawa dostępu

Zapewne wielu z Was zastanawia się nad tym jakie możliwości pod względem praw dostępu do komputera mamy wykorzystując skrypt PHP i serwer WWW.

W systemach Windows jeśli nie mamy systemu plików NTFS, który określa prawa dostępu do plików (w tym również do poleceń) w zasadzie jedyną możliwością jest weryfikacja wpisywanych poleceń i akceptowanie tylko tych "bezpiecznych". Trzeba zauwazyć, że przy braku szyfrowania dane wysyłane poprzez uwierzytelnianie są jawne i ktoś niepowołany może je przechwycić. Oczywiście sytuacja taka jest w przypadku WAP serwera mało prawdopodobna ale "ostrożności nigdy za wiele". Tak więc weryfikacja poleceń może wyglądać mniej więcej tak (kod należy wstawić w drugiej części skryptu):

else
{
   if($polecenie == 'dir' || $polecenie == 'ipconfig')
   {
      echo "<p>komenda: <b>".$polecenie."</b></p>";
      $wynik = `$polecenie`;
      $wynik = htmlspecialchars($wynik);
   }
   if(!$wynik)
      echo "<p><b>WYSTAPIŁ BŁĄD</b></p>\n";
   else
      echo "<p>".$wynik."</p>\n";

Jeżeli chodzi o systemy uniksowe to zawsze działają one wykorzystując system plików posiadających określone prawa dostępu co znacząco zwiększa poziom bezpieczeństwa. Standardowo Apache na systemach uniksowych działa z prawami użytkownika nobody[i]. Użytkownik ten ma bardzo niewiele praw co w naszym przypadku może okazać się niewystarczające. Jeśli chcemy prawa te zwiększyc można użyć programu [i]sudo. Plikiem konfiguracyjnym sudo jest sudeors (znajdującym się zazwyczaj w katalogu /etc/). Edycji tego pliku dokonuje się w zależności od systemu albo zwykłym edytorem albo dodatkowym programem visudo. Najbezpieczniej jest użyć tego narzędzia w taki sposób aby dodać użytkownikowi nobody możliwość wykorzystywania dodatkowych poleceń do których normalnie nie ma dostępu. W ten sposób nobody (a przy okazji nasz skrypt) może dokonać więcej niż normalnie. Metoda ta jest bezpieczna i daje naszemu skryptowi większe możliwości.


5. Podsumowanie i gotowe skrypty

Poniżej znajdują się gotowe skrypty. Pierwszy wykorzystujący tylko uwierzytelnianie po stronie serwera a drugi zawierający weryfikacje hasła i podanego polecenia.

Pierwszy skrypt (bash1.php):

<?php
header("Content-type: text/vnd.wap.wml");
echo "<?xml version=\"1.0\" encoding=\"iso-8859-2\"?>\n";
echo "<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">\n";
echo "<wml>\n";
echo "<card id=\"exec\" title=\"[ BuKoX BASH ]\">\n";
if($polecenie=='')
{
   echo "<p>\n";
   echo "Podaj polecenie:\n";
   echo "<input type=\"text\" name=\"polecenie\"/>\n";
   echo "</p>\n";
   echo "<p align=\"center\">\n";
   echo "- powered by PHP -\n";
   echo "</p>\n";
   echo "<do type=\"accept\" label=\"wykonaj\">\n";
   echo "<go href=\"bash1.php?polecenie=$(polecenie)\"/>\n";
   echo "</do>\n";
}
else
{
   echo "<p>komenda: <b>".$polecenie."</b></p>";
   $wynik=`$polecenie`;
   $wynik=htmlspecialchars($wynik);
   if(!$wynik)
      echo "<p><b>WYSTĄPIŁ BŁĄD</b></p>\n";
   else
      echo "<p>".$wynik."</p>\n"; echo "<p align=\"center\">\n";
   echo "- powered by PHP -\n";
   echo "</p>\n";
   echo "<do type=\"prev\" label=\"wroc\">\n";
   echo "<prev/>\n";
   echo "</do>\n";
}
echo "</card>\n";
echo "</wml>";
?>


Drugi skrypt (bash2.php):

<?php
header("Content-type: text/vnd.wap.wml");
echo "<?xml version=\"1.0\" encoding=\"iso-8859-2\"?>\n";
echo "<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">\n";
echo "<wml>\n";
echo "<card id=\"exec\" title=\"[ BuKoX BASH ]\">\n";
if($polecenie=='')
{
   echo "<p>\n";
   echo "Podaj polecenie:\n";
   echo "<input type=\"text\" name=\"polecenie\"/>\n";
   echo "Podaj hasło:\n";
   echo "<input type=\"text\" name=\"haslo\"/>\n";
   echo "</p>\n";
   echo "<p align=\"center\">\n";
   echo "- powered by PHP -\n";
   echo "</p>\n";
   echo "<do type=\"accept\" label=\"wykonaj\">\n";
   echo "<go href=\"bash2.php?polecenie=$(polecenie)&haslo=$(haslo)\"/>\n";
   echo "</do>\n";
}
else
{
   if($haslo=='haselko'&&($polecenie=='dir'||$polecenie=='ipconfig')) {
   echo "<p>komenda: <b>".$polecenie."</b></p>";
   $wynik=`$polecenie`;
   $wynik=htmlspecialchars($wynik); }
   if(!$wynik)
      echo "<p><b>WYSTĄPIŁ BŁĄD</b></p>\n";
   else echo "<p>".$wynik."</p>\n";
   echo "<do type=\"prev\" label=\"wroc\">\n";
   echo "<prev/>\n";
   echo "</do>\n";
}
echo "</card>\n";
echo "</wml>";
?>

W artykule tym zaprezentowałem możliwości jakie daje nam serwer WWW skonfigurowany jako serwer WAP z obsługą skryptów PHP. Omówiony przykład pozwalający na zdalne sterowanie komputerem poprzez telefon komórkowy posiadający obsługę protokołu WAP jest rozwiązaniem względnie bezpiecznym choć nie całkowicie bezpiecznym. Stąd skrypt został rozszerzony o dodatkowe elementy zmniejszające poziom ryzyka. Myślę, że pomysł ten można dalej rozwijać do czego gorąco zachęcam.

Powrót