Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]MySQL]Skrypt logowania
Forum PHP.pl > Forum > Przedszkole
kamillo121
Witam , napisałem sobie skrypt logowania i nie wiem czemu ale wydaje mi się, że jest strasznie cienko zabezpieczony , tzn jest to mój drugi skrypt (po próbach ) i nie spodziewam się skryptu nie do obejścia ale takiego chociaż dość dobrego , możecie zerknąć na to i dać swoją opinie ? (tylko bądźcie wyrozumiali dla mnie, proszę smile.gif (wiem, że jest do tego dział ale ja bym w razie czego chciał jakąś pomoc co do tego skryptu, tzn jakieś inne sposoby czy coś ) )
  1.  
  2. <?php
  3. if(!isset($_REQUEST['action'])){
  4. header('Location: index.php?page=news');
  5. }else{
  6. switch($_REQUEST['action']){
  7. case 'Zaloguj':
  8. if(!isset($_POST['login']) OR !isset($_POST['haslo']) OR strlen($_POST['login'])<1 OR strlen($_POST['haslo'])<1){
  9. header('Location: index.php?page=news');
  10. }else{
  11. if(preg_match('/^[a-zA-Z0-9\_\-]{3,20}$/D', $_POST['login']) AND preg_match('/^[a-zA-Z0-9]{4,20}$/D', $_POST['haslo'])){
  12. include 'conn.php';
  13. $login=stripslashes($_POST['login']);
  14. $haslo=stripslashes($_POST['haslo']);
  15. /// Tutaj dodałem według wskazówek szanownych forumowiczów przepuszczanie przez sha1 hasła :)
  16. $sql="SELECT * FROM user WHERE login='".$login."' AND haslo='".$haslo."' LIMIT 1 ";
  17. $result=mysql_query($sql)
  18. unset($sql);
  19. if($row=mysql_fetch_array($result)){
  20. $_SESSION['login']=$row['login'];
  21. $_SESSION['lvl_acc']=$row['lvl_acc'];
  22. $sql="UPDATE user SET ostatnia_wiz='".date("Y-m-d H:i:s", time())."' " .
  23. "WHERE id=".$row['id']." ";
  24. echo '<div id="kom"><div id="tab">Komunikat</div>';
  25. echo 'zalogowano<br><br>';
  26. echo '<a href="index.php?page=news">Powrót na stronę głowną </a>';
  27. echo '</div>';
  28. }else{
  29. echo '<div id="kom"><div id="tab">Komunikat</div>';
  30. echo 'Złe hasło bądź login<br> ';
  31. echo '<a href="index.php?page=news">Powrót na stronę głowną </a>';
  32. echo '</div>';
  33. }
  34. }else{
  35. echo '<div id="kom"><div id="tab">Komunikat</div>';
  36. echo 'Złe dane<br> ';
  37. echo '<a href="index.php?page=news">Powrót na stronę głowną </a>';
  38. echo '</div>';
  39. }
  40. }
  41. break;
  42. case 'Wyloguj':
  43. echo '<div id="kom"><div id="tab">Komunikat</div>';
  44. echo 'Wylogowano<br>';
  45. echo '<a href="index.php?page=news">Powrót na stronę głowną </a>';
  46. echo '</div>';
  47. break;
  48. default:
  49. header('Location: index.php?page=news');
  50. break;
  51.  
  52. }
  53. //koniec switch'a
  54. }
  55. ?>


(To jest sam skrypt który otrzymuje dane z formularza, przetwarza i loguje )
sweter
Zabezpiecz hasło funkcją md5
kamillo121
A czytałem w innych tematach tutaj, że w nowych skryptach tego się już raczej nie stosuje , ktoś to tak napisał, (jak znajde to podam link)
Fifi209
Cytat(kamillo121 @ 24.08.2009, 14:52:05 ) *
A czytałem w innych tematach tutaj, że w nowych skryptach tego się już raczej nie stosuje , ktoś to tak napisał, (jak znajde to podam link)


Przecież tam mowa o braku filtracji loginu...

Co hasła bezpieczniejsze jest sha1
kamillo121
Fifi209 dzięki , a takie pytanko, jak zastosuję to przy haśle to czy będzie w miarę bezpieczny ? czy jeszcze gdzieś są "dziecinne luki" ? (tylko błagam, nie odsyłaj mnie do tematu w php o bezpieczeństwie bo go czytałem )
thek
Jeśli mowa o hasłach to niekoniecznie musi być sha-1. Może być md5... byle miało salt smile.gif Bez tego md5 mozna "wykoleić" używając "rainbow tables". Najbezpieczniej by było, gdybyś przy rejestracji do bazy wrzucił już zakodowane hasło i w sesji też je trzymał zakodowane. Porównać zawsze z bazą możesz wtedy i nie leci ono w postaci jawnej nigdzie. A sesje część danych przesyłają między stronami poprzez cookies. Jeśli znajdzie się tam też hasło w postaci jawnej to masz wtedy poważną lukę w bezpieczeństwie.
kamillo121
Czyli tak , narazie zmieniam przy rejestracji, że by wrzucało do bazy hasło przepuszczone przez sh1 , przy logowaniu zmieniam, żeby porównało hasło przepuszczone przez sh1 od formularza z tym z bazy , a teraz pytanie do ciasteczek ..... Na stronie nie potrzebny mi będzie dużo danych o użytkowniku które muszę często porównywać , jest to tylko login i lvl_acc , więc jest sens to pakować w ciasteczka ?
Quantum
Cytat
hasło i w sesji też je trzymał zakodowane


w jakim celu ma trzymać hasło w sesji ? smile.gif login w zupełności wystarczy.
kamillo121
No ja hasła, nigdzie nie potrzebuje , do indentyfikacji tylko potrzebuje loginu i lvl_acc , tylko ja jakoś nie chce się za bardzo w ciasteczka bawić ...
Myślę , że same sesje wystarczą nie ?
I powie ktoś wreście czy skrypt może być dość bezpieczny ? tylko teraz mam przepuszczane przez sha1 haslo jeszcze smile.gif
Odpowiedzcie proszę i daje Wam spokój haha.gif
Quantum
  1.  
  2. $hashPasswd = sha1($password.'tu wpisz co chcesz...');
  3.  


przy rejestracji i logowaniu, tak zwana "sól".
kamillo121
znaczy że przy haśle otrzymanym od użytkownika przy funkcji sha1 mam coś swojego jeszcze wpisać ?
A mógłbyś wytłumaczyć po co to ?
Quantum
a wiesz co to są "tęczowe tablice" ? smile.gif
kamillo121
NIe ale przewertowałem na szybcika google i coś w stylu do odgadywania haseł w md5, sha1 idt ?

Quantum
po dodaniu soli nic nie da skopiowanie hash'u z bazy i wklejenie go do wyszukiwarki winksmiley.jpg
kamillo121
a ta sol to może byc np :
$liczby = range(1,24);
$klucze = array_rand($liczby, 6);
I klucze wstawić za sól ?
Tylko że to w tablicy to potem tylko bym wstawił np klucze[1] za sól i tyle

Dzięki wszystkim , wiem, że pomoc udzielana mi to istna katorga ale kto pyta nie błądzi (to samo z używaniem google haha.gif) ..
Dzięki wielkei.. ( a jednak chyba nie może być losowa liczba bo wtedy nie porówna sad.gif )
Quantum
a jak później porównasz hash z logowania z hashem z bazy ? tongue.gif sól musi być stała..
kamillo121
No już teraz jak spróbowałem tego użyć to już wiem, że sie nie da haha.gif ...
Dzięki smile.gif
cros
Cytat(thek @ 24.08.2009, 16:12:20 ) *
... A sesje część danych przesyłają między stronami poprzez cookies...


Ciastka przechowuja tylko nazwe sesji, nic wiecej, ale i tak haslo powinno sie przesylac juz zakodowane...
Quantum
Cytat
haslo powinno sie przesylac juz zakodowane...


chcesz co przeładowanie sprawdzać w bazie czy wszystko się zgadza? biggrin.gif
thek
Sól, salt czy jakkolwiek to nazwać a o czym w poprzednim poście pisałem jest stałym dodatkiem do niejawnej wersji hasła czy co tam byś chciał kodować.
Są to ciągi znaków, które się dokleja do danej usera czy to na początek, koniec lub z obu stron i dopiero przeprowadza hashowanie. W ten sposób nawet słabe hasła można uczynić mocnymi. Sprawia to także, że znając czyjeś hasło i znając funkcje jakiej użyto nie wygenerujesz tego samego hasha. A znając hash i nawet gdybyś go rozgryzł do postaci jawnej, to nie wiesz która część w ciągu znaków jest prawidłowym hasłem usera. Tyle że sha-1, md5 i wiele innych jest algorytmami szyfrującymi jednostronnymi. A więc możesz zaszyfrować, ale nie ma funkcji deszyfrującej do nich. Ważne by sól była stała, bo inaczej hashe nie będą się zgadzały. Dlatego daje się do nich kombinacje liter małych i dużych, znaków by utrudnić "złamanie" hashy przez "tęczowe tabliczki"

Ze zmiennymi sesji... mae culpa... nie interesowałem się nigdy zbytnio czy są po stronie serwera czy klienta. I tak zazwyczaj mialem wszystkie krytyczne dane w hashach biggrin.gif

Co do sprawdzania to aż tak rygorystycznie nie trzeba, ale co jakiś czas można tongue.gif

Gdy zaś wspominałem o przechowywaniu w sesji loginu i hasła miałem na myśli sytuację, gdy akurat login nie musi być polem jednoznacznie identyfikującym. Tak naprawdę unikatowa jest kombinacja loginu i hasła i dopiero taki warunek trzeba sprawdzać pod kątem kolizyjności w bazie. Może być wielu userów o tym samym loginie ale różnych hasłach. Jedynie z wygody ustawia się na to pole wartość unique by sobie mniej roboty robić i nie wprowadzać zamieszania dla pozostałych użytkowników :] Czyli dla wygody nas, adminów, tak naprawdę, a nie dlatego, że tak musi być smile.gif Oszczędza nam to dodatkowego sprawdzenia hasła i tyle winksmiley.jpg Zmiana loginu, nawet na już istniejący, po założeniu konta w takim wypadku to pikuś i użytkownik sam to może zrobić, jedynie trzeba sprawdzać unikatowość kombinacji w formularzu zmiany loginu.
Shlizer
Login użytkownicy powinni mieć unikatowy nie ze względu na wygodę koderów, ale ze względów praktycznych - jakbyś miał kilku użytkowników o tym samym loginie na tym forum to jak myślisz, czy miłe byłoby sprawdzanie, który thek w którym temacie pisze? Chyba nie.. =p
Fifi209
Cytat(thek @ 24.08.2009, 16:31:24 ) *
W ten sposób nawet słabe hasła można uczynić mocnymi.

Nieprawda...
Jak z hasła:
god
Zrobisz mocne hasło doklejając sól? Przecież jak ktoś będzie jechał na brutal-force to w końcu trafi a weryfikacja przecież przebiega tak:

hasło + sól

gdzie hasło jest zmienną a sól stałą...
Cytat(thek @ 24.08.2009, 16:31:24 ) *
Tyle że sha-1, md5 i wiele innych jest algorytmami szyfrującymi jednostronnymi. A więc możesz zaszyfrować, ale nie ma funkcji deszyfrującej do nich.

Nie szyfrowanie a hashowanie, to jest różnica.
Cytat(thek @ 24.08.2009, 16:31:24 ) *
Ze zmiennymi sesji... mae culpa... nie interesowałem się nigdy zbytnio czy są po stronie serwera czy klienta. I tak zazwyczaj mialem wszystkie krytyczne dane w hashach biggrin.gif

Idealne rozwiązani... Dane krytyczne? (co to?) A np. dane osobowe? Wpiszesz komuś do bazy nazwisko jako hash?
kamillo121
Wiecie co ,nie żebym spamował czy coś ale z tego tematu dowiedziałem się więcej niż z tematu o bezpieczeństwie , oczywiście odnośnie tego zagadnienia smile.gif
Jeszcze raz wszystkim dziękuję , przemieniłem rejestracje logowanie i możliwość zmieny hasła ... Unikatowe mam login i email ... Znaczy login to tak tylko sprawdzaniem zapytaniem sql dzięki czemu nie będzie tych samych loginów ...(chyba haha.gif )
Jeszcze jak ktoś by mógł coś nakreślić co do sesji , tzn już pytałem o to kiedyś , wertowałem wertowałem i ? znalazłem kilka tematów , jak i artykułów w google lecz dalej nie wiem ....
Jak mam zabezpieczyć sesje , nie chce Was prosić o gotowe rozwiązanie bo wiem czym by się to skończyło tylko np .. O jakieś artykuły Waszym zdaniem dobre albo jakiś kursik .. Tylko , żeby było dość opisane a nie po jedno zdanie na każde zagadnienie ...
Bardzo bym Was prosił o to ...
Stronę, którą próbuję sklecić to nie ma być co prawda bunkier na notatki o tajnych misjach rządu Amerykańskiego ale jakieś lekkie zabezpieczenia się chyba przydają ...
Czytałem też coś , że jest dobrze napisać własną klasę do obsługi sesji , ale dla mnie to chyba za wysoka poprzeczka więc chciałbym tylko jakieś mniejsze zabezpieczenia sesji ..
Proszę was (srry, że się tak rozpisałem )
Fifi209
Napisać session handlera, masz nawet artykuł o tym na wortal.php.pl
kamillo121
Dzięki smile.gif
Już się wgłębiam ....
thek
Shlizer... o przypadku dla userów napisałem
Cytat
i nie wprowadzać zamieszania dla pozostałych użytkowników


Ataki brute-force przerywa się szybko i sam o tym zapewne wiesz. Blokada wykonywania po X nieprawidłowych próbach. W debianie masz po 3 błędnych logowaniach minimum 5 minut wyłączoną możliwość logowania na danego usera. To samo się w części portali stosuje. Po X próbach Y minut niemożliwości zalogowania. Może i się użytkownik wściekać, że nie może dostać do serwisu, ale skuteczność brute-force spada w sposób przeogromny.

Dane krytyczne to dla mnie dane od których zależy bezpieczeństwo użytkownika lub serwera. W tym portalu jest dla użytkownika nim tylko hasło, ale w serwisach z danymi osobowymi już poważnie bym zastanawiał się nad stosowaniem kryptografii. Oczywiście tylko w przypadku jeśli mają one nie być jawne, bo przecież na N-K danych osobowych multum, ale akurat ten serwis ma nieco inny profil działalności. Jednak w przypadku zastosowań biznesowych kryptografię bym próbował implementować.

Co do hasha i szyfru to zastosowałem skrót myślowy. Hash można bowiem uznać za szyfr, gdyż z ciągu znaków takiego samego otrzymujemy ten sam ciąg wynikowy. Dlatego napisałem, że jest to szyfr jednostronny. Nie ma bowiem algorytmu potrafiącego z hasha odtworzyć ciąg wejściowy. Zauważ jednak, że przechowuje on mimo wszystko informację o ciągu wejściowym, gdyż użycie tego samego algorytmu pozwala metodą porównywania uzyskać ostatecznie ciąg wejściowy. Jest to więc dla mnie szyfrowanie danych w pewnym stopniu. Inna sprawa, że ten sam hash teoretycznie może być efektem różnych danych wejściowych. Stąd nazwa "skrót" dla hash jest jest jak najbardziej adekwatna.
kamillo121
EEE, że znowu zmienię temat rozmowy ..
Przeczytałem ten artykuł tylko mam takie pytanie ..
Jak mam w tym miejscy wpisać dane dotyczące połączenia
  1.  
  2.  
  3. //kawałek kodu
  4. * Konstruktor
  5. * Ustalanie parametrów i przygotowywanie środowiska pod funkcjonowanie klasy
  6. * @param string $db_config Dane konfiguracyjne bazy
  7. * @param string $session_table Tabela z danymi sesyjnymi
  8. * @param string $session_lifetime Maksymalny czas istnienia nieaktywnej sesji @default 0
  9. * @return void
  10. * @access public
  11. */
  12. function session($db_config =" '', $session_table, $session_lifetime = 0)
  13. {
  14. if(!empty($db_config)){
  15. // Ustalanie danych konfiguracyjnych bazy
  16. $this->db_config['host'] = $db_config['host'];
  17. $this->db_config['user'] = $db_config['user'];
  18. $this->db_config['password'] = $db_config['password'];
  19. $this->db_config['datebase'] = $db_config['datebase'];
  20. $this->db_config['persistent'] = $db_config['persistent'];
  21. }
  22.  
  23.  
  24.  

Tam w db_config
Tam gdzie jest zmienna $session_table to mam dopisać żeby tak to wyglądało $session_table="nazwa_tabeli" ?>
I potem tak patrze, tam, niżej ktoś napisał, że autor powstawiał bugi , to prawda ?
Quantum
chyba tak:

  1.  
  2. $obiekt = new Sessions(array('host'=>'localhost'..etc), 'sessions'); //3 argument zbędny - domyślnie 0
  3.  
kamillo121
sad.gif Nie mam pojęcia jak to dostosować , mam nadzieje, że to ten kurs
http://wortal.php.pl/phppl/wortal/artykuly...i/implementacje

Zna może ktoś coś łatwiejszego , lub szerzej wytłumaczonego ?
Quantum
ale ta klasa jest pod php4, phpclasses.org , google, szukaj pod frazą = session handler php5 class smile.gif
kamillo121
No trudna, dzięki za pomoc ale nie umiem ... Za tępy na to jestem narazie smile.gif (pobrać pobrałem haha.gif)
Dzięki jeszcze raz 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.