Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

3 Stron V   1 2 3 >  
Reply to this topicStart new topic
> [PHP+PDO][MySQL]Pierwsza strona www., bezpieczeństwo stron itd.
ZaXaZ
post 19.04.2014, 12:23:59
Post #1





Grupa: Zarejestrowani
Postów: 285
Pomógł: 18
Dołączył: 30.01.2014
Skąd: <?=$_GET['city']?>

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


Pytanie nietypowe, nie chce koła chce dętkę.

Od paru dni myślę nad podniesieniem mojego poziomu php na wyższy, jako że nadal jestem początkującym chciałbym teraz zrobić system logowania i rejesracji jednak problemem jest dla mnie za mała wiedza o sesjach.
Nie znalazłem dostatecznych źródeł informacji na temat sesji (według mnie), a pytanie na którym się zatrzymuję;

Jak można przechowywać sesję przechodząc na inną stronę?

oraz tak jak pisałem na samej górze, nie chce dostać całego systemu logowania i rejestracji tylko sam szkielet jak to ma mniej więcej wyglądać (chodzi tylko o sesje) oraz ewentualne (miło by było) pokazanie np. "tu hashuj hasła", "tu sprawdź czy już istnieję", "Tu dane dla zalogowanego" itd. (Jako że jest to forum "Przedszkole" a ja będę to pisał pierwszy raz)

mam nadzieję że dobrze zadałem pytanie, jakby ktoś nie zrozumiał to proszę komentować.

edit:
ps. będę pisał to z pomocą PDO bo tylko tego się uczyłem więc prosiłbym nie zamykać tematu bo może będę miał pytania w przyszłości jakby coś nie wyszło.

edit 2 - Jeszcze jedno:
W bazie wystarczy `id`, `nick`, `haslo` czy jeszcze coś będzie mi potrzebne?

Ten post edytował nospor 23.04.2014, 09:51:44


--------------------
Go to the top of the page
+Quote Post
Turson
post 19.04.2014, 12:51:52
Post #2





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Co do samego skryptu logowania i rejestracji napisałem takowy kiedyś na swoim blogu.
#edit, w artykule napisałem co nieco o sesji smile.gif

Cytat
Jak można przechowywać sesję przechodząc na inną stronę?

W każdym pliku, w którym sesja ma być aktywna, trzeba dać na wstępie session_start(). Tym sposobem sesja sobie istnieje w tle przechodząc między stronami.

Cytat
W bazie wystarczy `id`, `nick`, `haslo` czy jeszcze coś będzie mi potrzebne?

Wystarczy, to absolutne minimum. W zależności od upodobań można dodać np. adres e-mail, datę rejestracji, typ konta (admin/użytkownik itd.), ostatnie logowanie etc.

Ten post edytował Turson 19.04.2014, 13:24:53
Go to the top of the page
+Quote Post
ZaXaZ
post 20.04.2014, 11:52:40
Post #3





Grupa: Zarejestrowani
Postów: 285
Pomógł: 18
Dołączył: 30.01.2014
Skąd: <?=$_GET['city']?>

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


Tak jak pisałem mogę mieć pytania i mam już pierwsze

--BEZPIECZEŃSTWO--
Czy: Jestem bezpieczny w tym fragmencie kodu?
  1. $gg = substr((int)$_POST['gg'],0,9);
  2. $nick = substr(preg_replace('/[^0-9A-Za-z]/', '', $_POST['nick']),0,32);
  3. $email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);

Jak zabezpieczyć hasło? addslashes może chyba być nieprawidłowe skoro chciałbym udostępnić wszystkie znaki możliwe


--------------------
Go to the top of the page
+Quote Post
Turson
post 20.04.2014, 11:59:10
Post #4





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Zależy co chcesz z tymi danymi zrobić.
Go to the top of the page
+Quote Post
ZaXaZ
post 20.04.2014, 12:01:36
Post #5





Grupa: Zarejestrowani
Postów: 285
Pomógł: 18
Dołączył: 30.01.2014
Skąd: <?=$_GET['city']?>

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


Cytat(Turson @ 20.04.2014, 12:59:10 ) *
Zależy co chcesz z tymi danymi zrobić.


* Przechowywać w bazie (przy rejestracjj), * Przy logowaniu sprawdzać poprawność danych (czy użytkownik istnieje itd.),
ps. email ucinany będzie po 350 znakach bo ponoć najdłuższy jaki był miał 345..,
oraz hasło przycinane po 50 znaku;

Ten post edytował ZaXaZ 20.04.2014, 12:08:02


--------------------
Go to the top of the page
+Quote Post
Turson
post 20.04.2014, 12:08:18
Post #6





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Jak już bindujesz dane w PDO to nie musisz się bawić w rzutowanie (jeżeli chodzi tu o zapytanie)

Ten post edytował Turson 20.04.2014, 12:15:45
Go to the top of the page
+Quote Post
Crozin
post 20.04.2014, 12:16:34
Post #7





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

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


1. Najpierw sprawdzaj poprawność przesłanych przez użytkownika danych, dopiero później baw się w ich filtrowanie. O co chodzi (na przykładzie numeru GG)? Powiedzmy, że podałem swój numer GG jako 123e567890 - jest on nieprawidłowy (zawiera znak "e" oraz jest za długi). W tej chwili Twój kod go przepuści, a w bazie danych zostaną zapisane głupoty, a konkretnie wartość "123". Tak więc najpierw powinieneś sprawdzić czy dane są prawidłowe, tj. w tym przypadku sprawdzić czy masz w zmiennej tekst, składający się z samych cyfr, gdzie sam tekst jest niedłuższy niż 9 znaków:
  1. if (!ctype_digit($gg) || strlen($gg) > 9) {
  2. // nieprawidłowy nr GG
  3. }
A dopiero później zrobić ewentualne rzutowanie na INT.
Analogicznie powinieneś postąpić przy nicku oraz emailu.
2. Akurat hasło spokojnie może mieć więcej niż 50 znaków.
Go to the top of the page
+Quote Post
ZaXaZ
post 20.04.2014, 12:16:52
Post #8





Grupa: Zarejestrowani
Postów: 285
Pomógł: 18
Dołączył: 30.01.2014
Skąd: <?=$_GET['city']?>

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


Cytat(Turson @ 20.04.2014, 13:08:18 ) *
Jak już bindujesz dane w PDO to nie musisz się bawić w rzutowanie


No fakt, zapomniałem o tym... chcialem samym query, zamiast np. prepare-execute lub tak jak pisales,
jednak jak zrobię bindParam(':nick', $nick); itd to jestem bezpieczny? (głównie chodzi mi o sql injection chyba że jeszcze coś tu jest)


--------------------
Go to the top of the page
+Quote Post
Crozin
post 20.04.2014, 12:18:10
Post #9





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

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


Tak, jeżeli używasz bindowania nie musisz już obawiać się SQLInjection (przynajmniej w zakresie danych przesłanych tymi parametrami).
Go to the top of the page
+Quote Post
Xart
post 20.04.2014, 13:03:34
Post #10





Grupa: Zarejestrowani
Postów: 267
Pomógł: 6
Dołączył: 8.04.2013

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


Cytat(ZaXaZ @ 20.04.2014, 12:52:40 ) *
Jak zabezpieczyć hasło? addslashes może chyba być nieprawidłowe skoro chciałbym udostępnić wszystkie znaki możliwe


Jakąś funkcją szyfrującą np:
$haslo = md5($haslo);
Go to the top of the page
+Quote Post
viking
post 20.04.2014, 13:09:17
Post #11





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


MD5 to nie funkcja szyfrująca.
http://docs.php.net/manual/en/ref.password.php
albo
http://docs.php.net/manual/en/function.crypt.php
albo
http://www.openwall.com/phpass/


--------------------
Go to the top of the page
+Quote Post
ZaXaZ
post 20.04.2014, 13:48:49
Post #12





Grupa: Zarejestrowani
Postów: 285
Pomógł: 18
Dołączył: 30.01.2014
Skąd: <?=$_GET['city']?>

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


Cytat(Xart @ 20.04.2014, 14:03:34 ) *
Jakąś funkcją szyfrującą np:
$haslo = md5($haslo);


być może źle pytanie zadałem ale odpowiedź już uzyskałem trochę wyżej nad tobą (co do bindowania - bo o to mi chodziło),
a hasła będę miał "przerabiane/hashowane" przez hash_hmac bo md5 już dawno złamane, czyt. rainbow tables.


--------------------
Go to the top of the page
+Quote Post
viking
post 20.04.2014, 14:10:49
Post #13





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


Zdajesz sobie sprawę że w przypadku hash_hmac gdy ktoś zdobędzie klucz to wszystkie twoje hasła są nic nie warte?


--------------------
Go to the top of the page
+Quote Post
ZaXaZ
post 20.04.2014, 14:16:28
Post #14





Grupa: Zarejestrowani
Postów: 285
Pomógł: 18
Dołączył: 30.01.2014
Skąd: <?=$_GET['city']?>

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


Cytat(viking @ 20.04.2014, 15:10:49 ) *
Zdajesz sobie sprawę że w przypadku hash_hmac gdy ktoś zdobędzie klucz to wszystkie twoje hasła są nic nie warte?


tzn.?, mógłbyś oświecić mnie? - bo nie wiem o co chodzi.

edit:
$pass = hash_hmac('sha512', $_POST['pass'], 'sól');
będzie mniej bezpiecznie niż
$pass = sha512($_POST['pass']);
questionmark.gif

edit2:
@down, w takim razie leci dla ciebie i dla viking "pomógł" za pomoc, thx.

Ten post edytował ZaXaZ 20.04.2014, 15:34:30


--------------------
Go to the top of the page
+Quote Post
Crozin
post 20.04.2014, 14:34:38
Post #15





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

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


Używanie algorytmów z rodziny SHA-1/-2 (np. SHA-512) już samo w sobie zbyt bezpieczne nie jest (zbyt szybko można je generować). Powinieneś skorzystać ze wspomnianego wcześniej crypt bądź password_hash i bezpiecznego algorytmu, np. Blowfish.
Go to the top of the page
+Quote Post
ZaqU
post 21.04.2014, 00:26:56
Post #16





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 21.01.2013

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


Czy używanie crypt / password_hash & Blowfish nie jest najzwyczajniej w świecie mówiąc przerostem formy nad treścią? Samo hashowanie haseł ma przecież na celu ich ochronę tylko w przypadku dostania się do bazy intruza (czy to poprzez SQL Injection, czy konwencjonalnie - przez wejście do PMA). Czy zatem nie prościej byłoby po prostu zapisywać w formie zahashowanej hasło i sól prywatną dla każdego użytkownika? Nawet po zdobyciu jakimś cudownym trafem kopii danych z bazy przez potencjalnego intruza, jak długo trwałoby znalezienie metodą brute force właściwego hasła dla jednego użytkownika? To w sumie 16^128 kombinacji, bardzo, bardzo dużo. I oczywiście łamanie hasła odbywa się nie dla wszystkich użytkowników z bazy, ale dla pojedynczego.

To teraz pytanie: czy nie wystarczy po prostu wrzucić zwykłe sprawdzanie czy w ciągu ostatnich 15 minut nastąpiło co najmniej 5 prób nieudanego logowania i jeżeli tak, to odmawiać kolejnych logowań? Sam kiedyś stworzyłem taki system i korzystam z niego do dziś, bo jest w miarę bezpieczny. Owszem, nie użyłbym go do zabezpieczenia strony jakiegoś banku, ale na potrzeby zwykłych serwisów czy portali sprawdza się znakomicie. Czy jest zatem sens bawienia się w tego typu rzeczy? Jeżeli istnieje jakiś sensowny argument, to proszę go przytoczyć - nie chce się kłócić, i z wielką chęcią zmieniłbym nawyki, jeżeli obecne okazałyby się mało bezpieczne, ale musi istnieć konkretna przyczyna, a nie że podnosimy i tak już wysoko zawieszoną poprzeczkę. smile.gif
Go to the top of the page
+Quote Post
Crozin
post 21.04.2014, 12:08:50
Post #17





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

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


@ZaqU: W kontekście bezpieczeństwa zawsze będę reprezentować wręcz paranoiczną postawę. wink.gif
1. password_hash z blowfishem wymaga takiej samej ilości pracy co sha512 z solą. W obu przypadkach... bardzo, bardzo mało. A w sumie powiedziałbym nawet, że jest to prostsze w obsłudze.
2. Co z tego, że jakiś hash daje 16^x kombinacji skoro i tak połowa użytkowników Twojego serwisu będzie miała hasła pokroju "qwerty", "internet123" czy "dupa.8"? Atakujący raczej na start rzuci jakiś atak słownikowy niż brute-force. I w przypadku takiego sha512 wygeneruje kilkaset czy kilka tysięcy kombinacji na sekundę, a przy blowfishu raczej kilka-kilkanaście.
3. Tutaj mówimy konkretnie o przypadku gdy intruz wpadł w posiadanie hasha naszego hasła, a nie o samym logowaniu, nie mniej jednak blokowanie możliwości zalogowania po x próbach jest słabym pomysłem - lepiej jest wymusisz jakąś CAPTCHA-e - sam niejednokrotnie zapominałem hasła do jakiś serwisów i potrzebowałem 10-20 prób na zalogowanie się. wink.gif
Go to the top of the page
+Quote Post
redeemer
post 21.04.2014, 12:35:13
Post #18





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


Cytat(Crozin @ 21.04.2014, 13:08:50 ) *
I w przypadku takiego sha512 wygeneruje kilkaset czy kilka tysięcy kombinacji na sekundę...

Dzisiaj z wykorzystaniem GPU to już nie tysiące, ale miliony.

Ten post edytował redeemer 21.04.2014, 12:35:37


--------------------
Go to the top of the page
+Quote Post
Crozin
post 21.04.2014, 13:50:40
Post #19





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

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


Cytat
Dzisiaj z wykorzystaniem GPU to już nie tysiące, ale miliony.
Aż sprawdziłem kilkuletni, podrzędnej klasy laptop z którego właśnie piszę... 150 milionów MD5 na sekundę - SHA512 pewnie byłoby w okolicach 100M.

Ten post edytował Crozin 21.04.2014, 13:53:30
Go to the top of the page
+Quote Post
redeemer
post 21.04.2014, 16:21:26
Post #20





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


Cytat(Crozin @ 21.04.2014, 14:50:40 ) *
Aż sprawdziłem kilkuletni, podrzędnej klasy laptop z którego właśnie piszę... 150 milionów MD5 na sekundę - SHA512 pewnie byłoby w okolicach 100M.

Z tymi 100M przy SHA512 to nie byłbym taki optymistyczny wink.gif Wszystko oczywiście zależy od karty, ale nawet GTX580 (NVIDIA) ma w przypadku SHA512 ~114M/s (MD5 ~2414M/s). Dla porównania HD6990 (AMD) ma dla SHA512 ~217M/s (MD5 ~10742M/s)

Dane z http://hashcat.net/oclhashcat/


--------------------
Go to the top of the page
+Quote Post

3 Stron V   1 2 3 >
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: 15.08.2025 - 03:40