Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Bezpieczeństwo skryptów PHP
Forum PHP.pl > Forum > PHP
Stron: 1, 2, 3, 4, 5, 6, 7
Kocurro
Też kiedyś myślałem o użyciu base64 ... ale potem zrozumiałem, że lepiej zamieniać na kod binarny - czyli 0 i 1 ... a następnie dokładać dane kontrolne oraz naprawcze. Mój pomysł okazał się genialny w swojej prostocie ... tylko nie wiem czemu tak szybko baza się rozrastała .... hmm
erix
Cytat
Co wy na to, żeby zamiast backslashowania dane wysyłane do MySQL zakodować w base64

ohmy.gif

Nie dość, że dane będą faktycznie zajmować więcej (133%), to jak chcesz po base64 szukać?
nospor
Cytat
to jak chcesz po base64 szukać
erix, ale tu jest mowa o bezpieczenstwie a nie o szukaniu winksmiley.jpg

a juz tak bardziej powaznie:
@legalizetrawka poroniony pomysl. to co jest sprawdza sie doskonale i nie ma sensu tu czegokolwiek jeszcze przez base64 przepuszczac
erix
~nospor, ale wady przeważają nad korzyściami.

edit@down: bannerowo-grafikowa ślepota tongue.gif
nospor
@erix ale te mrugniecie oka zauwazyles na koncu mojego zdania? Znaczylo ono, iz moją odpowiedź nalezy potraktowac z przymruzeniem oka, taki zart.... tongue.gif
juz nie wspomne o tym zdaniu
Cytat
a juz tak bardziej powaznie:
pyro
Po co ludzie kombinują na już ósme i dziesiąte sposoby, zamiast korzystać ze sprawdzonych i 100% dobrych sposobów tiredsmiley.gif
Fifi209
Cytat(pyro @ 20.07.2009, 13:08:49 ) *
Po co ludzie kombinują na już ósme i dziesiąte sposoby, zamiast korzystać ze sprawdzonych i 100% dobrych sposobów tiredsmiley.gif


Żebyśmy mieli o czym dyskutować. smile.gif

A tak poważnie, każdy programista marzył chyba o własnym zaawansowanym systemie zabezpieczeń, zrozumiałym pod kątem kodu i zabezpieczeń tylko dla niego, a użytkownik miałby tylko korzystać.

Wiele wizji, kiedyś chciałem zrobić system logowania w php, który opierałby się na kluczach etc. przechowywanych na pendrive - jednak wiedza jaką wtedy posiadałem pozwalała mi korzystać z zaawansowanych metod typu:
  1. <?php
  2. if ($_POST['haslo'] == 'test') {
  3. }else{
  4. }
  5. ?>
andycole
a nie wystarczy calkowite strip_tags() (uzywamy bbcode) + mysql_real_escape_string() + filtracja danych ?
erix
A może byś tak ten wątek od początku przeczytał...?
maly_pirat
Cześć, a jak wygląda sprawa tablic (ARRAY)? Da się jakoś je wykraść z poziomu przeglądarki? - nie znam się na hakerstwie, i stąd moje pytanie. W tablicy trzymam np. ustawienia strony, połączenie do bazy (dane).

  1. $settings = array
  2. (
  3. 'db' => array
  4. (
  5. 'host' => 'localhost',
  6. 'user' => 'root',
  7. 'pwd' => 'krasnal'
  8. ),
  9.  
  10. );
andycole
W podanym przez Ciebie przykladzie nie ma szansy na wykradniecie tego z poziomu przegladarki.
Jedynym sposobem dobrania sie do tablicy to wglad w kod zrodlowy.

BTW. Pliki z configiem, kodem zrodlowym php, mysql nie trzymaj w katalogu public_html tylko pietro wyzej, tak zeby z poziomu przegladarki nie miec do nich dostepu.
xajart
Jak zabezpieczać sesje? A właściwie to chodzi mi o rozwiazanie z tokenami, prześledziłem cały ten wątek jak i wiele innych materiałów w sieci. Ale dalej męczą mnie pytania na które nie znam odpowiedzi. 

Rozumie że kiedy użytkownik się loguje do systemu i przejdzie przez cały proces weryfikacyjny, ma być generowany unikalny token.

Na 6 stronie jest przykłądowy skrypt jak taki token generować, przy pomocy output_add_rewrite_var taki token mogę przypisać do "wszystkich" (większośći linków) wewnątrz serwisu.

Pytania:

  1. Rozumie że dane z tokenem przechowywać w cookis i sesji?
  2. Id sesji regenrować co np 30 sekund (by uniknąc jej ustawienia - session_regenerate_id
  3. jak zabezpieczyć użytkownika by nie był wylogowywany z sesji jeżeli jest aktywny, oraz w drugą stronę by był wylogowany z sesji jeżeli jego nieaktywność przekracza np 30 minut. (przychodzi mi do głowy rozwiazanie w stylu, żę przy kazdej akcji w BD przy użytkowniku zmieniać czas ostatniej wizyty i na jej podstawie sprawdzać?)
  4. pytanie nie zwiazane z tokenami, w jaki sposób zabezpieczyć się przed logowaniem kilku użytkowników na to samo konto?
  5. jeżeli w sesji będę przechowywać tablicę z uprawnieniami użytkownika co do serwisu, to czy to jest bezpieczne (bo w wypowiedziach wyższych czytałem że nie, ale jak ktoś powiedził nie ma sensu za każdym razem sprawdzać uprawnienia użytkownika) wiec jak to najlepiej rozwiazać?
  6. co to jest tablica routingu? jak ją ewentualnie skonstruować w BD i jak jej używać - czytałem że jest to dobra forma zabezpieczenia, ale czy niebędzie to obciążać dodatkowo pracy serwisu, bo wkońcu poza bezpieczenstwem chodzi też o wydajność.
  7. I jeszcze jedna kwestia dotycząca życia sesji, a mianowicie jeżeli uztykownikowi zostaną zmienione uprawnienia, to jak zmusić tego użytkownika by został wylogowany z sesji (czyli by jego sesja się zresetowała) - w tym przypadku zapewne jakieś rozwiązanie z BD ? wyżej ktoś pisał o tym ale niewiele z tego zrozumiałem.
  8. i ostatnie pytanie czy istnieją jakiest automatyczne testery tzw. fuzzery - do sprawdzania skryptu, przed róznymi atakami, kiedyś szukałem i jakiś znalazłem ale głównie opierał się na sprawdzaniu ochrony przed SQL-Injector. A tych form ataków jest bardzo wiele.
Narazie tyle.

erix
1: Hmm, na większość Twoich pytań najlepszą odpowiedzią byłoby nieco lektury na temat XSRF (jest w wiki).
2: robisz stronę dla banku? tongue.gif A teraz na serio - każdorazowe regenerowanie ID sesji jest nieco przesadne...
3: jeśli ustawisz długość sesji przez session_set_cookie_params, to będzie ona automatycznie przedłużana przez podany okres czasu (ciastko). Jeśli chodzi o DB, to tak, jak napisałeś.
4: sprawdzanie po IP odpada, gdyż kilku użytkowników zaloguje się z jednej sieci i guzik z zabezpieczenia. Najlepiej sprawdzać bardziej spersonalizowane dane, np. rozdzielczość (wymagane manipulowanie przez JS), czy ścisłe sprawdzanie User-Agent.
5: ja rozwiązałem podobny problem w ten sposób - tabela sesyjna jest typu MEMORY i dałem dodatkowe pole forceReload. W przypadku konieczności zmiany zestawu uprawnień, przestawiam tę flagę z poziomu skryptu, a przy najbliższej akcji użytkownika - zostanie wymuszone przeładowanie zestawu uprawnień.
6: mhmm, to chyba nie chodzi o zabezpieczenia sesji, bo jeszcze o routingu w tym kontekście nie słyszałem...
7: a po co? Patrz: moja odpowiedź na 5. A jeśli już koniecznie chcesz wymusić przelogowanie, to możesz przecież wyczyścić tabelę sesyjną. Ostatecznie - session_regenerate_id.
8: wiele razy słyszałem zdanie w stylu - chcesz projektować dobre zabezpieczenia? musisz zacząć myśleć, jak złodziej. Żaden automat nie zastąpi dobrego i doświadczonego audytora. Odpowiadając na pytanie - nie słyszałem o takich narzędziach.
xajart
Co do punktu 5 to nie wpadłem na takie rozwiązanie jak przedstawiłeś - ale to jest dobry pomysł. Nie robie strony dla banku, tylko chciałem zakres swójej wiedzy trochę poszerzyć.
AboutMe
Chciałbym w komentarzach dać możliwość userom wpisywania urli, czy filtrowanie wszystkiego poza literami, cyframi, slashem oraz kropkami i myślnikami jest bezpieczne?
Tetris
Witam

Ostatnio rejestrowałem się na sfd.pl i tam zauważyłem dość ciekawy mechanizm (i prosty) mechanizm ochrony przed botami.
Otóż standardowo po rejestracji dostajemy na maila linka aktywacyjnego, ale ten zamiast na właściwą stronę, to przenosi nas na formularz gdzie musimy wpisać hasło, aby zakończyć rejestację. Hasło jest oczywiście w mailu z wcześniej wysłanym linku aktywacyjnym?

Zastanawiam się czy nie zastosować tego u siebie (obecnie mam tylko zwykłą walidację pól przy rejestracji + link na maila). Na pierwszy rzut oka mechanizm wydaje mi się odporny na boty, co o tym myślicie?

Pozdrawiam
Fifi209
Cytat(Tetris @ 3.03.2010, 19:49:21 ) *
Witam

Ostatnio rejestrowałem się na sfd.pl i tam zauważyłem dość ciekawy mechanizm (i prosty) mechanizm ochrony przed botami.
Otóż standardowo po rejestracji dostajemy na maila linka aktywacyjnego, ale ten zamiast na właściwą stronę, to przenosi nas na formularz gdzie musimy wpisać hasło, aby zakończyć rejestację. Hasło jest oczywiście w mailu z wcześniej wysłanym linku aktywacyjnym?

Zastanawiam się czy nie zastosować tego u siebie (obecnie mam tylko zwykłą walidację pól przy rejestracji + link na maila). Na pierwszy rzut oka mechanizm wydaje mi się odporny na boty, co o tym myślicie?

Pozdrawiam


Dla chcącego nic trudnego. Równie dobrze możesz dodać captchę - to jest trudniejsze do złamania przez laika.
Tetris
Czyli lepiej dać to i to:)

Pozdrawiam
Zyx
Sposób będzie odporny na boty, dopóki się nie upowszechni i ktoś nie napisze bota pozwalającego go obejść, co zresztą nie byłoby takie znowu trudne. Takie wynalazki mają szansę dłużej podziałać jedynie wtedy, gdy będą na tyle unikalne, a strona na tyle mała, że "grube ryby" po prostu nie zauważą, że spamowanie tam nie do końca działa, jak powinno. Coś takiego mam na swoim blogu - zabezpieczenie jest idiotycznie prosto obejść, lecz jest ono też tak bardzo powiązane z pomysłem tego bloga, że praktycznie jest nie do powielenia na innych stronach, a tym samym twórcom botów nie opłaca się specjalnie dla niego pisać odpowiedniego algorytmu.

Jeśli chcesz w miarę skuteczny sposób na przeciwdziałanie rejestrowaniu się spamerom, po prostu podłącz się do jakiejś bazy spamerów, np. http://www.stopforumspam.com/ - przy rejestracji możesz odpytać ją o to, czy dany użytkownik jest spamerem i jeśli tak, to dane konto oznaczasz jako "do ręcznego aktywowania przez administratora".
Fifi209
Cytat(Zyx @ 3.03.2010, 20:02:01 ) *
Sposób będzie odporny na boty, dopóki się nie upowszechni i ktoś nie napisze bota pozwalającego go obejść, co zresztą nie byłoby takie znowu trudne. Takie wynalazki mają szansę dłużej podziałać jedynie wtedy, gdy będą na tyle unikalne, a strona na tyle mała, że "grube ryby" po prostu nie zauważą, że spamowanie tam nie do końca działa, jak powinno. Coś takiego mam na swoim blogu - zabezpieczenie jest idiotycznie prosto obejść, lecz jest ono też tak bardzo powiązane z pomysłem tego bloga, że praktycznie jest nie do powielenia na innych stronach, a tym samym twórcom botów nie opłaca się specjalnie dla niego pisać odpowiedniego algorytmu.

Jeśli chcesz w miarę skuteczny sposób na przeciwdziałanie rejestrowaniu się spamerom, po prostu podłącz się do jakiejś bazy spamerów, np. http://www.stopforumspam.com/ - przy rejestracji możesz odpytać ją o to, czy dany użytkownik jest spamerem i jeśli tak, to dane konto oznaczasz jako "do ręcznego aktywowania przez administratora".


Fajny pomysł winksmiley.jpg

Wymodziłem coś takiego: (dla chcących spróbować tego rozwiązania)
  1. <?php
  2.  
  3. function isSpammer($name, $mail, $ip) {
  4. $mh = curl_multi_init();
  5.  
  6. $ch[] = curl_init();
  7. curl_setopt(end($ch), CURLOPT_URL, 'http://www.stopforumspam.com/api?username='.$name);
  8. curl_setopt(end($ch), CURLOPT_RETURNTRANSFER, true);
  9. curl_multi_add_handle($mh, end($ch));
  10. $ch[] = curl_init();
  11. curl_setopt(end($ch), CURLOPT_URL, 'http://www.stopforumspam.com/api?email='.$mail);
  12. curl_setopt(end($ch), CURLOPT_RETURNTRANSFER, true);
  13. curl_multi_add_handle($mh, end($ch));
  14. $ch[] = curl_init();
  15. curl_setopt(end($ch), CURLOPT_URL, 'http://www.stopforumspam.com/api?ip='.$ip);
  16. curl_setopt(end($ch), CURLOPT_RETURNTRANSFER, true);
  17. curl_multi_add_handle($mh, end($ch));
  18.  
  19. $response = array();
  20. $running = null;
  21.  
  22. do {
  23. curl_multi_exec($mh, $running);
  24. }while($running > 0);
  25.  
  26. foreach ($ch as $val) {
  27. $response[] = curl_multi_getcontent($val);
  28. curl_multi_remove_handle($mh, $val);
  29. }
  30.  
  31. curl_multi_close($mh);
  32.  
  33. $spammer = false;
  34.  
  35.  
  36. foreach ($response as $val) {
  37. if (preg_match('#<appears>yes</appears>#', $val)) {
  38. $spammer = true;
  39. break;
  40. }
  41. }
  42.  
  43. return $spammer;
  44. }
  45.  
  46. var_dump(isSpammer('Sanjana', 'sdfsdf@gmail.com', '127.0.0.1'));
  47. echo '<br/>';
  48. var_dump(isSpammer('Sanjanad', 'afghdfgh@gmail.com', '81.200.16.66'));
  49. echo '<br/>';
  50. var_dump(isSpammer('arturf209', 'mojmail@gmai.com', '127.0.0.1'));
  51.  
  52.  
  53. ?>
Crozin
@fifi209: a to ta strona www.stopforumspam.com nie umożliwia pobrania bazy spamerów? Przeszukanie lokalnej bazy danych będzie bezporównania szybsze, niż wykonywanie rządań curlem. Do tego zautomatyzowany cotygodniowy update lokalnej bazy.
Fifi209
Cytat(Crozin @ 3.03.2010, 21:18:05 ) *
@fifi209: a to ta strona www.stopforumspam.com nie umożliwia pobrania bazy spamerów? Przeszukanie lokalnej bazy danych będzie bezporównania szybsze, niż wykonywanie rządań curlem. Do tego zautomatyzowany cotygodniowy update lokalnej bazy.


Umożliwia. smile.gif Ale skoro udostępniają webapi to dałem przykład jak z niego korzystać.
Spawnm
Hey pytanie o bezpieczeństwo , co jest lepsze do zabezpieczenia się przed XSS :
htmlspecialchars($str, ENT_NOQUOTES, 'UTF-8') czy filter_var ( $val , FILTER_SANITIZE_SPECIAL_CHARS) ?
thek
Ja uważam, że to drugie z ustawionymi flagami na stripowanie low (kody ASCII niższe niż 32) i high (kody ASCII powyżej 127). Ostatecznie zawsze można się zastanawiać nad sanitize_string. Zależy do czego konkretnie potrzebne. Ale to chyba sam wiesz z doświadczenia
pyro
A według mnie ta pierwsza metoda. Jest czytelniejsza, szybsza i nie do ominięcia.
zend
@pyro - mógł byś podać argumenty/źródła dzięki którym masz taką pewność?
pyro
A który konkretnie argument masz na myśli?
Fifi209
Cytat(pyro @ 27.05.2010, 21:28:39 ) *
A według mnie ta pierwsza metoda. Jest czytelniejsza, szybsza i nie do ominięcia.

No raczej o tego posta chodzi ~zendowi
pyro
Wiem, że o tego posta mu chodziło, ale pytałem o którą konkretnie rzecz mu chodzi:

- czytelniejsza (według mnie) - jest w przypadku dodatkowych flag dla filter_var. Programista często nie zna na pamięć wszystkich znaków ASCII, a htmlspecialchars() ma prostą i zrozumiałą budowę. Jednak jeżeli miałyby być one wywoływane dosłownie w ten sposób jak to napisał @Spawnm, to generalnie nie ma to różnicy
- szybsza - kiedyś zadałem sobie takie samo pytanie, więc potrudziłem się o testy. Różnica szybkości jest mało znacząca, ale jeśli już jesteśmy przy porównywaniu... smile.gif
- nie do ominięcia - a co? Zna ktoś jakoś metodę, aby ominąć to filtrowanie?
Spawnm
Cytat(pyro @ 27.05.2010, 21:28:39 ) *
... i nie do ominięcia.

A jak drugą można obejść?
pyro
Nie wiem czy się da (nie wiem czy ktoś już się potrudził o testowanie bezpieczeństwa tej funkcji), jednak wiem, że htmlspecialchars() na pewno się nie da.
Spawnm
Hey chcę dać userowi możliwość wstawiania linków przez bbcode na stronie www , i teraz pytanie:
czy taki kod:
  1. //any string
  2. $str='http://sadf.pl onclick="alert(1)"';
  3. //filtr
  4. $str=str_replace(array('%20','+',' ','"','\''),'',$str);

w 100% zabezpieczy mnie przed xss ?
wookieb
Usunięcie ciągu javascript oraz wywalenie " jest wystarczające (oczywiście z linku)
Spawnm
A po co wywalenie ciągu javascript?
Link zawsze zaczyna się od http:// więc dodanie na końcu http://adsf.pl/java script:alert(1) nic nie da smile.gif
wookieb
A to kurcze już nie pamiętam jak to było smile.gif To wtedy nie wystarczy samo usunięcie " albo zastąpienie go encja? Bo twoim zabezpieczeniem usuwasz możliwość podania niektórych prawidłowych linków (dlaczego usuwasz plus ?)
Spawnm
Hmm , pośpieszyłem się z tym '%20' i '+' , wydawało mi się że jak spacja to %20 lub + w adresie to i w html uzna te znaki .
bełdzio
o ile się nie mylę to niektóre przeglądarki też obsługują onclick=alert(1) tzn bez cudzysłowu, jeśli chodzi o doklejanie czegoś do url, to weź pod uwagę czy możesz wyświetlić treść usera w innym miejscu niż url + czy w serwisie nie masz jakiegoś skrytpu, którego zadaniem jest przekierowanie na inną stronę
Crozin
Cytat
Hey chcę dać userowi możliwość wstawiania linków przez bbcode na stronie www , i teraz pytanie
Po prostu sprawdź czy podany tekst ma format URLa (ewentualnie możne mu brakować protokołu, wtedy dodaj HTTP) + zamień na encje to co zamienione być powinno (&, ", ') w przypadku używania w dokumencie HTML.
Soulast
A jak najlepiej zapobiec zarejestrowanemu użytkownikowi na tworzenie kolejnych kont na stronie z innych ip oraz innych przeglądarek?
Pomyślałem o wrzuceniu usera IP do bazy lecz każdy wie że ono jest zmienne np u neostrady itd...

Czy zna ktoś może lepsze rozwiązanie?
kilas88
Cytat(Soulast @ 11.07.2010, 12:23:59 ) *
A jak najlepiej zapobiec zarejestrowanemu użytkownikowi na tworzenie kolejnych kont na stronie z innych ip oraz innych przeglądarek?
Pomyślałem o wrzuceniu usera IP do bazy lecz każdy wie że ono jest zmienne np u neostrady itd...

Czy zna ktoś może lepsze rozwiązanie?

Nie da się. Najlepiej zrobić 1 konto = 1 mail. Możesz także wbudować sto różnych zabezpieczeń, które oczywiście da się obejść smile.gif
bełdzio
mail też jest słabym pomysłem - jest pełno serwisów, które oferują tworzenie czasowych maili
H4eX
Można zrobić listę dozwolonych maili.
Soulast
No ale również to nie jest żaden problem poświęcić 5min aby stworzyć konto pocztowe np w wp.pl a nawet 10min na dwa takie konta itd.
A to wielka szkoda sprawdzanie nawet randomowego id poprzez cookies też można luźno ominąć poprzez wyczyszczenie ciasteczek:/

Pomyślałem również aby IP było sprawdzane jak i aktualizowane przy każdym logowaniu oraz wylogowaniu no i rejestracji.
Banalne rozwiązanie ale chyba lepszego nie znajdę a zawsze to jakiś tam sposób na chociaż drobne zabezpieczenie.

Chociaż sprawa się wymyka z pod kontroli jeśli to użytkownik znajduje się w sieci i pozostałe osoby w jego sieci już się nie zarejestrują z nowym kontem.
andycole
Soulast,

http://forum.php.pl/index.php?showtopic=141712&hl=

Zapraszam do mojego topicu, jest troche wiecej na temat 1uzytkownik - 1konto, ale niestety idealnego rozwiazania chyba nie ma :/
Spawnm
Hey,
mam pytanie jak najlepiej zabezpieczyć upload/server/download aby user mógł uploadować dowolne pliki nawet wirus.php , aby każdy mógł pobrać ale aby się nie mogły wykonać na servie ?
Crozin
Servie? A zresztą nieważne.

Normalnie, wrzucasz je na serwer, pozostawiasz jedynie prawa do odczytu/zapisu dla użytkownika serwera HTTP, dla całej reszty zabraniasz wszystkiego. Pliki PHP to zwykłe pliki tekstowe - więc nie da się ich wykonać.
bełdzio
Cytat(Spawnm @ 9.10.2010, 12:04:57 ) *
Hey,
mam pytanie jak najlepiej zabezpieczyć upload/server/download aby user mógł uploadować dowolne pliki nawet wirus.php , aby każdy mógł pobrać ale aby się nie mogły wykonać na servie ?

zerknij na http://www.beldzio.com/bezpieczny-upload-plikow
Spawnm
Bełdzio czytałem kiedyś, tylko zastanawiam się czy nadawanie losowych nazw + regułka dla folderu z plikami :
order deny,allow
deny from all
zapewnią mi w 100% bezpieczeństwo że ktoś czegoś nie wykona.
Bo sprawdzenia mime nie będzie, user będzie mógł wsadzić co mu się podoba.
andycole
Crozin dobrze pisze, zablokować wykonywanie plików.
bełdzio
Cytat(Spawnm @ 9.10.2010, 19:36:52 ) *
Bełdzio czytałem kiedyś, tylko zastanawiam się czy nadawanie losowych nazw + regułka dla folderu z plikami :
order deny,allow
deny from all
zapewnią mi w 100% bezpieczeństwo że ktoś czegoś nie wykona.
Bo sprawdzenia mime nie będzie, user będzie mógł wsadzić co mu się podoba.

jak zablokujesz dostęp do folderu to raczej średnio będzie z możliwością dostęu / wykonania pliku, który się w nim znajduje 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.