Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

16 Stron V  « < 7 8 9 10 11 > »   
Reply to this topicStart new topic
> Bezpieczeństwo skryptów PHP, Jak zabezpieczyć się przed włamaniem
mlattari
post
Post #161





Grupa: Zarejestrowani
Postów: 79
Pomógł: 3
Dołączył: 23.12.2008
Skąd: Piaseczno

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


Cytat(bełdzio @ 3.03.2009, 14:01:31 ) *
tak zalozmy ze wchodzisz na strone profil.php na ktorej jest link do strony usun_konto.php, parametrem tego linku jest token, teraz po wejsciu na strone usun_konto spr czy token z url jest taki sam jak w sesji, jesli tak to znaczy ze user kliknal na odpowiedni link na odpowiedniej stronie


Wymyśliłem sobie coś takiego

  1. <?php
  2. function checktoken()  {
  3.  if($_SESSION['zeton']!=$_GET['token']) diee_close(); }
  4.  
  5. function generate_token() {
  6. $literki="abcdefghijklmnopqrstuwvxyzABCDEFGHIJKLMNOPQRSTUWVXYZ";
  7. $cyferki="0123456789";
  8. for($tokelen=1;$tokenlen<=32;$tokenlen++) {
  9.   $token.=substr($literki,rand(0,strlen($literki)-1),1).substr($cyferki,rand(0,strlen($cyferki)-1),1);  }
  10. $_SESSION['zeton']=$token;
  11. return $token; }
  12. ?>


no i oczywiście na początku skryptów daję
checktoken();
$token=generate_token();

i wklejam ?token={$token} do linków...

To chyba lepsze niż moje poprzednie (raczej rzeczywiście beznadziejne) rozwiązanie (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) ?
Jeżeli to jest OK to będę musiał to dodać w kilku serwisach.... no i chyba przyda się linuchowy sed do pododawania tokena w linkach :-)

Ten post edytował mlattari 6.03.2009, 01:34:36
Go to the top of the page
+Quote Post
marcio
post
Post #162





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

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


Nie wiem co robi diee_close() ale jesli nic nie zwraca to moze nie dzialac bo troche nie ma sensu to raz a dwa to jakos kombinujesz ze sklejaniem ciagu i jeszcze nie bedzie on az taki losowy ja 2 dni temu napisac cos takiego jeszcze w praktyce nie uzywalem ale dzialac dziala:
  1. <?php
  2. function InitCsrfSession() {
  3.  
  4.  $InitLenght = rand(1,5);
  5.  $EndLenght = rand(10,20);
  6.  
  7.  return substr(md5(time()), $InitLenght,$EndLenght);
  8.  
  9. }
  10.  
  11.  
  12. function CheckCsrfSession($GetSession) {
  13.  
  14.  ($GetSession == $_SESSION['CSRF']) ? $bool = true : $bool =  false;
  15.  
  16.  return $bool;
  17.  
  18. }
  19.  
  20. //Przypisujesz
  21. $_SESSION['CSRF'] = InitCsrfSession();
  22. ?>
Go to the top of the page
+Quote Post
mlattari
post
Post #163





Grupa: Zarejestrowani
Postów: 79
Pomógł: 3
Dołączył: 23.12.2008
Skąd: Piaseczno

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


No masz racje :-) U mnie jest rzeczywiście mało losowo :-( Chyba będę musiał dodać coś z md5 tak jak u Ciebie. Dzięki za podpowiedź.
Go to the top of the page
+Quote Post
erix
post
Post #164





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
no i chyba przyda się linuchowy sed do pododawania tokena w linkach :-)

ob_start" title="Zobacz w manualu PHP" target="_manual + preg_replace" title="Zobacz w manualu PHP" target="_manual
Go to the top of the page
+Quote Post
marcio
post
Post #165





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

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


Cytat(erix @ 6.03.2009, 22:37:26 ) *

O co chodzi^^(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post
mlattari
post
Post #166





Grupa: Zarejestrowani
Postów: 79
Pomógł: 3
Dołączył: 23.12.2008
Skąd: Piaseczno

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


Prawdopodobnie można zbuforować zawartość stronki, podmienić określone wyrażenia i zapisać ponownie :-)
Go to the top of the page
+Quote Post
erix
post
Post #167





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Tak, jak to robi mechanizm sesyjny dopisując SID w przypadku włączonego rewriter_tags. (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
looooonger
post
Post #168





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 28.03.2009

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


przejrzałem posty w tym temacie, i ogólnie to wszystkie mówią o trochę bardziej skomplikowanych sytuacjach niż te, z którą ja mam do czynienia tzn:

Strona jest praktycznie statyczna, a php używam tylko do zaincludowania nagłówka i stopki, ale nazwy plików nie pochodzą z posta/geta tylko są zahardcodowane. Czy ciągnie to za sobą jakieś niebezpieczeństwo? Wolę się upewnić. Drugie pytanie, czy mechanizm google search engine może wpłynąć na bezpieczeństwo strony? Uzywam go w ten sposób:

Na stroni z wynikami:
  1. <div id="cse-search-results"></div>
  2. <script type="text/javascript">
  3. var googleSearchIframeName = "cse-search-results";
  4. var googleSearchFormName = "cse-search-box";
  5. var googleSearchFrameWidth = 600;
  6. var googleSearchDomain = "www.google.com";
  7. var googleSearchPath = "/cse";
  8. <script type="text/javascript" src="http://www.google.com/afsonline/show_afs_search.js"></script>

formatka wyszukiwarki:


  1. <form action="szukaj.php" id="cse-search-box">
  2. <div>
  3. <input type="hidden" name="cx" value="004632895002302782970:fakn9rzjcvi" />
  4. <input type="hidden" name="cof" value="FORID:11" />
  5. <input type="hidden" name="ie" value="UTF-8" />
  6. <input type="text" name="q" size="31" />
  7. <input type="submit" name="sa" value="Szukaj" />
  8. </div>
  9. </form>
  10.  
  11. <script type="text/javascript" src="http://www.google.com/coop/cse/brand?form=cse-search-box&lang=pl"></script>
Go to the top of the page
+Quote Post
bełdzio
post
Post #169





Grupa: Zarejestrowani
Postów: 690
Pomógł: 81
Dołączył: 6.04.2005
Skąd: Szczecin

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


Cytat(looooonger @ 28.03.2009, 23:09:52 ) *
Czy ciągnie to za sobą jakieś niebezpieczeństwo? Wolę się upewnić. Drugie pytanie, czy mechanizm google search engine może wpłynąć na bezpieczeństwo strony?

ad1. poki nie pobierasz niczego z zewnatrz skryptu wsio jest ok
ad2. nie - no chyba ze Googla shakuja (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował bełdzio 28.03.2009, 23:40:02
Go to the top of the page
+Quote Post
nieraczek
post
Post #170





Grupa: Zarejestrowani
Postów: 405
Pomógł: 6
Dołączył: 12.01.2007

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


Chciałem dowiedzieć się jak zabezpieczać się przed atakami CSRF więc zrobiłem testową aplikację do tego celu:
użytkownik może dodawać i usuwać znajomych oraz pisać komentarze a w nich umieszczać linki. Użytkownik może usunąć ze znajomych użytkownika klikając na link 'usuń' w swoim profilu w znajomych - na końcu linka jest podawany id znajomego do usunięcia:
  1. <a href="/profil/znajomi/usun/<?php echo $z->getIdentyfikator() ?>" >usuń ze znajomych</a>


Po kliknięciu w linka, id jest oczywiście zamieniane na liczbę całkowitą, jest sprawdzenie czy w ogóle podano id, czy użytkownik o takim id istnieje oraz czy zalogowany użytkownik, który chce usunąć znajomego ma w swoich znajomych użytkownika o danym id.

Użytkownik o id=2 ma w znajomych uzytkownika o id=4.

Jako użytkownika o id=999 dodałem komentarz:
"Bla, bla,<IMG src="/profil/znajomi/usun/4"> bla, bla"

Następnie zalogowałem się jako użytkownik o id=2 i wszedłem na stronę z tym komentarzem, w skutek czego nie zobaczyłem oczywiście obrazka a z moich znajomych został usunięty użytkownik o id=4 bez mojej wiedzy i zgody - klasyczny przykład ataku CSRF.

Wymyśliłem więc sobie, że żeby usunąć użytkownika ze znajomych trzeba to potwierdzić - do czego użyłem ajaxa:
  1. <a href="/profil/znajomi" onclick="potwierdzUsuniecieZnajomego(<?php echo $z->getIdentyfikator() ?>); " >usuń ze znajomych</a>


Po kliknięciu na linka wyskakuje messagebox z prośbą o potwierdzenie, w przypadku potwierdzenia do funkcji php z funkcji javascript jest przesyłany id użytkownika do usunięcia ze znajomych metodą post, w funkcji php jest sprawdzane czy żądanie przyszło metodą post itd. czego skutkiem jest usunięcie osoby ze znajomych.

Po wyłaczeniu w przeglądarce javascripta usunięcie uzytkownika ze znajomych nie jest możliwe, ale:
"Bla, bla,<IMG src="/profil/znajomi/usun/4"> bla, bla" już nie działa (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)

Czy to wystarczające zabezpieczenie przed atakiem CSRF ?
Go to the top of the page
+Quote Post
bełdzio
post
Post #171





Grupa: Zarejestrowani
Postów: 690
Pomógł: 81
Dołączył: 6.04.2005
Skąd: Szczecin

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


nie przeciez zamiast odwolywac sie do adresu /profil/znajomi/usun/4 moge odwolac sie do adresu strony z potwierdzeniem, wlasnie kopiuje na blogaska notke o csrf tak wiec rzuc okiem za jakies 5 - 10 min (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
nieraczek
post
Post #172





Grupa: Zarejestrowani
Postów: 405
Pomógł: 6
Dołączył: 12.01.2007

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


bełdzio wielkie dzięki - dzięki Tobie nareszcie zrozumiałem jak zabezpieczać się przed tymi atakami (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Super artykuł.

------------------
@edycja


Mam jeszcze pytanie odnośnie ataków CSRF - w przypadku linków usuwających coś z bazy danych wystarczy, że atakujący w komentarzu wpisze np.:
  1. <img src="http://adres.pl?usun=10" />

Ofiara po wejściu na tę stronę z takim wpisem usunie nieświadomie coś tam o id=10. W takim wypadku rozumiem doklejanie unikatowego tokena do linku i potem go sprawdzanie.

Natomiast nie bardzo rozumiem dodawania do formularza ukrytego pola z tokenem. Co atakujący miałby wpisać żeby ofiara po wejściu na stronę z tym niebezpiecznym wpisem została nieświadomie przekierowana na stronę z formularzem i nieświadomie kliknęła na button typu submit ? To jest chyba niemożliwe w przypadku formularzy ?

Ten post edytował nieraczek 24.05.2009, 11:55:13
Go to the top of the page
+Quote Post
bełdzio
post
Post #173





Grupa: Zarejestrowani
Postów: 690
Pomógł: 81
Dołączył: 6.04.2005
Skąd: Szczecin

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


wystarczy ze stworze na swojej stronie formularz z ukrytymi inputami i widocznym przyciskiem "WYgraj 100 000 pln"; user klika na button i na właściwy serwer przesyłane są dane, których autorem jest nasza ofiara (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
nieraczek
post
Post #174





Grupa: Zarejestrowani
Postów: 405
Pomógł: 6
Dołączył: 12.01.2007

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


A jak macie formularze, np. żeby było bardziej obrazowo: formularz do wysyłania odpowiedzi na otrzymane prywatne wiadomości:

  1. <form method="post" action="/wyslij_odpowiedz/na_wiadomosc/68/do_uzytkownika/11">
  2. ..........
  3. </form>


To te numery - id w action można pozmieniać w dodatku do firefoxa: firebug. Więc po zatwierdzeniu formularza też należy sprawdzać czy dany użytkownik dostał wiadomość o danym id od danej osoby o danym id itd. ?

Ten post edytował nieraczek 12.06.2009, 08:47:21
Go to the top of the page
+Quote Post
pyro
post
Post #175





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


Najprostszym zabezpieczeniem przed atakami CSRF jest poprostu dodawanie id sesji i sprawdzanie jej. Np:

  1. <?php
  2. /*
  3. ...
  4. tu wysylam jakis formularz i jako hidden daję id sesji
  5. ...
  6. */
  7.  
  8. if(empty($_POST['sess_id']) || $_POST['sess_id'] != session_id())
  9. {
  10. die('Czy napewno nie próbujesz mi zaszkodzić Panie majster?');
  11. }
  12. ?>
Go to the top of the page
+Quote Post
nieraczek
post
Post #176





Grupa: Zarejestrowani
Postów: 405
Pomógł: 6
Dołączył: 12.01.2007

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


Ale nie chodzi mi o ataki csrf tylko ataki wykonane programem firebug, dzięki któremu można dowolnie modyfikować kod html strony i dzięki temu zmieniać ID w akcji formularza, co w konsekwencji mego poprzedniego posta spowoduje wysłanie odpowiedzi do innej osoby niż nadawca danej wiadomości. Inny przykład to jak edytujemy dany post na jakimś forum i w akcji formularza za pomocą firebuga zmienimy ID to w ten sposób moglibyśmy zmodyfikować posta innej osoby jeśli po zatwierdzeniu formularza nie sprawdzimy czy dany użytkownik edytuje swój własny post ufając temu, że akcja formularza nie została zmieniona. Chodzi mi o to, że akcje formularza są tak samo niebezpieczne jak adresy URL i łatwe do modyfikacji programami typu firebug. Rozumie ktoś czy dać przykład ? (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Ten post edytował nieraczek 12.06.2009, 10:16:46
Go to the top of the page
+Quote Post
Crozin
post
Post #177





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Rozumie. Tylko nie widzę pytania... bo na jedyne jakie postawiłeś sam sobie odpowiedziałeś.
Go to the top of the page
+Quote Post
pyro
post
Post #178





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


Dopisująć się do Crozina:

@nieraczek, wygląda na to, że gadasz sam ze sobą (IMG:http://forum.php.pl/style_emoticons/default/withstupidsmiley.gif)
Go to the top of the page
+Quote Post
bełdzio
post
Post #179





Grupa: Zarejestrowani
Postów: 690
Pomógł: 81
Dołączył: 6.04.2005
Skąd: Szczecin

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


Cytat(nieraczek @ 12.06.2009, 09:47:02 ) *
To te numery - id w action można pozmieniać w dodatku do firefoxa: firebug. Więc po zatwierdzeniu formularza też należy sprawdzać czy dany użytkownik dostał wiadomość o danym id od danej osoby o danym id itd. ?

jakie są ograniczenia na wysylanie prywatych wiadomosci? bo jesli moge wyslac do kazdego to co za problem czy klikne w jego profilu "napisz wiadomosc" czy sobie zmienie w formie?
Go to the top of the page
+Quote Post
Crozin
post
Post #180





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


@bełdzio: A co jak ustawisz ID użytkownika, które nie istnieje? W przypadku gdy masz ustawione klucze obce w tabeli piękny błąd wywali.
Poza tym luki, które nawet potencjalnie są niegroźne powinny być szybko poprawiane.
Go to the top of the page
+Quote Post

16 Stron V  « < 7 8 9 10 11 > » 
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: 10.09.2025 - 23:51