Mechanizm sesji admin/user

2010-10-27 12:27:43 Post #1 user76

 
Z formularza dane wędrują do skryptu. Skrypt rozpoznaje, czy to user, czy admin.

Baza

1
2
3
4
5
6
7
8
CREATE TABLE `logowanie` (
  `id` int(11) NOT NULL auto_increment,
  `id_osoba` varchar(11) NOT NULL default '',
  `login` varchar(15) NOT NULL default '',
  `haslo` varchar(32) NOT NULL default '',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=16 ;


logowanie.php
1
2
3
4
5
6
7
8
9
10
<?php include ("baza/sesje_logowanie.php"); ?>  

    <form action="log_skrypt.php" method="post"> 
    <br /><br />Login:<br />
    <input name="Login" type="text"/> 
    <br /><br />Hasło:<br />
     <input name="Haslo" type="password" size="18" />
    <br /><br />
    <input type="submit" name="wyslij" value="Zaloguj" class="button" />


baza/sesje_logowanie.php
1
2
3
4
5
6
7
8
9
10
11
12
<?php
session_start
();
session_register("czy_zal");
session_register("id_zal");
if (
$_SESSION['czy_zal'] == AND $_SESSION['id_zal'] != 0) {       
header("Location: index_uzyt.php");

if (
$_SESSION['czy_zal'] == AND $_SESSION['id_zal'] == 'adm') {       
header("Location: index.php");
}
?>


log_skrypt.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
session_start
();                         // start sesji
session_register("czy_zal");             // rejestracja zmiennej globalnej
session_register("id_zal");              // rejestracja zmiennej globalnej

$haslo addslashes(trim(md5($_POST['Haslo'])));  // dane wysłane z md5($_POST) 
$login addslashes(trim($_POST['Login']));       // z md5($haslo) 
//pierwszy sposób autoryzacji administratora
$admin_login "administrator"// login admina
$admin_haslo "administrator";  // haslo admina
include ("baza/baza.php");  // wczytanie danych bazy mysql

if($login != $admin_login){     // jeśli niezgodne, czyli to user  
$zapytanie "SELECT logowanie.login, logowanie.haslo, logowanie.id_osoba FROM 
logowanie WHERE login='$login' "
;
$wynik mysql_query($zapytanie);
if(
mysql_num_rows($wynik) > 0) {
while(
$r mysql_fetch_array($wynik)) {  // porównanie
          
$haslo_baza $r['haslo']; // dane wysłane z md5($_POST) z md5($haslo) 
          
$login_baza $r['login'];
          
$osoba $r['id_osoba'];
          
$_SESSION['id_zal'] = $r['id_osoba']; // nadanie wartości zmiennej ses.
}}}
else{                          
// w przypadku powodzenia, czyli to admin
$zapytanie "SELECT administrator.login, administrator.haslo, administrator.id 
FROM administrator WHERE login='$admin_login' "
// 
$wynik mysql_query($zapytanie);
if(
mysql_num_rows($wynik) > 0) {
  while(
$r mysql_fetch_array($wynik)) {
          
$haslo_adm $r['haslo'];
          
$login_adm $r['login'];
          
$id_adm $r['id'];
          
$_SESSION['id_zal'] = "adm";
        }}}
        
// przekierowania
if ($login == $login_adm and $haslo == $haslo_adm){
$_SESSION['id_zal'] = 'adm'
$_SESSION['czy_zal'] = 1;
header("Location: index.php?czy_zal={$_SESSION['czy_zal']}&id_zal=
{$_SESSION['id_zal']}"
);
}
else{
if (
$login != $login_baza)
{
header("Location: komunikat3.php"); // login zły
}
else
{
if (
$haslo != $haslo_baza)
{
header("Location: komunikat4.php"); // hasło złe
}
else{  
$_SESSION['czy_zal'] = 1;
header("Location: index_uzyt.php?czy_zal={$_SESSION['czy_zal']}&id_zal=
{$_SESSION['id_zal']}&id={$osoba}"
);
}
}
}
?>


index.php
1
2
3
<?php include ("baza/sesja_admin.php"); ?> 
...


sesja_admin.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
session_start
();
session_register("czy_zal");
session_register("id_zal");

$id $_SESSION['id_zal']; 

if (
$_SESSION['czy_zal'] == and $_SESSION['id_zal'] != 'adm' ) {       
header("Location: index_uzyt.php?czy_zal={$_SESSION['czy_zal']}&id_zal={$_SESSION['id_zal']}&id={$_SESSION['id_zal']}"); 

if (
$_SESSION['czy_zal'] == and $_SESSION['id_zal'] == 0) {
header("Location: logowanie.php");
}
?>


index_uzyt.php
1
2
3
<?php include ("baza/sesja_uzyt.php"); ?> 
...


sesja_uzyt.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
session_start
();
session_register("czy_zal"); 
session_register("id_zal");
session_register("osoba");
$id $_SESSION['id_zal']; 
$id_osoba $_SESSION['id_zal']; 
$id_uzyt $_SESSION['id_zal']; 

if (
$_SESSION['czy_zal'] == and $_SESSION['id_zal'] == 'adm' ) {       
header("Location: index.php?czy_zal={$_SESSION['czy_zal']}&id_zal={$_SESSION['id_zal']}"); 

if (
$_SESSION['czy_zal'] == and $_SESSION['id_zal'] == 0) {
header("Location: logowanie.php");
}
?>

2010-10-27 12:34:22 Post #2 nospor

 
1) Czemu masz ID i ID_OSOBA? Czemu ID_OSOBA to varchar?

2) session_register() jest już przestarzałe i nie zaleca się jego używania

3) header("Location: komunikat3.php");
Robienie każdego oddzielnego komunikatu w oddzielnym skrypcie nie jest zbyt trafionym pomysłem.

2010-10-27 12:37:09 Post #3 user76

 
id_osoba używam tam, gdzie id powtarza się w GET.

2010-10-27 12:38:02 Post #4 nospor

 
Jak to "powtarza w get"? Co przez to rozumiesz?
Czemu jako ID_OSOBA nie może służyć po prostu ID?

2010-10-27 12:41:18 Post #5 user76

 
$id_osoba użyłem w sesji, aby napełnić ją id osoby. Ponieważ id zwykle przekazują w odnośniku przez GET, to zapasowa wersja z sesji.

Masz rację, to powtórzenie.

2010-10-27 13:28:49 Post #6 user76

 
dodam jeszcze niszczenie tej sesji

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
session_start
();
session_register("czy_zal");
session_register("id_zal"); 

if (
$_SESSION['czy_zal'] = 1) {
$_SESSION['czy_zal'] = 0;
$_SESSION['id_zal'] = 0

    
session_destroy();
header("Location: logowanie.php");
?>

2010-11-26 09:21:53 Post #7 user76

 
Mam nowe pytanie, chciałbym wykonać liczniki do newsów, artów. Pomyślałem, żeby zapisać w bazie id sesji składającej się z czasu w minutach od epoki unixowej i adresu ip. Przy okazji wykonam sesje w logowaniu sprawdzając czas i jeśli jest większy od godziny, to jakaś akcja itd. Ma to być do głosów, czytań. Czy jeśli tylko sprawdzę, czy wpis istnieje i przypiszę warunek if, to wystarczy? Czy wystarczy po następnym zalogowaniu nadpisywać rekord z tabeli powiązanej na sesje, która pamięta, czy gość głosował, oceniał, czytał?

2010-11-26 09:46:12 Post #8 nospor

 
Przecież id sesji zmienia się użytkownikowi. Nie zapisuj w bazie sesji a zapisuj IP z jakiego głosowano oraz ewentualnie czas jeśli czas ma dla Ciebie jakieś znaczenie. Potem jak ktoś będzie chciał zagłosować to będziesz sprawdzał czy z danego IP już głosowano i pozwolisz albo nie.

2010-12-24 16:11:17 Post #9 gość_Cypek

 
Witam, powiedzcie mi czy ten skrypt logowania jest w miarę dobry, bo spodobał mi się nawet, ale jestem jeszcze początkujący i nie wiem jak jest z nim od strony bezpieczeństwa. Jeżeli coś trzeba poprawić aby był dobry to też bardzo proszę żeby ktoś mi napisał co Z góry dzięki serdecznie.

2010-12-24 16:15:08 Post #10 Comandeer

 
W miarę dobry to on jest. Jak potrzebujesz na gwałt, to proszę bardzo - możesz se użyć. Tylko zamiast md5 do kodowania danych w bazie radzę użyć czegoś z rodziny SHA

Odpowiedz