Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Ajax][PHP] Bezpieczeństwo skryptów
Quantum
post
Post #1





Grupa: Zarejestrowani
Postów: 450
Pomógł: 84
Dołączył: 27.11.2008
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Witam, od jakiegoś czasu zacząłem stosować AJAX'a w swoich projektach.
Chciałbym zabezpieczyć plik PHP w ten sposób, aby zwracał dane tylko dla mojego skryptu, a po wejściu do tego pliku z zewnątrz (np: http://snifferwebpage.awardspace.biz/data.php) zwracał błąd.
Napisałem małe zabezpieczenie, ale chciałbym, żeby ktoś z Was je przetestował (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
BTW. sam próbowałem je ominąć, przy wykorzystaniu cURL'a na innym serwerze, ale się nie udało.

Link: http://snifferwebpage.awardspace.biz/

Pozdrawiam, sniff (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował erix 6.06.2009, 17:19:33
Powód edycji: [erix] chyba do ocen?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
zegarek84
post
Post #2





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


tzn. co jest zabezpieczone?? - a jeśli tak miało być to gratuluję (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) - wchodzę na link niżej do strony głównej i nic mi się nie wyświetla dodatkowego jak klikam pierwszy czy drugi buton - a że jestem już wstawiony po kilku głębszych to kodu nie analizuję ;p - ale zanim przeczytałem do końca temat miałem tylko proponować jak to zabezpieczyć jednocześnie nadmieniając, że danych ajax/js nie da się zabezpieczyć w pełni!!!! - ale Tobie widzę się to udało gdyz danych nie mogę pobrać (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) - sorki za ten czarny chumor ale drinken drinken - szczerze nawet nie wiem co ma się pobrać (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) a takie aplikacje po stronie klijenta nigdy nie zabezpieczysz na 100% - jedynie możesz filtrować co najwyżej tych co zauważysz, że nadużywają pewnej funkcjonalności - lub nie wiem jak często aplikacja ma pobierać dane ale jesli nie aż tak często to coś w stylu zabezpieczenia przed floodowaniem możesz urzyć (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

i napisz co tam miało sie wyświetlić ;p (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
Quantum
post
Post #3





Grupa: Zarejestrowani
Postów: 450
Pomógł: 84
Dołączył: 27.11.2008
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Jak widzisz po wciśnięciu przycisku "pobierz dane1" lub "pobierz dane2", ajax wysyła żądanie do pliku data.php o zwrot danych, w tym przypadku dane1 = 'to są dane 1', dane2 = 'to są dane 2' (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Ten skrypt ma za zadanie blokować wyświetlenie tych danych przez inne skrypty napisane przez osoby z zewnątrz.

BTW. Jak to mówią, "Nie chwal dnia przed zachodem słońca" (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Jak znam życie, znajdzie się ktoś kto to ominie.

Ten post edytował sniffer32 6.06.2009, 19:25:22
Go to the top of the page
+Quote Post
marcio
post
Post #4





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Z tego co widzialem za pomoca firebug'a i livehttpheaders to zmieniajac naglowki moze dalbym rade cos zdzialac ale najpierw musialbym pokombinowac z curlem by zobaczyc jak skrypt sie zachowuje jak bede mial troche czasu to cos pokombinuje (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
Fishu
post
Post #5





Grupa: Zarejestrowani
Postów: 192
Pomógł: 13
Dołączył: 16.11.2007
Skąd: Żory

Ostrzeżenie: (10%)
X----


Ostatnio też myślałem, o bezpieczeństwie takich skryptów, a tu taki temacik (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) No na początek widać, że zabezpieczenie działa. Tylko jest taki mały problemik. Zrobiłeś w pliku php warunek sprawdzający url ? Bo wpisując przykładowo http://snifferwebpage.awardspace.biz/?var=test nic nie wypisuje ;p
Go to the top of the page
+Quote Post
Quantum
post
Post #6





Grupa: Zarejestrowani
Postów: 450
Pomógł: 84
Dołączył: 27.11.2008
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat
Ostatnio też myślałem, o bezpieczeństwie takich skryptów, a tu taki temacik (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) No na początek widać, że zabezpieczenie działa. Tylko jest taki mały problemik. Zrobiłeś w pliku php warunek sprawdzający url ? Bo wpisując przykładowo http://snifferwebpage.awardspace.biz/?var=test nic nie wypisuje ;p


Błąd w skrypcie (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Poprawione (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
zegarek84
post
Post #7





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


hehe - masz tam jakieś zabezpieczenie przed floodowaniem czy tylko skrypt nie wyrobił przy pętli 100?? - co drugie średnio 50% wyskoczyły błędy (IMG:http://img-upload.pl/images/938_i.gif) - ale dane bez problemu się pobierają (IMG:http://img-upload.pl/images/170_l.gif) - swoją drogą coś jest nie tak bo i w przeglądarce jak za często i za szybko klikałem te przyciski to się wykolejało i potem nie zmieeee^^ - pozatym do zapytań ajax'owych mógłbyś dorzucić jakąś pamięć - pomysł na zabezpieczenie fajny (IMG:http://img-upload.pl/images/959_e.gif) - np to z liczbą znaków (IMG:http://img-upload.pl/images/959_e.gif)

w sumie to mógłbyś pobrać przez takie pseudo zabezpieczenie dopiero główniejszy skrypt co tym by się zajmował jakiś trudniejszy - no hoć jak się nagłówki sprawdzi to pod wszystko da się podszyć - ps. do czego jest to xmlhttp.setRequestHeader("Connection", "close");(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) - tzn podejrzewałem ale nagłówki były wysłąne w przeglądarce i tak:
Connection: keep-alive
Keep-Alive: 300


w każdym bądź razie jeśli logowałęś ilość zapytań z jednego ip to weisz że to nie zabezpieczenie dla kogoś kto coś trochu pisze - ale lepszy rydz jak nic (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) - swoją drogą już myślałem że jednak coś konkretnego jest z tym zabezpieczeniem bo jest weekend i dzisiaj też trochu chlupnąłem ale jak się okazało katalog dla skryptu nie miał praw zapisu i ja na fazie patrzałem gdzie literówkę zrobiłem (IMG:http://img-upload.pl/images/553_x.gif)

ale przyznaję, że dosyć ciekawy pomysł na zabezpieczenie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) - zapamiętam - moze trochu zmodyfikuję i pewnie wykożystam w przyszłości (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

oki - jest to przydługawe bo mi się teraz myśleć nie chciało to tylko funkcje kopiowałem i modyfikowałem ale jeśli miałbyś nie wierzyć [wiem - brzydki kod ale co chcesz od kogoś co jest na fazie - skopiowałem tylko fragment z kodu co po pijanemu analizowałem serwisz podbij (IMG:http://img-upload.pl/images/530_j.gif) )
Kod
<?php


// strona
function strona($url){
$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$headers = array(    'Keep-Alive: 300',
            'Accept-Language: pl,en-us;q=0.7,en;q=0.3',
            'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7',
            
            
            'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
            
            );
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.5) Gecko/2008121300 SUSE/3.0.5-0.1 Firefox/3.0.5');


curl_setopt($ch, CURLOPT_HEADER, 0);
// gzip
curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
// deflate
curl_setopt($ch, CURLOPT_ENCODING, 'deflate');
// gzip, deflate
curl_setopt($ch, CURLOPT_ENCODING, '');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookies.txt');
$tresc=curl_exec($ch); if(curl_errno($ch)){echo 'Błąd #'.curl_errno($ch).': '.curl_error($ch);}
curl_close($ch);
return $tresc;
unset($tresc);
};



// reqID
function reqID($url){
$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$headers = array(    'Host: snifferwebpage.awardspace.biz',
            'Keep-Alive: 300',
            'Accept-Language: pl,en-us;q=0.7,en;q=0.3',
            'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7',
            
            'POST /data.php HTTP/1.1',
            'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Content-Type: application/x-www-form-urlencoded',
            'Content-Length: 9',
            'Keep-Alive: 300',
            'Cache-Control: no-cache',
            'Pragma: no-cache',
            'Connection: keep-alive'
            );
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.5) Gecko/2008121300 SUSE/3.0.5-0.1 Firefox/3.0.5');
curl_setopt($ch, CURLOPT_POST, 1);//przesylamy metodą post
curl_setopt($ch, CURLOPT_POSTFIELDS, 'reqID=get'); //dane do wyslania
curl_setopt($ch, CURLOPT_REFERER, 'http://snifferwebpage.awardspace.biz/');
curl_setopt($ch, CURLOPT_FORBID_REUSE, true);

curl_setopt($ch, CURLOPT_HEADER, 0);
// gzip
curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
// deflate
curl_setopt($ch, CURLOPT_ENCODING, 'deflate');
// gzip, deflate
curl_setopt($ch, CURLOPT_ENCODING, '');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookies.txt');
$tresc=curl_exec($ch); if(curl_errno($ch)){echo 'Błąd #'.curl_errno($ch).': '.curl_error($ch);}
curl_close($ch);
return $tresc;
unset($tresc);
};





// dane
function dane($ktore,$url){
$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$headers = array(    'Host: snifferwebpage.awardspace.biz',
            'Keep-Alive: 300',
            'Accept-Language: pl,en-us;q=0.7,en;q=0.3',
            'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7',
            
            'POST /data.php HTTP/1.1',
            'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Content-Type: application/x-www-form-urlencoded',
            'Keep-Alive: 300',
            'Cache-Control: no-cache',
            'Pragma: no-cache',
            'Connection: keep-alive',
            'Content-Length: 44'
            );
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.5) Gecko/2008121300 SUSE/3.0.5-0.1 Firefox/3.0.5');
curl_setopt($ch, CURLOPT_POST, 1);//przesylamy metodą post
curl_setopt($ch, CURLOPT_POSTFIELDS, 'dane='.$ktore.'&sess='.reqID($url)); //dane do wyslania
curl_setopt($ch, CURLOPT_REFERER, 'http://snifferwebpage.awardspace.biz/');

curl_setopt($ch, CURLOPT_HEADER, 0);
// gzip
curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
// deflate
curl_setopt($ch, CURLOPT_ENCODING, 'deflate');
// gzip, deflate
curl_setopt($ch, CURLOPT_ENCODING, '');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookies.txt');
$tresc=curl_exec($ch); if(curl_errno($ch)){echo 'Błąd #'.curl_errno($ch).': '.curl_error($ch);}
curl_close($ch);
return $tresc;
unset($tresc);
};

strona('http://snifferwebpage.awardspace.biz/');
// echo '<pre>'.reqID('http://snifferwebpage.awardspace.biz/data.php').'</pre>';
for ($i=1;$i<7;++$i){$ktore=($i%2)+1;
echo $i.' : '.dane($ktore,'http://snifferwebpage.awardspace.biz/data.php').'<br/>';}

?>


ps. co niektórzy boty piszą też w js jako userscript i parametry do serwera swojego przekazują - a więc to co na stronie wtedy jest jak na talerzu podane (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) - tyle, że musi mieć przeglądarkę włączoną ^^

Ten post edytował zegarek84 7.06.2009, 22:02:41
Go to the top of the page
+Quote Post
Quantum
post
Post #8





Grupa: Zarejestrowani
Postów: 450
Pomógł: 84
Dołączył: 27.11.2008
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat
hehe - masz tam jakieś zabezpieczenie przed floodowaniem czy tylko skrypt nie wyrobił przy pętli 100?? - co drugie średnio 50% wyskoczyły błędy (IMG:http://img-upload.pl/images/938_i.gif) - ale dane bez problemu się pobierają (IMG:http://img-upload.pl/images/170_l.gif) - swoją drogą coś jest nie tak bo i w przeglądarce jak za często i za szybko klikałem te przyciski to się wykolejało i potem nie zmieeee^^


Ten serwer jest darmowy, a darmowy znaczy wolny jak.. (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Dlatego wykłada się na zbyt częstych requestach. Przymierzam się teraz do wykupienia serwera na hostnine.com pod linuxem, mają dość ciekawą ofertę.

Cytat
oki - jest to przydługawe bo mi się teraz myśleć nie chciało to tylko funkcje kopiowałem i modyfikowałem ale jeśli miałbyś nie wierzyć [wiem - brzydki kod ale co chcesz od kogoś co jest na fazie - skopiowałem tylko fragment z kodu co po pijanemu analizowałem serwisz podbij (IMG:http://img-upload.pl/images/530_j.gif) )


Twój kod w porównaniu do mojego jest wyjątkowo przejrzysty i zrozumiały (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

A wracając do sprawy, skopiowałem twój kod, wrzuciłem na inny serwer wspierający cURL, lecz po odpaleniu uzyskałem taki efekt :

Kod
1 : Błąd 403 ! Dostęp zabroniony !
        
  2 : Błąd 403 ! Dostęp zabroniony !
        
  3 : Błąd 403 ! Dostęp zabroniony !
        
  4 : Błąd 403 ! Dostęp zabroniony !
        
  5 : Błąd 403 ! Dostęp zabroniony !
        
  6 : Błąd 403 ! Dostęp zabroniony !

Mógłbyś mi wytłumaczyć co jest nie tak? (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) A i czy jest jakiś sposób, żeby pobieranie naszego "sessid" nie kończyło się na wysłaniu do serwera metodą POST reqID=get ? bo jak widać sesji użyć nie można bo właśnie mamy ją pobrać (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

BTW. Pracuję już nad nowym zabezpieczeniem, bo moja strona, która ma za jakieś 2 miesiące powstać musi przetrwać nawet atak nuklearny (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Ten post edytował sniffer32 8.06.2009, 19:02:45
Go to the top of the page
+Quote Post
zegarek84
post
Post #9





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


a dałeś w katalogu uprawnienia do zapisu skryptom?? - na localhoście to hula bez problemu (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

i przecież chyba sprawdzasz też cookies??

i nie da się tego w pełni zabezpieczyć (tzn możesz dorzucić logowanie ale logowanie akurat tutaj do skryptu jest chyba odrazu po wejściu na stronę?? - to cookies?? - przynajmniej odrazu tą drogą szłem)...

można jeszcze na kilka sposobów jedynie utrudnić algorytm tej sesji czy jak to jest - np. sam pomysl z długością ciągu jest niezły - ale skoro już jest ten mechanizm to dlaczego stała długość ciągu?? - czy sesja nie może mieć różnej długości?? - akurat ta moim zdaniem może....

Cytat
A i czy jest jakiś sposób, żeby pobieranie naszego "sessid" nie kończyło się na wysłaniu do serwera metodą POST reqID=get ?

taki może trochę głupi pomysł ale można by obmysleć jakiś algorytm matematyczny przeliczający sesję z cookies do jakiejś cyfry matematycznej i zamiast tego reqID=get dać reqID=[fragment cookies] - dzięki czemu każda nowo otwarta strona miała by inny request - ale to wiadomo, ze jesli kod js bedzie czytelny i oczywisty to i to zabezpieczenie będzie łatwo obejść....

to co chcesz wyświetlić nie da się ukryć po prostu przed światem - co innego z bezpieczeństwem że ktoś ci psikusa zrobi - ale ukraść dane zawsze może ktoś co trochu wie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
Quantum
post
Post #10





Grupa: Zarejestrowani
Postów: 450
Pomógł: 84
Dołączył: 27.11.2008
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


W 1 wersji było coś takiego, że dla reqID, generowało 3 zmienne, ich suma nie mogła przekroczyć sumy liczb odpowiedników znaków unicode wylosowanego ciągu znaków, niestety nie mam już tego skryptu, ale nie chcę mi się już go na nowo pisać (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Stwierdziłem, że jest to w sumie bezsensowne rozwiązanie można to zrobić w php przy użyciu chr(), ord() i odwołać sie cURL'em jak to wcześniej zrobiłeś.

Mój nowy pomysł to:

1. Zamiast: sess = [hash], będzie: [losowy ciag znakow zakodowany w md5] = [hash].
2. Losowy identyfikator dla diva lub pola input, w którym zapisywana jest aktualna sesja.
3. Sesja wywoływana co ustalony okres czasu, przez setInterval.

Co o tym myślisz ? (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Ten post edytował sniffer32 8.06.2009, 18:38:04
Go to the top of the page
+Quote Post
zegarek84
post
Post #11





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


wszystko ok i już trudniej - ale jak już napisałem gożej jak ktoś załapie co z czego się bierze bo jednak dane początkowe są na stronie - tyle tylko że taki gościu jak już pisałem nie zhakuje innych kont a jedynie się zaloguje i na inny serwis walnie wiadomości automatycznie - jedyne co możesz zrobić to spróbować wymyślić jak najtrudniejszy algorytm (co nie zmieni faktu, że i tak dane bez js będzie się dało pobrać) - jednak też nad sposobem za bardzo nie myśl bo czasem tak można zakrecić algorytm że nie zauważy sie iż dużo krótszą drogą można go obejść...

no i jak pisałem kod js końcowy niech już będzie trochu sieczką i nie oczywiste nazwy zmiennych - ale to kod końcowy - jednak czytelny też sobie zostaw w archiwum (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.12.2025 - 21:18