PHP Centeri avaleht Skriptikogu Küsimuste-vastuste leht Teadete vaatamine ja saatmine Foorum - koht küsimiseks Otsingumootor Siit saad infot meie kohta

Kasutajanimi:  
  Parool: 
  Registreeri!   Unustasid salasõna?

Foorumid Programmeerimine PHP & MySQL logimine MySQL-i, Sessioonide ja salakasutaja (Admin-iga)
Autor Abi Postitus Abi

koger


Postitusi: 229
Tase: 5
Olek: Offline

Hinnang: Administratiivhinnang: 5/10Administratiivhinnang: 5/10Administratiivhinnang: 5/10Administratiivhinnang: 5/10Administratiivhinnang: 5/10
logimine MySQL-i, Sessioonide ja salakasutaja (Admin-iga)

Tere,

kõiksugu logimis scripte on kõik kohad täis, küll aga ei leidnud ühtegi sellist, mis oleks ühteaegu sessioonidel põhinev, MySQL-i kasutav ning ka omaks admin kasutajat, mida ei võeta MySQL-ist.

Hetkel on mul selline kood, see on aga väga pikk ja teatavasti on kõik pikad koodid vigasemad, kui lühemad, nii et eks siingi ole oma vigu. Hetkel peaks aga kõik töötama ka nii nagu on.

Äkki keegi oskab soovitada, mis on üleliigne ja mis võiks olla teisiti, sest kindlasti saab ka lihtsamini aga ise ei mõtle välja... Oleks väga tänulik.

Lehe header:
PHP kood:


ini_set('session.auto_start','true'); // muudame php.ini failis sessioonid automaatselt käivituvaks
session_name('sid'); // - määrame sessiooni nime
session_set_cookie_params('3600''/'''''); // määrame sessiooni parameetrid
session_start(); // alustame sessiooniga
$sid session_id();

if (
$id=="login") { // sisse logimine
    
if ($name=="Sinu Kasutaja") { // kontroll, et nimi ei oleks sama, mis alguses etteantud
        
$login_viga='
                                                <font size="1">Viga!<br>Sisesta kasutaja.</font>'
;
    } elseif (
$password=="parool") { // kontroll, et parool ei oleks sama, mis alguses etteantud
        
$login_viga='
                                                <font size="1">Viga!<br>Sisesta parool.</font>'
;
    } elseif (!
$_POST['name']) { // kontroll, et oleks nimi olemas
        
$login_viga='
                                                <font size="1">Viga!<br>Sisesta kasutaja.</font>'
;
    } elseif (!
$_POST['password']) { // kontroll, et parool oleks olemas
        
$login_viga='
                                                <font size="1">Viga!<br>Sisesta parool.</font>'
;
    } else { 
// kui kõik korras, siis jätkame
        
if (md5($_POST['name'])=="c8c293446ac5670e3071654cb2dde8b7") {
            if (
md5($_POST['password'])=="57beab89f4c27f809d62ca6a5abc57ca") {
                
$_SESSION['kasutaja'] = "c8c293446ac5670e3071654cb2dde8b7";
                
$_SESSION['parool_md5'] = "57beab89f4c27f809d62ca6a5abc57ca";
                
$logged_in=1;
            }
        }
        if (
$logged_in==1) {
        } else {
            
$name2=$_POST['name']; // lihtsustame muutujat nimi
            
$result mysql_query('SELECT id,nimi,parool FROM '.$prefix.'_liikmed WHERE kasutaja="'.addslashes($name2).'" LIMIT 1'); // päring andmebaasist nimele
                
if (!$result) { // kui päring ei toiminud
                    
die('Invalid query: ' mysql_error()); // väljastame vea
                
} else { // kui kõik korras
                    
$mitu mysql_num_rows($result); // loendame päringule vastavusi
                        
if ($mitu=="0") { // kui saime 0 vastavust
                            
$login_viga='
                                                <font size="1">Viga!<br>Sellist kasutajat pole.</font>'
;
                        } else { 
// teisel juhul
                            
while ($r mysql_fetch_array($result)) 
                            {
                                
$parool $r["parool"]; // võtame andmebaasist kasutaja nimele vastava parooli
                                
$name_id $r["id"]; // samuti kasutaja id
                                
$eesnimi $r["nimi"]; // ja tema eesnime
                                    
if ($parool==$_POST['password']) { // kontroll, kas andmebaasi parool vastab postitatule
                                        
$password_md5 md5($_POST['password']); // krüptime parooli
                                        
$_SESSION['kasutaja'] = $name2// seame sessiooni kasutaja väärtuse
                                        
$_SESSION['parool_md5'] = $password_md5// seame sessiooni parooli
                                        // kasutaja on sisse logitud

                                        
$result2 mysql_query("INSERT INTO ".$prefix."_login VALUES ('NULL', '$name_id', '$ip', '$dns', '$agent', '$aeg')"); // lisame sisenemise ka kasutaja logimiste tabelisse
                                            
if (!$result2) { // kui ei funka
                                                
die('Invalid query: ' mysql_error()); // viga
                                            
}
                                    } else { 
// kui parool ei vastanud postitatule
                                        
$login_viga='
                                                <font size="1">Viga!<br>Vale parool.</font>'
;
                                    }
                            }
                        }
                }
        }
    }
} elseif (
$id=="logout") { // välja logimine
    
$kasutaja_ses $_SESSION['kasutaja'];
    
$parool_ses $_SESSION['parool_md5'];
    unset
$_SESSION['kasutaja'], $kasutaja_ses );
    unset
$_SESSION['parool_md5'], $parool_ses );
    
$_SESSION['parool_md5']="";
    
$_SESSION['kasutaja']="";
}



Lehe sisu, kus kuvatakse logimise kast või menüü:
PHP kood:


if (isset($_SESSION['kasutaja']) && isset($_SESSION['parool_md5'])) { // kui on olemas sessiooni väärtused kasutaja ja krüptitud parooliga
    
if ($_SESSION['kasutaja'] == "" && $_SESSION['parool_md5'] == "") {
        if (
$_GET['id']=="sisene") {
// kuvab sisselogimise vormi
        
}
    } else {
        
$f1 $_SESSION['kasutaja']; // määrame muutujaks kasutaja_cookie sessiooni kasutaja väärtuse
        
$e1 mysql_query("SELECT parool FROM ".$prefix."_liikmed WHERE kasutaja='".addslashes($f1)."' LIMIT 1"); // päring andmebaasist nimele
        
if (!$e1) { // kui päring ei toiminud
            
die('Invalid query: ' mysql_error()); // väljastame vea
        
} else { // kui kõik korras
            
while ($w1 mysql_fetch_array($e1)) 
            {
                
$d1 $w1["parool"]; // kasutaja parool andmebaasist
            
}
            
$d2 md5($d1); // krüptime parooli
            
$d3 $_SESSION['parool_md5']; // määrame muutujaks d4 sessiooni parool_md5 väärtuse
            
mysql_free_result($e1);
        }
    
        if (
$d2=="$d3") { // kui tabelist saadud parooli väärtus ühtib sessioonist saaduga
// oled sees, kuvab menüü
        
} elseif ($_SESSION['parool_md5']=="57beab89f4c27f809d62ca6a5abc57ca") { // kui md5-ga ülekäidud parool ühtib admini parooliga
            
if ($_SESSION['kasutaja']=="c8c293446ac5670e3071654cb2dde8b7") { // kui ühtib ka kasutaja
// oled sees admin kasutajaga, kuvab teise menüü
            
}
        } else { 
// kui ei ühti
            
mail($admin_mail'Possible breakin attempt #1'''.$aeg.' '.$ip.' '.$dns.' '.$agent.'');
            echo 
"Security violation #1, admin has been alerted.";
            exit;
        }
    }
} elseif (isset(
$_GET['kasutaja']) || isset($_POST['kasutaja'])) { // kui keegi püüab häkkida
    
mail($admin_mail'Possible breakin attempt #2'''.$aeg.' '.$ip.' '.$dns.' '.$agent.'');
    echo 
"Security violation #2, admin has been alerted.";
    exit;
} elseif (isset(
$_GET['parool']) || isset($_POST['parool'])) { // kui keegi püüab häkkida
    
mail($admin_mail'Possible breakin attempt #3'''.$aeg.' '.$ip.' '.$dns.' '.$agent.'');
    echo 
"Security violation #3, admin has been alerted.";
    exit;
} else { 
// kui puuduvad sessiooni väärtused kasutaja ja krüptitud parooliga
    
if ($_GET['id']=="sisene") {
// kuvab sisselogimise vormi
    
}
}

if (!
$login_viga) { // kui logimine õnnestus
} else { // vastasel juhul väljastame vea
       
echo $login_viga;
}



Edit: tegin paar parandust koodi

23.03.2005 01:53:18 Vajutades siia näed kasutaja koger profiili

eero


Postitusi: 890
Tase: 8
Olek: Offline

Hinnang: Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10
RE: logimine MySQL-i, Sessioonide ja salakasutaja (Admin-iga)

Enamik koodi tuleks maha lõigata.
PHP kood:

session_start();
define('ADMIN_ID'5); // vastava admini ID järgi saad igal lehel juba ise kontrollida, kas on vastavus
$errors array();
if (isset(
$_POST['submit_nupu_unikaalne_nimi'])) {
       
$res mysql_query('SELECT id FROM '.$prefix.'_liikmed WHERE kasutaja="'.addslashes($_POST['name']).'" AND parool="'.md5($_POST['password']).'"');
       if (empty(
$res)) $errors[] = 'Sisselogimine ebaõnnestus';
       
// siia võid veel veateateid lisada erinevate olukordade jaoks
       
if (empty($errors)) {
              
$row mysql_fetch_row($res);
              
$_SESSION['user_id'] = $row[0]; // kaasas kannad kasutaja MySQL-i ID-d, mitte mingeid paroole kaasas ei kanta
              
$res mysql_query('INSERT INTO '.$prefix.'_login VALUES (NULL, "'.$name_id.'", "'.$ip.'", "'.$dns.'", "'.$agent.'", "'.$aeg.'")');
              
header('Location: '.$_SERVER['REQUEST_URI']);
       }
}
echo 
implode('<br/>'$errors);
// siia ülejäänud sisselogimisvorm



___________________________________________________
This foreign policy stuff is a little frustrating! - George W. Bush

23.03.2005 10:23:34 Vajutades siia näed kasutaja eero profiili

koger


Postitusi: 229
Tase: 5
Olek: Offline

Hinnang: Administratiivhinnang: 5/10Administratiivhinnang: 5/10Administratiivhinnang: 5/10Administratiivhinnang: 5/10Administratiivhinnang: 5/10
RE: logimine MySQL-i, Sessioonide ja salakasutaja (Admin-iga)

Tänud!

Ma ei saanud veel aru sellest ADMIN_ID süsteemist? Mida sa mõtlesid selle all? Mul ei ole vaja mitut admin kasutajat, sest vastavate õigustega kasutajad on nagunii MySQL-ist võetavad, aga oleks vaja just ühte kasutajat, kelle kirjet ei oleks andmebaasis, kuid kes saaks siseneda siiski oma kasutajanime ja parooliga.

Seda suunamist (header-is asukoha määramine) ei sooviks ka, selle võtan siis lihtsalt maha, tahaks nii, et peale nime ja parooli saatmist serverile, logitaks kohe sisse scripti päises ja seejärel kuvataks lehe sisu sisseloginuna, mitte ei suunata edasi samale lehele sisseloginuna.

Nii, kui ma kannan nüüd kaasas kasutaja ID-d, siis peab olema lehe mingis osas script, mis vaatab kas see id on olemas ja kui on siis näitab, et oled sisseloginud ja kui ei ole, siis näitab vormi, kus saab sisse logida. Eksole?

Sessiooniga kasutaja ID kaasaskandmine on siiski turvaline, sest sessiooni väärtust ei saa muuta nii lihtsalt eks? Sellepärast igaksjuhuks ennem kandsingi kasutajat ja parooli, et kui ka keegi peaks kuidagi saama neid muuta, siis pole ta ikkagi sisse loginud. Register_globals peab siis kindlasti off olema ka vist.

Kuidas oleks väljalogimist kõige lihtsam teha? Kas määrata kasutaja ID väärtus sessioonis nulliks, või kuidagi teistmoodi?

23.03.2005 16:38:47 Vajutades siia näed kasutaja koger profiili

eero


Postitusi: 890
Tase: 8
Olek: Offline

Hinnang: Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10
RE: logimine MySQL-i, Sessioonide ja salakasutaja (Admin-iga)

Tsiteeritud tekst:
Ma ei saanud veel aru sellest ADMIN_ID süsteemist? Mida sa mõtlesid selle all?
Ise paneksin selle kohe kindlasti tabelisse, kas või mingisuguse eraldi märgistusega. Koodi sisse kirjutamine küll hea ei ole...
Tsiteeritud tekst:
Seda suunamist (header-is asukoha määramine) ei sooviks ka, selle võtan siis lihtsalt maha, tahaks nii, et peale nime ja parooli saatmist serverile, logitaks kohe sisse scripti päises ja seejärel kuvataks lehe sisu sisseloginuna, mitte ei suunata edasi samale lehele sisseloginuna.
Pigem kasutatakse header'itega suunamist selleks, et lehe uuendamisel ei korrataks sisselogimisprotsessi (header'idega suunamisel ei saa ka eelmisele lehele 'back'-nuppu vajutades tagasi minna)
Tsiteeritud tekst:
Nii, kui ma kannan nüüd kaasas kasutaja ID-d, siis peab olema lehe mingis osas script, mis vaatab kas see id on olemas ja kui on siis näitab, et oled sisseloginud ja kui ei ole, siis näitab vormi, kus saab sisse logida. Eksole?
Jah!
Tsiteeritud tekst:
Register_globals peab siis kindlasti off olema ka vist
Register_globals peab ALATI off olema. Vastasel juhul on see üks suuremaid turvariske (eriti, kui kood ei ole eriti oskuslikult kirjutatud)
Tsiteeritud tekst:
Kuidas oleks väljalogimist kõige lihtsam teha? Kas määrata kasutaja ID väärtus sessioonis nulliks, või kuidagi teistmoodi?
PHP kood:

unset($_SESSION['user_id']);
header('Location: index.php');



___________________________________________________
This foreign policy stuff is a little frustrating! - George W. Bush

23.03.2005 18:34:31 Vajutades siia näed kasutaja eero profiili

koger


Postitusi: 229
Tase: 5
Olek: Offline

Hinnang: Administratiivhinnang: 5/10Administratiivhinnang: 5/10Administratiivhinnang: 5/10Administratiivhinnang: 5/10Administratiivhinnang: 5/10
RE: logimine MySQL-i, Sessioonide ja salakasutaja (Admin-iga)

Tänud, selge...

23.03.2005 18:58:06 Vajutades siia näed kasutaja koger profiili
Kokku: 25950 registreerunud kasutajat, 9711 teemat, 54603 postitust.
Täna on neljapäev, 2. aprill 2020. Kell on 11:48.

    Vaata selle lehe printerisõbralikku versiooni

Avaleht   -    Skriptikogu   -    Teated   -    Foorum   -    Reklaam   -    Tagasiside   -    Kasutamise reeglid

© Copyright 2002-2020 PHP Center. Kõik õigused reserveeritud.