Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]przechwytywanie sesji - skrypt logowania
bialko0019
post
Post #1





Grupa: Zarejestrowani
Postów: 294
Pomógł: 4
Dołączył: 19.12.2008

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


Witam. Tworzę tak dla siebie, dla nauki mozna tak powiedzieć skrypt logowania.

No dobra, zrobiłem formularz. (oczywiscie juz tebala w sql zrobiona i zalozony uzytkownik);
  1. <form action="login.php" method="post">
  2. <br>
  3. <b>Login</b><br>
  4. <input type="text" name="login" style="border : 1px solid #499cf8;"><br>
  5. <b>Hasło</b><br>
  6. <input type="password" name="haslo" style="border : 1px solid #499cf8;">
  7. <br><input type="submit" value="Zaloguj" style="
  8. color : #35424d; font-family : verdana; font-size : 11px; border : 1px solid #e2e7eb;">
  9. </form>


i teraz przejdźmy do pliku login.php

  1. <?php
  2.  
  3. $login = $_POST['login'];
  4. $haslo = $_POST['haslo'];
  5. $haslo_md5 = md5($haslo);
  6.  
  7.  
  8. if(empty($login)){
  9. echo "<br>Wpisz login";
  10. }
  11. else {
  12.  
  13. if(empty($haslo_md5))
  14. {
  15. echo "<br>Wpisz hasło !";
  16. }
  17. else {
  18.  
  19. $config = "config.php";
  20. $otwieram = fopen($config, r);
  21. $czytaj = fread($otwieram, 900);
  22.  
  23. list($serwer, $uzytkownik, $haslo_baza, $baza_danych) = explode("|", $czytaj);
  24.  
  25. fclose($otwieram);
  26.  
  27. $polaczenie = mysql_connect($serwer, $uzytkownik, $haslo_baza) or die('Nie mogę się połączyć z serwerem. Sprawdź jeszcze raz poprawność pól <b>serwer baz danych, użytkownik oraz hasło do bazy</b>. Sprawdź czy nie masz włączonego Caps Locka.');
  28. $db = mysql_select_db($baza_danych) or die('Nie mogę się połączyć z podaną bazą. Sprawdź poprawność pola <b>baza danych</b>.');
  29.  
  30. $zapytanie = "SELECT * FROM `users` WHERE `login` LIKE '$login' AND `haslo` LIKE '$haslo_md5'";
  31. $query = mysql_query($zapytanie) or die('Zapytanie nie może dojść do skutku, bo : <b>' .mysql_error(). ' </b>');
  32.  
  33. $ile = mysql_num_rows($query);
  34.  
  35. if($ile > 0){
  36. echo "<br>Jesteś poprawnie zalogowany. <br><a href='admin.php'>Kliknij, aby przenieść się do Panelu.</a><br><br><i>Aby logowanie chodziło poprawnie, potrzebna jest obsługa COOKIE.";
  37. $session_id = session_id();
  38. $_SESSION['session_id'] = $session_id;
  39. $_SERVER['REMOTE_ADDR'] = $ip;
  40. $_SESSION['ip'] = $ip;
  41. $_SESSION['auth'] = 1;
  42. $_SESSION['login'] = $login;
  43.  
  44. }
  45. else {
  46. echo "<br>Spróbuj jeszcze raz.";
  47. }
  48.  
  49.  
  50. }
  51.  
  52. }
  53.  
  54.  
  55. ?>


Oczywiście config.php jest zabezpieczony przez htaccess ( cba i boo.pl mają ) przez deny from all.


1. Odbieramy z formularza dane.
2. Kodujemy hasło md5().
3. Łączymy się z bazą.
4. Sprawdzamy czy istnieje taki użytkownik i czy hasło jest poprawne.
a) Jeżeli tak, wyświetlamy komunikat.
cool.gif Jeżeli nie, wyświetlamy komunikat.

Jeżeli wszystko jest poprawnie, wyświetla się komunikat, by przejść na stronę admin.php .
No dobra jesteśmy. I tutaj zaczynają się schody, BO :

  1. <?php
  2.  
  3. $session_id_n = session_id();
  4. $host = $_SERVER['HTTP_HOST'];
  5. $session_id = $_SESSION['session_id'];
  6. $ip_n = $_SERVER['REMOTE_ADDR'];
  7. $czy = $_SESSION['auth'];
  8. $login = $_SESSION['login'];
  9.  
  10.  
  11. $katalog = dirname($_SERVER['PHP_SELF']);
  12. $heander = "http://$host$katalog/panel.php";
  13.  
  14.  
  15. if($session_id_n == $session_id){
  16. if($czy == 1){
  17. echo "<span class='zalogowany'><br>  Witaj <b>$login</b>, jesteś poprawnie zalogowany. Pamiętaj, by zawsze po skończeniu pracy się <b><a href='wyloguj.php'>wylogować</a></b> !</span>";
  18. }
  19. else  {
  20. header("location : $heander");
  21. }
  22. }
  23. else {
  24. header("location : $heander");
  25. }
  26.  
  27.  
  28.  
  29. ?>


1. zaczynamy sesję.
2. Robimy warunek, że gdy zmienna $czy = 1 to poprawna sesja, jeżeli nie przekierowywujemy location zeby sie zalogować.

Jednak jest tutaj problem, ponieważ na jednym serwerze gdy bez logowania przejdziemy do pliku admin.php to normalnie przekierowywuje jezeli sie nikt wczesniej nie zalogował jeżeli zalogował to normalnie plik sie wyświetla. A na drugim serwerze obojętnie czy się ktoś zlogował, czy nie i tak normalnie się wyświetla Panel użytkownika...

I moje pytania ;
1. Dlaczego na jednym serwerze działa ( działa na boo.pl, nie działa na cba.pl - na innych nie próbowałem ) ze przekierowywyuje nas zeby sie zalogować a na drugim nie ?
2. To jest pierwszy mój skrypt, więc jest pewnie baardzo dużo błędów, co w nim poprawić by był bezpieczniejszy ? Bo tak naprawdę tylko jest zakodowanie hasła jak przy rejestracji i nic więcej. i co jest jeszzcze w takim skrypcie nie zbędne ?

Liczę na jakieś wskazówki winksmiley.jpg

Pozdrawiam


--------------------
---
"kto pyta ten nie błądzi"...
Go to the top of the page
+Quote Post
sowiq
post
Post #2





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


Zobaczyłem początek listingu i dalej już nawet nie czytałem.

1. podatność na SqlInjection
  1. <?php
  2. $login = $_POST['login'];
  3. $haslo = $_POST['haslo'];
  4. ?>
Zainteresuj się mysql_real_escape_string" title="Zobacz w manualu PHP" target="_manual lub mysql_escape_string" title="Zobacz w manualu PHP" target="_manual oraz tematem o bezpieczeństwie

2.
  1. <?php
  2. if(empty($haslo_md5))
  3. ?>
Ten warunek nigdy nie będzie spełniony, bo md5 z pustego ciągu to d41d8cd98f00b204e9800998ecf8427e.
Sprawdź:
  1. <?php
  2. echo md5('');
  3. ?>


3. A to już zupełnie jakiś kosmos... Skoro wczytujesz plik PHP, to nie łatwiej zadeklarować w nim zmienne, a plik include" title="Zobacz w manualu PHP" target="_manual'ować / require" title="Zobacz w manualu PHP" target="_manual'ować?
  1. <?php
  2. $config = "config.php";
  3. $otwieram = fopen($config, r);
  4. $czytaj = fread($otwieram, 900);
  5. ?>


Ten post edytował sowiq 9.07.2009, 11:09:08
Go to the top of the page
+Quote Post
Darti
post
Post #3





Grupa: Zarejestrowani
Postów: 1 076
Pomógł: 62
Dołączył: 6.03.2005
Skąd: Wroc

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


pierwsze co znalazłem:

// jak wczesniej - md5() zawsze nie bedzie puste


  1. <?php
  2. $zapytanie = "SELECT * FROM `users` WHERE `login` LIKE '$login' AND `haslo` LIKE '$haslo_md5'";
  3. ?>
zmien na
  1. <?php
  2. $zapytanie = "SELECT * FROM `users` WHERE `login`='$login' AND `haslo` = '$haslo_md5'"; // będzie szybciej szukało i się nie pomyli dwóch użytkowników
  3. ?>


Ten post edytował Darti 9.07.2009, 13:14:53


--------------------
The answer is out there, Neo. It's looking for you. And it will find you, if you want it to.
SERVER_SOFTWARE : Apache/2.2.4 (Win32) PHP/5.2.1
MySQL Client API version : 5.0.27
Go to the top of the page
+Quote Post
matino
post
Post #4





Grupa: Zarejestrowani
Postów: 175
Pomógł: 30
Dołączył: 9.08.2007

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


Cytat(sowiq @ 9.07.2009, 12:08:34 ) *
Zobaczyłem początek listingu i dalej już nawet nie czytałem.

1. podatność na SqlInjection
  1. <?php
  2. $login = $_POST['login'];
  3. $haslo = $_POST['haslo'];
  4. ?>


Skoro hasło i tak jest później hashowane, to chyba nie trzeba używać mysql_real_escape_string?
Go to the top of the page
+Quote Post
Spawnm
post
Post #5





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




a $_POST['login']; też?

@Darti -> używaj bbcode smile.gif
Go to the top of the page
+Quote Post
bialko0019
post
Post #6





Grupa: Zarejestrowani
Postów: 294
Pomógł: 4
Dołączył: 19.12.2008

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


Cytat(matino @ 9.07.2009, 12:22:57 ) *
Skoro hasło i tak jest później hashowane, to chyba nie trzeba używać mysql_real_escape_string?



no właśnie ?

Jeżeli jest cały string hashowany, to każdy znak, nawet i ', który po konwersji ma wynik 024c94d6e03b6f67a86b952b914816c7 to po wpisaniu hasla np. ' -- wychodzi 53ee8202ef234d580fc1c60b89df175f ...

questionmark.gif


--------------------
---
"kto pyta ten nie błądzi"...
Go to the top of the page
+Quote Post
sowiq
post
Post #7





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


Hashowania loginu nie widzę... Zresztą ~Spawnm napisał o tym wyżej.
  1. WHERE `login` LIKE '$login'
Go to the top of the page
+Quote Post
bialko0019
post
Post #8





Grupa: Zarejestrowani
Postów: 294
Pomógł: 4
Dołączył: 19.12.2008

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


aa no rozumiem, to loginu też zrobię kodowanie.

Czyli jak jest również zakodowane hasło jak i login, to chyba używania funkcji mysq_ascape_string() nie ma sensu bo i tak każdy znak jaki zostanie wpisany zostanie zakodowany i będzie złe hasło lub login ?


--------------------
---
"kto pyta ten nie błądzi"...
Go to the top of the page
+Quote Post
Spawnm
post
Post #9





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




sensu to nie ma dawanie loginu w md5 tongue.gif
Go to the top of the page
+Quote Post
sowiq
post
Post #10





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


Cytat(bialko0019 @ 9.07.2009, 14:25:28 ) *
Czyli jak jest również zakodowane hasło jak i login, to chyba używania funkcji mysq_ascape_string() nie ma sensu
Sensu to nie ma kodowanie loginu.

Ale tak - masz rację. Nie musisz escape'ować czegoś, co później hash'ujesz.

[edit]
Spawnm o ułamki sekund szybszy biggrin.gif

Ten post edytował sowiq 9.07.2009, 13:28:36
Go to the top of the page
+Quote Post
bialko0019
post
Post #11





Grupa: Zarejestrowani
Postów: 294
Pomógł: 4
Dołączył: 19.12.2008

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


Cytat(sowiq @ 9.07.2009, 14:28:02 ) *
Sensu to nie ma kodowanie loginu.


dlaczego ? Przecież, każdy kto wpisuje login i haslo , do bazy jest zapisywany w postaci md5.
Poźniej przy logowaniu wpisuje normalny(nie zakodowany) login i haslo, skrypt koduje i sprawdza czy zakodowane stringi sa takie same ?


--------------------
---
"kto pyta ten nie błądzi"...
Go to the top of the page
+Quote Post
sowiq
post
Post #12





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


No tak. Ale logicznie pomyśl - jak będziesz np. wyświetlał adminowi listę userów? Jeśli będziesz miał chociażby forum, to zamiast dopisywać do każdego posta w bazie ID usera, będziesz musiał dopisywać również login. A jak ktoś będzie chciał z tego forum pozbierać sobie loginy to poklika trochę albo napisze jednego regex'a.

Masz jakieś argumenty czemu miałoby służyć hashowanie loginów?
Go to the top of the page
+Quote Post
bialko0019
post
Post #13





Grupa: Zarejestrowani
Postów: 294
Pomógł: 4
Dołączył: 19.12.2008

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


No tak, powiem szczerze że o tym nie pomyślałem, jednak tworząc ten skrypt myślałem tylko o jednym userze i tylko administrarze, gdzie jak raz jest dodany admin to już jest cały czas, tylko może zmiana hasła. ALE masz w zupełności rację, lepiej jednak wykonywać w mysql_escape_string() .

To już jeden problem rozwiązany - dziękuję, ale nadal nie widzę pomocy, dlaczego
Cytat
1. Dlaczego na jednym serwerze działa ( działa na boo.pl, nie działa na cba.pl - na innych nie próbowałem ) ze przekierowywyuje nas zeby sie zalogować a na drugim nie ?


--------------------
---
"kto pyta ten nie błądzi"...
Go to the top of the page
+Quote Post
sowiq
post
Post #14





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


Po pierwsze - error_reporting(E_ALL) na samym początku skryptu - Headers already sent...?.
Po drugie sprawdzałeś inne przeglądarki? Czasami przeglądarka może ze względów bezpieczeństwa olewać nagłówki z przekierowaniami.
Go to the top of the page
+Quote Post
bialko0019
post
Post #15





Grupa: Zarejestrowani
Postów: 294
Pomógł: 4
Dołączył: 19.12.2008

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


Wyświetla, że nie ma nic w zmiennych sesyjnych :
Notice: Undefined index: session_id in /var/www/virtual/katalomagic.l/admin/admin.php on line 8

Notice: Undefined index: auth in /var/www/virtual/katalomagic/admin/admin.php on line 10

Notice: Undefined index: login in /var/www/virtual/katalomagic/admin/admin.php on line 11

- to dobrze, nie ma nic, bo nie jest zalogowany...
ale dałem warunek, że jeżeli nikt nie jest zalogowany to powinno przekierować...

Pozatym przeglądarka nie blokuje, bo skrypt wstawiony na boo.pl śmiga, a na cba.pl serwerze nie.
Może coś serwer blokuje ?

EDIT
Utworzyłem zwykły plik php z samym przekierowaniem. Nic nie ma. Wstawiłem error reporting(e_all) i pokazała się fyfra : 4 questionmark.gif

Ten post edytował bialko0019 9.07.2009, 14:20:08


--------------------
---
"kto pyta ten nie błądzi"...
Go to the top of the page
+Quote Post
Fifi209
post
Post #16





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Może po prostu chodzi o różne konfiguracje serwerów? smile.gif Bardzo ciężko znaleźć dwa takie same.


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
bialko0019
post
Post #17





Grupa: Zarejestrowani
Postów: 294
Pomógł: 4
Dołączył: 19.12.2008

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


acha, no to na to wychodzi ze heander() nie jest aż tak kompatybilny. A w jaki inny sposób właśnie sprawdzać zalogowanie ? Bo w echo nie dam całej strony a include tym bardziej bo zainludowana strona przecież też musi być zabezpieczona... patrzę tutoriale skryptów logowania, żeby zobaczyć jak tam jest rozwiązane, ale wszędzie ten heander() no ;/


--------------------
---
"kto pyta ten nie błądzi"...
Go to the top of the page
+Quote Post

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 Aktualny czas: 19.08.2025 - 14:20