Bezpieczeństwo skryptów PHP, Jak zabezpieczyć się przed włamaniem |
Bezpieczeństwo skryptów PHP, Jak zabezpieczyć się przed włamaniem |
18.02.2011, 20:57:41
Post
#261
|
|
Grupa: Zarejestrowani Postów: 2 148 Pomógł: 230 Dołączył: 26.03.2008 Ostrzeżenie: (0%) |
A czy nie dałoby radę zabezpieczyć plików przed potencjalnym hax0rem w .htaccess? coś typu Disallow from all i dać sobie dostęp tylko do plików na IP które mogą zaszkodzić stronie w sumie zabezpieczaniu jestem na początkowym stanie, ale ostatnio sprawdzałem u kumpla czy może wbić w dany plik i wyskoczyło mu że nie ma dostępu :]. Fakt że hax0r będzie szukał głębiej, nie mniej jednak i tak to jest jakieś zabezpieczenie już. A nie lepiej się po prostu normalnie zabezpieczyć sprawdzonymi sposobami? Szczerze nie rozumiem po co ludzie tak kombinują. (A tak nawiasem to o czym Ty piszesz jest zupełnie bez sensu na stronę www) -------------------- ET LINGUA EIUS LOQUETUR IUDICIUM
|
|
|
26.07.2011, 11:26:47
Post
#262
|
|
Grupa: Zarejestrowani Postów: 116 Pomógł: 4 Dołączył: 4.02.2010 Ostrzeżenie: (0%) |
Tak sobie czytam i czytam ten temat i doszedłem to następujących wniosków:
* Jeśli już robić wczytywanie podstron za pomocą include to owe podstrony muszą być w osobnym katalogu:
* Zawsze filtruje się wszystkie tablice $_GET, $_POST, $_SESSION, $_COOKIE * Jeśli coś ma być int to dajemy if(is_int($_GET['liczba'])){ $liczba = $_GET['liczba']; } * Jeśli coś jest tekstem to robimy: $tekst = mysql_real_escape_string($_POST['tekst']; * Sprawdzamy długość wpisanych danych * jeśli coś ma być emailem to sprawdzamy poprawność tego co zostało wpisane. Czy tych kilka zabezpieczeń jest skutecznych? Może ja coś źle rozumiem. I takie pytanie: jeśli tekst filtruje mysql_real_escape_string to nie muszę używać addslashes, htmlspecialchars itd? Ta funkcja chyba mnie odpowiednio zabezpiecza? -------------------- Blog |
|
|
27.07.2011, 08:39:13
Post
#263
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów |
A może by tak przeczytać CAŁY temat i nie siać herezji, zwłaszcza z bezpośrednim wstawianiem wartości z tablicy $_GET?
-------------------- ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW! |
|
|
27.07.2011, 09:01:32
Post
#264
|
|
Grupa: Zarejestrowani Postów: 116 Pomógł: 4 Dołączył: 4.02.2010 Ostrzeżenie: (0%) |
Przeczytałem cały temat, ale uwierz mi - te wasze małe "sprzeczki" gdzie ktoś mówi, że bredzicie a potem Wy staracie się udowodnić coś manualem... Z tego tematu stał się śmietnik a nie poradnik. Ktoś taki jak ja wchodzi, czyta i ma jeszcze większy mętlik bo ktoś powiedział o czymś tak a jeszcze inny inaczej. Tylko któraś z tych opinii jest słuszna a któraś błędna. To może warto by było zostawić tylko te słuszne? Temat zmniejszył by się o co najmniej kilka stron. Tylko komu by się chciało....
Ten post edytował ZuyPan 27.07.2011, 09:02:47 -------------------- Blog |
|
|
8.08.2011, 14:14:49
Post
#265
|
|
Grupa: Zarejestrowani Postów: 2 148 Pomógł: 230 Dołączył: 26.03.2008 Ostrzeżenie: (0%) |
Tak sobie czytam i czytam ten temat i doszedłem to następujących wniosków: * Jeśli już robić wczytywanie podstron za pomocą include to owe podstrony muszą być w osobnym katalogu:
Jeśli chcesz, żeby ktoś włamał Ci się na stronę to tak. * Zawsze filtruje się wszystkie tablice $_GET, $_POST, $_SESSION, $_COOKIE Nie. Nie zawsze. Według potrzeb. * Jeśli coś ma być int to dajemy if(is_int($_GET['liczba'])){ $liczba = $_GET['liczba']; } Lub po prostu:
* Jeśli coś jest tekstem to robimy: $tekst = mysql_real_escape_string($_POST['tekst']; Też w zależności od sytuacji. * Sprawdzamy długość wpisanych danych To nie jest warunek, ale dobrze to robić. * jeśli coś ma być emailem to sprawdzamy poprawność tego co zostało wpisane. Jak prawie wszędzie... I takie pytanie: jeśli tekst filtruje mysql_real_escape_string to nie muszę używać addslashes, htmlspecialchars itd? A może przeczytaj co robi ta i pozostałe wymienione funkcje... Ten post edytował pyro 8.08.2011, 14:17:02 -------------------- ET LINGUA EIUS LOQUETUR IUDICIUM
|
|
|
9.10.2011, 23:26:41
Post
#266
|
|
Grupa: Zarejestrowani Postów: 19 Pomógł: 0 Dołączył: 10.03.2011 Skąd: Glasgow Ostrzeżenie: (0%) |
|
|
|
10.10.2011, 10:43:01
Post
#267
|
|
Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 20.03.2004 Skąd: Londyn Ostrzeżenie: (0%) |
To ja dodam od siebie jeszcze, że niektóre osoby pisząc aplikacje internetowe, stosują coś takiego jak przechowywanie poufnych danych o userze (po zalogowaniu) w pliku cookie. Taki potencjalny H4X0R może sobie potem swobodnie przeglądać zawartość tych plików i dowolnie je modyfikować. Najgorzej jest wtedy, gdy w takim pliku przechowywana jest wartość zmiennej odpowiedzialna np. za uprawnienia administratora... Wtedy wystarczy ją odpowiednio podmienić i śmiga . Rozwiązaniem są sesje, które przechowują dane na serwerze. Pozdrawiam. Witam, Dwa pytania. Pyt. 1: Jestem w poczatkowej fazie projektu i zastanawiam sie nad mozliwymi rozwiazaniami kontroli praw uzytkownikow. To moj pierwszy projekt w ktorym musze identyfikowac uzytkownika i dodatkowo nadac mu prawa do robienia tego czy tamtego. Po autoryzacji uzytkownika sprawdzam w DB czy i do jakiej grupy nalezy dany uzytkownik (uzywam LDAP do autentyfikacji uzytkowniak wiec ten problem mi odpada bo ta czesc jest wymuszana zasadami bezpieczenstwa w sieci lokalnej i musze wspolpracowac z administratorem sieci odnosnie autentyfikacji). Moje pytanie jest nastepujace: Czy ktos moze podac mi przyklady tego jak nalezy konstruowac logike takiej strony. jak sprawdzac czy dana grupa moze uzywac danej finkcji lub miec dostep do danego linku itp? Jakie rozwiazanie jest najbardziej dynamiczne i efektywne. Moze ktos zna inne rozwiazania nie bazujace na grupach (np. przywileje do wykonywania dannych czynnosci) Mysle np. o tym jak w jednym pliku (np. menu.php) zawierac informacje dla wszystkich grup ale podaczas includowania pliku wyswietlcic tylko linki dla danej grupy uzytkownikow (i/lub linki dla grup ponizej danego lewelu) tzn. ze adminstrator zobaczy wszystkie linki trenerow, userow itp a trener zobaczy link trenerow i usera ale nie administratorow. Pyt. 2: Chcialbym w sesji zapisac informacje o nazwie uzytkownika i jego grupie (Admin, user itp) czy istnieje mozliwosc ze znajac nazwe zmiennej mozna zewnatrznie podmieniac jej wartosc - czyli np.
i przypisac im inne wartosci jesli tak jak moge sie przed tym zabezpieczyc? Nie obawiam sie problemow z loginem bo pracuje w sieci lokalnej dostepnej tylko w jednym budynku Uzywam LDAP do autoryzacji uzytkownika ale boje sie ze zwyczjany uzytkownik moze chciac podmienic swoje prawa i dac sobie uprawnienia administratora po tym jak przypisze sesji jego uprawniania Pozdrawiam! Ten post edytował foxmark 10.10.2011, 10:58:23 |
|
|
31.10.2011, 22:56:58
Post
#268
|
|
Grupa: Zarejestrowani Postów: 289 Pomógł: 1 Dołączył: 2.11.2007 Ostrzeżenie: (0%) |
@evilpr0
Twój kod jest OK |
|
|
31.10.2011, 23:50:41
Post
#269
|
|
Grupa: Zarejestrowani Postów: 260 Pomógł: 14 Dołączył: 8.09.2011 Ostrzeżenie: (0%) |
A co jezeli includujemy pliki bezposrednio uzywajac wartosci get, i pliki includowane znajduja sie w oddzielnym katalogu, ale ktos bedzie sprytny i poda nam w GET sciezke /../../costamcostam.php? /.. - powinno nas przeniesc do katalogu niżej.
Jesli juz ktos koniecznie chce brac bezposrednio z GET to musi regexpem wykasowac te znaki z parametru. Ja tam jestem zwolennikiem białej listy: kazda klasa ktora includuje pliki / uruchamia metody w php funkcją call() biorąc jako parametr parametr z $_GET, korzysta z białej listy (listy dozwolonych wartosci parametru). Taką listę mozna sobie bardzo szybko utworzyc za pomocą array('parametr_1','parametr_2')... a sprawdzic poprawnosc za pomocą $naszParametr = htmlspecialchars($_GET['param']); if (!(in_array($naszParametr, $tablicaDozwolonychWartosci)) { /* Parametr nieprawidlowy, nie znaleziono na liscie, ustawiamy mu tutaj wartosc domyslna lub zatrzymujemy program */ } /* od tego momentu mozemy uwazac wartosc w $naszParametr za poprawną */ include($naszParametr) / call($naszParametr); itd itp biała lista jest znacznie bezpieczniejsza od czarnej listy czy w ogole niesprawdzania poprawnosci bo chroni cie tez przed tym czego nie możesz przewidzieć -------------------- "The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time."
Tom Cargill, Bell Labs |
|
|
1.11.2011, 00:13:03
Post
#270
|
|
Grupa: Zarejestrowani Postów: 1 798 Pomógł: 307 Dołączył: 13.05.2009 Skąd: Gubin/Wrocław Ostrzeżenie: (0%) |
Cytat Jesli juz ktos koniecznie chce brac bezposrednio z GET to musi regexpem wykasowac te znaki z parametru. Nie musi, do tego celu wystarczy jedna funkcja, basename i powyżej danego katalogu już niestety poruszać się nie będzie mógł |
|
|
9.01.2012, 15:26:39
Post
#271
|
|
Grupa: Zarejestrowani Postów: 44 Pomógł: 0 Dołączył: 27.02.2009 Skąd: Bydgoszcz Ostrzeżenie: (0%) |
uFF... minęło 30 minut od kiedy zacząłem czytać temat... i w zasadzie się zgubiłem... Więc może ja zapytam, czy mój kod jest poprawny i ewentualnie jak go "zabezpieczyć"
Bardzo proszę o konkretne wskazówki... |
|
|
9.01.2012, 15:28:47
Post
#272
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk |
Przed tym to ma zabezpieczać? Tutaj jedynie ucinasz sobie szereg funkcjonalności z GET-a zamiast rozważnie pisać kod (a to nie jest takie trudne)
Powód edycji: [wookieb]:
-------------------- |
|
|
9.01.2012, 17:02:58
Post
#273
|
|
Grupa: Zarejestrowani Postów: 44 Pomógł: 0 Dołączył: 27.02.2009 Skąd: Bydgoszcz Ostrzeżenie: (0%) |
no ma zabezpieczać przed atakiem... szeroko rozumianym... gdybym był pewnie na Twoim poziomie wiedzy, to bym tak banalnych pytań nie zadawał... Jeśli mam jakoś bardziej doprecyzować to powiedz jak, a na pewno udzielę odpowiedzi bo jestem żywnie zainteresowany tym, aby moja aplikacja była bezpieczna...
zmienne są różne niektóre numeryczne inne tekstowe... na podstawie tej zmiennej ładuję np. pliki konfiguracyjne dla danej strony... np. http://www.adres.pl/index.php?zmienna=nazwafirmy na podstawie tego ładuję pliki
dlaczego tak? ano dlatego, że obsługuję programem kilka firm i jak wprowadzam zmiany to w plikach skryptu ogólnego... i nie muszę tego robić oddzielnie w każdym katalogu... np. dzięki temu rozwiązaniu ładuję plik css... i każda strona może wyglądać inaczej ale pracować na tym samym "silniku" |
|
|
13.01.2012, 09:57:56
Post
#274
|
|
Grupa: Zarejestrowani Postów: 64 Pomógł: 5 Dołączył: 16.08.2011 Ostrzeżenie: (0%) |
swoją drogą zamiast pisać tak:
możesz zrobić to taki mały OT. CO do zabezpieczenia... tak jak mówił kolega powyżej - zdecydowanie łatwiej i skuteczniej jest pisać rozważnie kod, zamiast stosować takie "myki". Inna sprawa, powinieneś określić jaki zestaw znaków dopuszczasz dla tej zmiennej i odfiltrować to wyrażeniami regularnymi moim zdaniem, tzn np dopuszczać same litery, cyfry i myślnik. EDIT: Gwoli ścisłości, podane wskazówki raczej nie mają wpływu na bezpieczeństwo, ale na wygodę obsługi. Pozdrawiam i powodzenia Ten post edytował vee 13.01.2012, 09:59:13 |
|
|
13.01.2012, 11:48:02
Post
#275
|
|
Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) |
Elo co stosujecie przed csrf i full path disclosure?
Co do pierwszego zastanawiam sie nad tokenami w url lub przez post (pole typu hidden). Co do tego drugiego co stosujecie?error_reporting(0) to racej obejcie problemu niz jego likwidacja. Stosujecie wlasne klasy obslugi bledow? -------------------- Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/ Moj blog |
|
|
13.01.2012, 22:51:38
Post
#276
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów |
Cytat Elo co stosujecie przed csrf Bez tokenów raczej nie przejdzie, aby było uniwersalne. Cytat Co do tego drugiego co stosujecie?error_reporting(0) to racej obejcie problemu niz jego likwidacja. Niczego nie stosuję. Proces interpretera odpalam z chrootem. -------------------- ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW! |
|
|
14.01.2012, 13:47:40
Post
#277
|
|
Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) |
Cytat Niczego nie stosuję. Proces interpretera odpalam z chrootem Dla mniej wtajemniczonych? -------------------- Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/ Moj blog |
|
|
14.01.2012, 13:51:23
Post
#278
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów |
Dla mniej wtajemniczonych jest Google i Wikipedia, której wystarczy użyć: http://pl.wikipedia.org/wiki/Chroot
-------------------- ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW! |
|
|
24.10.2012, 21:16:46
Post
#279
|
|
Grupa: Zarejestrowani Postów: 239 Pomógł: 0 Dołączył: 2.06.2011 Ostrzeżenie: (0%) |
Kilka ostatnich dni spędziłem na analizie tego, co wcześniej pisano na forum i tego, co pisano w artykułach na innych stronach.
Było kilka niejasnych pomysłów na zabezpieczenie strony stąd kilka moich pytań. 1. wielokrotnie mówiono, że dobrym zabezpieczeniem przed CSRF jest dodawanie do ważnych linków tokena - mam jednak pytanie, czy optymalnym rozwiązaniem jest, aby taki token był nadawany przy logowaniu i był on aktywny aż do czasu trwania sesji, czy za każdym razem koniecznie musi być nadawany nowy token? pytam, bo w przypadku drugiego rozwiązania będę mieć o wiele więcej pracy 2. czy koniecznie muszę filtrować nawet dane z tablicy SERVER? przykład zapytania: mysql_query("INSERT INTO tabela (`id`, `ip`) VALUES(NULL, '$_SERVER[REMOTE_ADDR]')"); 3. znalazłem taki kod, który zabezpiecza system przed Session Fixation i Session Hijacking, jednak po jego użyciu mój system logowania nie działa poprawnie wg mnie to największy problem, bo jeśli ktoś przejmie moją sesję, przejmę całkowitą kontrolę nad systemem i będzie mógł zrobić niemal wszystko
4. aby zabezpieczyć się przed dodawaniem identyfikatora sesji do adresu www, należy dodać kod: session.use_only_cookies = 1 tyle że do którego pliku i w jaki sposób? 5. to samo tyczy się poniższego kodu, który należy dodać do .htacces: php_value session.use_only_cookies 1 php_value session.use_trans_sid 0 ale gdy go dodaje, pojawia się błąd 6. znalazłem też informację, że warto regenerować identyfikator sesji przy każdym odświeżeniu (session_regenerate_id( ), ale rodzi to problem - co, jeśli użytkownik otworzy stronę w dwóch oknach? wtedy w jednym zostanie wylogowany 7. czy dodatkowym zabezpieczeniem może być nadanie chmodu 600 na plik config? 8. aby hasło użytkowników było bezpieczne, przy rejestracji postanowiłem skorzystać ze schematu: HASH = md5( sól systemowa [16 znaków] + md5(hasło użytkownika) + idywidualna sól nadana dla użytkownika zapisana w bazie [16 znaków] ) czy myślę dobrze, że jest to bezpieczne, bo, nawet jeśli ktoś ukradnie nam dane, nie zna soli systemowej (zapisanej w config), a jeśli wejdzie w posiadanie systemu, nie będzie znać soli przypisanej do użytkownika polecano mi PHPass, ale wolę to zrobić tym sposobem, jeśli uznacie to za bezpieczne 9. czy naprawdę do sesji warto dodać identyfikator użytkownika (czyli ID, np. 123), jego IP oraz przeglądarkę? kod:
10. czy przy autologowaniu do ciastka powinienem dodać ID użytkownika oraz HASH, o którym mowa w punkcie 8? czy to aby na pewno bezpieczne? |
|
|
25.10.2012, 09:23:34
Post
#280
|
|
Grupa: Zarejestrowani Postów: 142 Pomógł: 24 Dołączył: 30.03.2009 Skąd: Rokitno Szlacheckie Ostrzeżenie: (0%) |
1. powinno być za każdym razem generowane z osobna
2. $_SERVER['HTTP_USER_AGENT'] zawiera dane potencjalnie niebezpieczne. 4. php.ini lub ini_set() 6. ni zostanie, chyba że otwarcie obu stron nastąpi w tym samym momencie. 7. i tak i nie, bo to proces httpd/cgi ma odczytać ten plik i uprawnienia muszą być dostosowane do uprawnień procesu wykonującego (choć zwykle jest to root/httpd) 9. sesja powinna być unikalna, więc ID jest nie potrzebne 10. jak przy 9. |
|
|
Wersja Lo-Fi | Aktualny czas: 27.04.2024 - 19:26 |