[ Kerim O @ 16.11.2011. 17:05 ] @
Pozdrav. Uradio sam neki malo login sa nekim osnovnim funkcijama pomoću sesija..
Ono što bih želio je da neko od iskusnijih programera prokomentariše kod i ispravi ili eventualno sugeriše nešto što ne valja..Najveći problem mi je kod sesija tj ne znam da li sam ih ispravno postavio.

Code:
$host="localhost";
$username="root";
$password="";
$db="login";

mysql_connect($host,$username,$password) or die("Nemoze se spojiti");
mysql_select_db("$db") or die ("Nemoze se spojiti na bazu");
if(!isset($_POST['login']))
{

?>

<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>" >
Username:<input type="text" name="username" /></br>
Password:<input type="password" name="password" /></br>
<input type="submit" name="login" value="Login"/>
</form>
<a href="register.php">Register</a> 

<?php
}
else
{
 session_start();
 $username=$_POST['username'];
 $password=md5($_POST['password']);
 
 $clean_u=mysql_real_escape_string($username);
 $clean_p=mysql_real_escape_string($password);
 
if($username=="" || $password=="") {
    echo "Unesi sva polja";
}

$sql=mysql_query("SELECT * FROM login WHERE username='$username' AND password='$password'");
$query=mysql_num_rows($sql);

if($query!=0){
 $_SESSION['login']=$username;
    header('Location:members.php');
        
}
else
{
 echo "ne moze se logovati";
}
}


Evo i members stranice..

Code:

session_start();

if(isset($_SESSION['login'])){
echo "Specijalna stranica";
echo $_SESSION['login'];

}
else
{
    echo "Ne moze problem..";
}




Ono što me još interesuje je kako da uradim isti primjer sa kolačićima. Odnosno imam nekih ideja ali ne smijem da uradim jer nisam nikada prije koristio kolačiće pa me strah..Znači samo me interesuju kolaćiči i sesije u ovim primjerima odnosno kako da osiguram sigurnost navedenih. Nadam se da će još nekome koristiti.Hvala
[ Zlatni_bg @ 17.11.2011. 06:00 ] @
Nije mi jasno, zasto definises promenljive $clean_u i $clean_p kad ih ne koristis? Pretpostavljam da si njih zeleo da koristis u SQL query-ju, ali ih nisi iskoristio.

Sto se tice sesija, server-side su, pa i nije neki problem da radis ovako (samo promeni ove promenljive sto sam ti gore rekao, tj iskoristi ih). A sto se tice cookie-a, stvar je malo komplikovanija, i postoji dosta ideja kako to moze da se realizuje, zakljucavanje na odredjeni IP, neki skriveni stringovi itd...
[ Milos911 @ 17.11.2011. 08:04 ] @
Citat:
Zlatni_bg:A sto se tice cookie-a, stvar je malo komplikovanija, i postoji dosta ideja kako to moze da se realizuje, zakljucavanje na odredjeni IP, neki skriveni stringovi itd...
Skoro je bila diskusija ovde na forumu, ali bez ulazenja u detalje. Bilo bi dobro ako bi mogao da napises neke osnovne realizacije 'remember me' opcije uz pomoc kolacica(mislim da i postavljaca teme manje vise zanima teorija, u praksi se solidno snalazi), pa da vidimo sta ima najbolji odnos sigurnosti/lakoce implementacije.
Googlao sam dosta, ali izgleda da su najveci dometi 'advanced login php' i slicnih querija upotreba sesija i pamcenje mail-a i sifre u kolacicima.
[ Zlatni_bg @ 17.11.2011. 10:23 ] @
Pa sve zavisi od potrebe, i do kog nivoa sve treba da bude zasticeno. Ali evo, ono sto ja mislim da bi bilo najzasticenije je nesto ovako (verovatno je i preterano, ali ako cemo bas advanced...):

1. Korisnik se uloguje, generise se tajni string koji se upisuje u kolacic, kao i korisnikovo korisnicko ime
2. U tom trenutku se takodje u MySQL bazu upisuje rekord sa IP adresom sa koje se korisnik ulogovao, kao i taj tajni string, preko kog se vrsi provera (klijent daje tajni string iz kolacica, server poredi sa rekordom u bazi podataka)
3. Pre ucitavanja svake stranice, vrsiti proveru validnosti login-a, tako sto se vrsi MySQL SELECT tajnog stringa iz baze, na osnovu onog iz cookie-ja, onda se uzima IP iz baze podataka, i poredi se sa IP-jem koji je napravio zahtev za ucitavanjem stranice, ako nisu isti, prikazuje se greska

Na taj nacin cak iako vam neko "ukrade" cookie, nece moci mnogo da ucini sa njim, zbog razlicite IP adrese.

E sad, kako zastititi login formu? Pre svega, sve sifre koje se nalaze u bazi podataka cuvati kao md5 hash. Cak iako neko nekako dodje do hash-a, nek se igra sa bruteforce-om. Koristiti mysql_real_escape_string funkciju za svaku promenljivu koja se unosi od strane korisnika a koristi se u query-ju. Eventualno proveravanje referera za GET i POST zahteve, prihvatanje samo onih zahteva koji potiu sa vlastitog servera, i sa odredjene stranice. Takodje mozete ograniciti duzinu promenljivih za SQL sintaksu, gomila nekih stvari...

Elem, ovo sto sam ovde naveo je previse i sumnjam da iko koristi toliko zastite. Ono sto je najbolje je da iskoristite svoju mastu, ja sam vam samo dao neki primer kako bi sve to moglo da se odradi. Mnogo je bolje od cuvanja sifre u kolacicu, koja je zadnja stvar koju bih uradio. Ako cete nesto tako da radite, bar cuvajte neki modifikovani vid sifre, sa nekim dodatkom ili enkripcijom. A cak i da se odlucite za ovo sto sam opisao, nije potrebno vise od pola sata da se napravi.

Naravno, mozete kolacice povezati sa sesijom kada se verifikuje, kako bi sve to bolje i brze radilo, i cuvati samo osnovne podatke u sesiji.

Ulogujte se na neki popularniji sajt, pa pogledajte na sta lici cookie, mozda dobijete jos neku ideju :)


P.s. ako neko nadje neki propust u ovom gore sistemu slobodno nek prokomentarise :)


[Ovu poruku je menjao Zlatni_bg dana 17.11.2011. u 11:41 GMT+1]
[ Milos911 @ 17.11.2011. 11:06 ] @
Ne radi mi se bas svaki put query za proveru. A i pamcenje korisnika je otezano, jer ako sam dobro ukapirao (a jesam), cim mu se promeni ip, bice izlogovan. Za neke super ultra sigurne sisteme je verovatno ok, ali za everyday nije bas (kao sto si i sam rekao) :)

Evo o cemu ja razmisljam, ispravi me ako negde gresim: Prilikom logovanja ce se generisati tajni string, isto kao u tvom primeru. Prilikom sledeceg logovanja se radi provera da li se string podudara sa onim u bazi. Ako se podudara, nastavlja se autentifikacija preko sesije. Za dodatnu sigurnost moze da se doda jedan timestamp u cookie, koji ce recimo svaka 2 sata okidati generisanje novog tajnog stringa. Tako da ako neko ukrade cookie, mora da ga iskoristi sledeca dva sata.

Na drugoj strani, gde se menjaju korisnicki login podaci, staviti da ovaj sistem autentifikacije ne vazi. Korisnik ce morati da unese svoje login podatke pre menjanja istih. Tako cak i da neko dobije pristup korisnikovom nalogu putem kolacica, nece moci nista kriticno da uradi jer nece znati login podatke.

@Kerim O, sori za komentarisanje u tvojoj temi, ali mislim da tebe ovo isto zanima...
Inace, imam i ja jedan predlog:
Baci sve provere u jednu klasu, ili ako ne umes napisi bar funkcije. Mozes naprimer nesto ovako:
Code:

function login($username,$password){
if(validni podaci){
 $_SESSION['logged_in'] = 1;
 return true;
 }else{
 return false;
 }
}
function logged_in(){
 if($_SESSION['logged_in'] == 1){
   return true;
   }else{
   if(login($username, $password)){
     return true;
     }else{
     return false;
     }
}

Posle na strani gde hoces da radis autentifikaciju mozes da stavis samo:
Code:

if(logged_in()){
 echo 'logged_in';
 }else{
 echo 'not logged in';
 }

Ako hoces da zapamtis korisnika preko kolacica, ovo je jedno od elegantnijih resenja za koje ja znam.
[ Zlatni_bg @ 17.11.2011. 11:15 ] @
Pa pazi, ovo sto sam ja naveo je istina da radi do menjanja IP adrese, ali ovo tvoje radi 2 sata, pa nije bas bolje resenje :) A i poenta je da ne dodje do sledeceg logovanja kao sto si ti naveo, vec da je korisnik automatski ulogovan. Takodje, ako dodas taj timestamp u cookie, imace ga i onaj ukradeni, i taj timestamp nije cak tesko ni izmeniti. Jednostavno, nije pametno ostavljati toliko client-side podataka koji ce kontrolisati kako sistem radi. I ne znam kako si mislio da cookie vrsi okidanje?
[ Kerim O @ 17.11.2011. 12:26 ] @
Zlatni prvo bih ti se zahvalio,ovaj komentar mi je jako pomogao. Ono što ću pokušati je u dan dva napravim neki kod i da realizujem ovo što si mi ti rekao. Pa ako nekih bude grešaka,da ispravimo,sigurno da bi bila zanimljiva i polazna tačka mnogim početnicima..?

Zlatni,pošto vidim da imaš iskutva zanimalo bi me možda da li mi preporučuješ da koristim SHA1 hash funkciju? Malo sam švrljao po netu i mnogi preporučuju da se koristi umjesto md5..

Da,do mene je greška. Slučajno sam stavio one ne filtrirane varijable a imao sam namjeru staviti one filtrirane :)Hvala
[ Milos911 @ 17.11.2011. 13:03 ] @
Citat:
Zlatni_bg: Pa pazi, ovo sto sam ja naveo je istina da radi do menjanja IP adrese, ali ovo tvoje radi 2 sata, pa nije bas bolje resenje :) A i poenta je da ne dodje do sledeceg logovanja kao sto si ti naveo, vec da je korisnik automatski ulogovan. Takodje, ako dodas taj timestamp u cookie, imace ga i onaj ukradeni, i taj timestamp nije cak tesko ni izmeniti. Jednostavno, nije pametno ostavljati toliko client-side podataka koji ce kontrolisati kako sistem radi. I ne znam kako si mislio da cookie vrsi okidanje?
Posle dva sata se radi osvezavanje tajnog stringa, znaci korisnik samo dobija novi string u cookie. Znaci ostaje ulogovan. Ako mu neko ukrade cookie, i ne uradi nista u prvih 2 sata, moze slobodno da ga obrise jer kasnije nece vaziti. Ako se ipak uloguje odmah posle kradje, moci ce da cacka profil, ali nece moci da promeni login podatke.
Nisam mislio da cookie vrsi okidanje, naravno:). U php-u proverim odnos time() i $_COOKIE['last_updated'] i ako utvrdim da je proslo 2 sata dodeljujem novi string iliti sifru.
Ovako se dobija zastita na dve strane: ako dodje do kradje kukija (cookie-a, kolacica, jbg :) ) lopov mora da iskoristi iste u roku od 2 sata (realno manje), i cak i da to uradi ne moze da promeni prave login podatke bez da ih zna. Negativna strana, moze da radi sve ostalo. Pozitivna strana: korisnik moze da ostane ulogovan koliko hoce, teoretski na vise racunara (mada ce ga na jednom izlogovati kad se osvezi sifra na drugom).
Zakomplikovah malo, valjda si me razumeo? Lupam ili ima logike ovo sto pisem?
[ Zlatni_bg @ 17.11.2011. 22:10 ] @
Pa... ima logike manje vise i razumem te sta mislis. Ali korisnik nece moci na taj nacin da dobije drugi tajni string osim ako nije online u tom trenutku kad taj "timestamp" istekne. A opet ti kazem, ako ukrade cookie, dobice novi string i sa ukradenim cookie-jem i onda propade ceo koncept zastite. Previse podataka cuvas client-side. Cookie mozes da menjas kako god zelis, cisto da ti napomenem. Tako da se ne bih bas slozio da je najbolje resenje, iskreno.

Kerim, nema na cemu, ukoliko ti nesto zatreba, slobodno se javi :) Verujem da je ovo nesto sto zanima mnogo ljudi.

Evo samo jos da dodam, posto mi je stigla jedna privatna poruka vezana za ovaj sistem:

Obavezno napravite novu tabelu koju cete zvati "cookies", ili tako nesto, i tu cuvajte sve te stringove i IP-jeve, nikako nemojte da dodajete nove 2 kolone sa nazivima "ip" i "string" u onu tabelu gde imate user i password. Dakle, obavezno novu tabelu, i na taj nacin dobijate mogucnost pristupa sa vise IP adresa, jer cete moci imati neogranicen broj tih "konekcija".
[ Kerim O @ 19.11.2011. 13:51 ] @
Evo,kao što sam i obećao da ću postaviti kod kada završim. Prvo bih da zlatni i ostali prokomentarišu i posavjetuju ako bi šta trebao izmjeniti i ako ne radi uspješno...

Code:

include'funkcija.php';


mysql_connect($host,$username,$password) or die("Nemoze se spojiti");
mysql_select_db("$db") or die ("Nemoze se spojiti na bazu");
if(!isset($_POST['login']))
{

?>

<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>" >
Username:<input type="text" name="username" /></br>
Password:<input type="password" name="password" /></br>
Remember me<input type="checkbox" name="zapamti" value="da" /></br> 
<input type="submit" name="login" value="Login"/>
</form>
<a href="register.php">Register</a> </br>

<?php
}
else
{
 $username=$_POST['username'];
 $password=md5($_POST['password']);
 $remember=$_POST['zapamti'];
 
 $string=string(7);
 $string_k=md5($string);
 
 /*Dobio string i hashirao gao*/
 
 $ip=$_SERVER['REMOTE_ADDR'];
 
 
 
 $clean_u=mysql_real_escape_string($username);
 $clean_p=mysql_real_escape_string($password);
 
if($username=="" || $password=="") {
    echo "Unesi sva polja";
}

$sql=mysql_query("SELECT * FROM login WHERE username='$username' AND password='$password'");
$query=mysql_num_rows($sql);

if($query!=0){
 
 if($remember=="da"){
    setcookie("string",$string_k,time()+7200);
    }
else
{
setcookie("string",$string_k,time()+1000);    
}

$upit=mysql_query("INSERT INTO cookies (username,string,ip) VALUES('$username','$string_k','$ip')");


header("Location:members.php");
        
}
else
{
 echo "ne moze se logovati";
}
}


Stranice gdje se vrši provjera..

Code:
mysql_connect($host,$username,$password) or die("Nemoze se spojiti");
mysql_select_db("$db") or die ("Nemoze se spojiti na bazu");

$string=$_COOKIE['string'];
$ip=$_SERVER['REMOTE_ADDR'];

echo "</br>";




$upit=mysql_query("SELECT * FROM cookies WHERE string='$string'");
while($red=mysql_fetch_array($upit))
{
    $login_ip=$red['ip'];
    
    
}


if(isset($_COOKIE['string']) && $ip=$login_ip)           {
echo "Specijalna stranica";
echo $_COOKIE['string'];

?>
<a href="logout.php">Izloguj se</a>


<?php

}
else
{
    echo "Ne moze problem..";
}










?>


I gdje se vrši logout po preporuci zlatnog sam uradio ovo..

Code:
mysql_connect($host,$username,$password) or die("Nemoze se spojiti");
mysql_select_db("$db") or die ("Nemoze se spojiti na bazu");

$string=$_COOKIE['string'];



$upit=mysql_query("DELETE FROM cookies WHERE string='$string'");
setcookie("string",$string_k,time()-7200);
header("Location:login.php");


Eh sada me još zanima malo oko Remember me opcije i logouta. Pošto sam u login.php napravio da mi se prvo provjeri da li je štiklirana remember me opcija i setuje se cookie za više a ako nije onda se napravi dosta manji cookie i to radi.Medjutim malo mi je konfuzno oko logouta jer ne znam koju opciju da izeberem ne znam da li će mi se pravilno poništiti cookie.
Ono što mi je palo napamet da prilikom logina postavio i i novi Cookie u koji cu ubaciti npr "da"ako je štikliran ili ću ga ostaviti praznog ako nije. I onda u logout stranici samo napraviit uslov i provjeriti da li postoji cookie sa vrijednosti da,ako postoji onda ga brišem u vremenu za remember me a ako nema onda ga brišem kao normalno?

Hvala





[ Milos911 @ 19.11.2011. 14:21 ] @
Citat:
Kerim O:Eh sada me još zanima malo oko Remember me opcije i logouta. Pošto sam u login.php napravio da mi se prvo provjeri da li je štiklirana remember me opcija i setuje se cookie za više a ako nije onda se napravi dosta manji cookie i to radi.Medjutim malo mi je konfuzno oko logouta jer ne znam koju opciju da izeberem ne znam da li će mi se pravilno poništiti cookie.
Jednostavno nemoj da setujes vreme kad kuki istice ako korisnik nije stiklirao remember me. Onda ce se kuki sam obrisati kad korisnik ugasi browser.

Na strani gde se vrsi provera si zaboravio da uradis mysql_real_escape_string($_COOKIE['string']).

To je to, onako nabrzaka. Posle cu pogledati jos, ako neko ne odgovori pre toga.