» »

PHP login skript

PHP login skript

'FireSTORM' ::

Pozdravljeni.
Imam en rahel problemček in ga po svoji logiki ne znam rešit.
Skratka imam eno stran kjer se lahko spreminja baza podatkov le če se user prijavi, če se ne, pa lahko samo prebere podatke iz baze(MySQL).
Do sedaj imam tak, user pride na stran, vidi vse podatke(niso zaupni), ampak ker je user pooblaščen in mora nekaj podatkov spremeniti se prijavi.
if(isset($_REQUEST['login']))
  {
  $login = Trim(stripslashes($_POST['login']));
  include('/var/www/secret.php');

  $con = mysql_connect("localhost","admin",$pass_base);
  if (!$con)
    {
    die('Could not connect: ' . mysql_error());
    }

  mysql_select_db("baza", $con);

  $result = mysql_query("SELECT * FROM admin");
 
  while($row = mysql_fetch_array($result))
    {
      $ok = $row['password'];
    }

  mysql_close($con);

  if($ok != $login)
    {
      die('Incorect password!');
    }
  
// snip snip
  
  }
else
  {
  echo "<form method='post' action='admin.php'>
  Admin Password: <input name='login' type='password' /><br />
  <input type='submit' />
  </form>";
  }

Hkrati ko se prijavi, shranim v bazo(druga tabela) IP naslov prijavljenega tako da po prijavi več ne tečnari z geslom.
Zdaj pa problem, če se ročno ne odjavim, zaprem brskalnik in grem na pico, pivo, kajkoli pridem za 10ur nazaj, stran refresham in sem še vedno prijavljen.
In kaj bi rad? Da bi se po petih minutah neaktivnosti iz tega IPja, ta IP izbrisal iz te datoteke in bi se uporabnik iz tega IPja moral spet prijavit.
Ali obstaja kaka bolj elegantna rešitev tega?
Ne gre se za to kako je varno na tak način, ampak malo počasi se učim PHP bolj poglobljeno, tudi z bazami.
Those penguins.... They sure aint normal....

sverde21 ::

Čaki mal, a ti maš v tabeli admin samo eno vrstico :) Iz kode vsaj zgleda tako... ker v spremenljivko $ok nastaviš password iz zadnje vrstice v tabeli admin in potem izven zanke preverjaš če je tist pass OK. To mi nekako ni logično... po moji logiki bi, če že glih hočiš tako preverjat password moral tist if stavek, ki preverja, če je pass OK prestavit v while zanko noter.

Tule pri prijavi bi bilo pametno uporabit tudi seje, ki bi veretno rešile ta tvoj problem, saj seja ponavadi poteče v eni uri.

P.S.: nočm te silt, ampak probi si zdownloadat recimo phpBB forum pa malce poglej obliko kode, ker tile tvoji zamiki so precej manj berljivi, kot pa recimo tole:
if($pogoj)
{
    for($i = 0; $i < 10; $i++)
    {
        echo 'i = ' . $i . '<br>';
    }
}
<?php echo `w`; ?>

Zgodovina sprememb…

  • spremenil: sverde21 ()

'FireSTORM' ::

Ja, za enkrat je samo ena vrstica ker nimam več userjev zaenkrat.

Ja saj, ampak nimam pojma kako te seje naredit. :)
Those penguins.... They sure aint normal....

Pegaz ::

Enostavno, preberi nekaj o sessionih na manualu in vse ti bo jasno. Veliko lažje je delati z njimi, kot pa si delal zdaj.

sverde21 ::

Ja, za enkrat je samo ena vrstica ker nimam več userjev zaenkrat.

Ja se mi je zdel :) , probi vnest še kakiga userja... boš vidu da dela pass sam od zadnjega... zato moraš preverjanje dat v while zanko, ali pa filtrirat za SQL injectionom in preverit, če pass obstaja direktno v bazi, takle:
SELECT * FROM admin WHERE password = '$vpisan_pass'
in potem uporabiš funkcijo mysql_num_rows(), ki vrne podatek koliko vrstic je v rezultatu iz baze. Če ni nobene vrstice potem je password napačen, drugače je pravi.

Sicer pa priporočam, da narediš prijavo z uporabniškim imenom in geslom in ne samo z geslom...
<?php
$nick = mysql_real_escape_string($_POST['nick']);
$sql = "SELECT * FROM
    users
WHERE
    up='" . $nick . "'
LIMIT 1";

$result = mysql_query($sql);

$row = mysql_fetch_assoc($result);

if($row['pass'] == $_POST['pass']) {
    echo 'Uspesna prijava!';
} else {
    echo 'Neuspesna prijava!';
}
?>

Zgoraj imaš glavno logiko preverjanja gesla v bazi, ki jo jaz uporabljam (sicer v malce spremenjeni obliki), mogoče ti bo malce v pomoč :)
<?php echo `w`; ?>

t3hn0 ::

a nebi blo tko se mal hitrejs...

<?

if(isset($_POST['prijavi_se'])) {	//oziroma pac kokrkol preverjas ce je user submittal form
	
	$user = trim($_POST['user']);
	$pass = md5($_POST['pass']);
	
	mysql_query( "SELECT * FROM admin WHERE user = '$user' AND pass = '$pass' LIMIT 1" );
	
	if(mysql_affected_rows() == 1) {
		
		echo "Prijava uspela";
		$_SESSION['poljubna_vrednost'] = TRUE;
		
	} else {
		
		echo "Prijava ni uspela!";
		$_SESSION['poljubna_vrednost'] = FALSE;	// ali pa ne definiras tega...
		
		
	}
	
} else {
	
	// form za prijavo...
	
}

?>


mysql vrne vrednost affected rows 1 samo takrat ko sta user in ime prava.
^.^

sverde21 ::

@kenny666: mogoče bi že bilo hitrejš, ampak prvič ne prijavlaš se vsaki 2 minuti, drugič pa ta koda, ki si jo ti napisal je dovzetna za SQL injection napad. Probaj se zlogirat s temle uporabniškim imenom:
' OR '' = '' #
in katerim koli geslom. Men se zdi da nisi hotu sprogramirat zraven univerzalnega gesla ;)
<?php echo `w`; ?>

'FireSTORM' ::

sverde21 vem da bo potem samo zaden user se lahko prijavil in vem da moram dat vsaj neko zanko zraven, saj to mi je čist jasno.
Zanimivi primerki so se znašli, komaj čakam na jutri da bom mel malo časa to stestirat. :)
Those penguins.... They sure aint normal....

t3hn0 ::

no ja...sej bi lahko naredu eno funkcijo ki ti zamenja vse znake pri username kot so #, ", ',...
^.^

sverde21 ::

Nč ti je ni treba delat, taka funkcija že obstaja. mysql_real_escape_string() ;)
<?php echo `w`; ?>

Volk| ::

Hm...malo ze stara tema ampak se vedno uporabna.
Nekaj se ucim programirat v php in mysql.
Imam nekaj osnovnega ze naretega ampak danes ko sem dodal login mi zadeva vec ne pise podatkov v bazo.
zakaj? Ko v obrazcu "login" vneses up. ime in geslo, me sicer konekta na bazo in vrze na obrazec kjer lahko uporabnik vpise podatke, toda ko to poslje naprej se ne zapise več v bazo in javi napako napacne prijave. Ugotovil sem, da se seveda pri naslednji formi(ki je obrazec za vpis podatkov) "izgubi" up. ime in geslo. tudi preko includa ne gre(posebej imam fajl za username in password).
Verjetno to da se izgubi je ok, zaradi varnosti.
Malo sem guglal toda kaj sem nasel je veliko kompliciranja glede logina(mogoce se samo meni kot zacetniku to zdi).

je kaka enostavna varianta prenosa up. imena in gesla? Ali je potrebno obvezno naredis seje?

pomoc bo dobrodosla.
Hvala.
_______________________________________________________
Izobražen je tisti človek, ki ve, kje bo našel tisto, česar ne ve.

Atos ::

Itak da seje. Sej pa to sploh ni nikakršen bav bav. Login skripta ti mora narediti dve stvari! Prva je, da preveri podatkovno bazo, če obstaja uporabnik in če je geslo pravilno. Če je to res (if stavek) potem ustvari recimo dve _SESSION spremeljivki. Ena je recimo prikazno ime _SESSION['name'] druga pa id uporabnika (za kasnejše lažje preverjanje veljavnosti uporabnika) -> _SESSION['uid']. Preden lahko začneš delati z sejami pa moraš še inicializirati seje. To storiš z session_start(). In to je tudi cela umetnost. _SESSION spremenljivke za tem ohranjajo svoje vrednosti in tako lahko slediš uporabniku po strani brez komplikacij.

incognito ::

Še eno vprašanje glede session-ov, ki pa zadeva bolj varnostne vode. Prosim da me popravite, če bom napisal kakšno neumnost. Če prav vem se vsi podatki session-a, torej $_SESSION['uid'], $_SESSION['name'], ... hranijo na strežniku. Med uporabnikom in strežnikom se izmenjuje le session id (SID), s katerim strežnik lahko identificira sejo uporabnika.

Zanima me, ali je možno sejo hi-jackati (predvidevam da z brute-force-anjem SIDov) in kakšne ukrepe se lahko uporabi v preprečevanje tega. Kako se generira default PHP-jev SID? Uporabljate svoje funkcije za generiranje SIDa?

Morda še ideja, ki sem jo našel med komentarji na PHPjevi uradni strani, namreč da ob vsakem page load-u, regeneriramo uporabnikov SID, tj. da se vsak SID uporabi le 1x.

snow ::

S pomočjo sessiona spremljaš lahko tudi če se je uporabnikov ip in browser spremenil... če se je potem je verjetno hijack.
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

KoMar- ::

Bruteforcea se SIDov ne, se jih pa krade pri uporabnikih, saj so shranjeni v obliki piškotkov... jaz bi tudi na IP zaklenil, to je kar učinkovita zaščita.

Zgodovina sprememb…

  • spremenil: KoMar- ()

snow ::

Recimo:
//security.php
<?php
if(isset($_SESSION['user_id']))
{
	$fingerprint = sha1($_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR']);

	if (isset($_SESSION['fingerprint']))
	{
	    if ($_SESSION['fingerprint'] != $fingerprint)
	    {
	        session_unset();
	    }
	}
	else
	{
	    $_SESSION['fingerprint'] = $fingerprint;
	}
}
?>
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Volk| ::

Kaj mi lahko kdo pomaga s kako kodo in seveda komentarji glede teh login skript in seje.
Gledam namrec na guglu pa ne skapiram. ( KLIK )

ne bi rad samo kode prepisal s strani, razumel pa ne zakaj se gre.

Res bi bil hvalezen.

edit:
Nasel dobro razlago...KLIK
_______________________________________________________
Izobražen je tisti človek, ki ve, kje bo našel tisto, česar ne ve.

Zgodovina sprememb…

  • spremenil: Volk| ()

Volk| ::

<?php
$host="localhost"; // Host name
$username=""; // Mysql username
$password=""; // Mysql password
$db_name="test"; // Database name
$tbl_name="members"; // Table name

// Connect to server and select databse.
<strong>//če dobro razumem se tukaj prijavis v bazo...</strong>
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");

// username and password sent from form
<strong>//...in sele tukaj postas username </strong>
$myusername=$_POST['myusername'];
$mypassword=$_POST['mypassword']; 


v kodi mam odebeljene komentarje...lahko kdo pojasni?
Namrec, ne razumem kako deluje.
_______________________________________________________
Izobražen je tisti človek, ki ve, kje bo našel tisto, česar ne ve.

Volk| ::

Eh, kako tele sem.
Ze vem...jaooo...posipam se z pepelom...
_______________________________________________________
Izobražen je tisti človek, ki ve, kje bo našel tisto, česar ne ve.

Gost ::

?

t3hn0 ::

@Volk|

$host="localhost"; // Host name

$username=""; // Mysql username

$password=""; // Mysql password

$db_name="test"; // Database name

$tbl_name="members"; // Table name

v tem delu, si nastavis spremenljivke za povezavo z bazo

mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");

s prvim stavkom, se povezes na MySQL streznik s prej vpisanimi podatki, z drugim stavkom pa se povezes se na doloceno bazo

$myusername=$_POST['myusername'];
$mypassword=$_POST['mypassword'];

s tem si samo vnesel kar je bilo izpolnjeno v form obrazcu v spremenljivki...


sedaj bi mogu met neko bazo, v tej bazi pa eno tabelo, kjer so uporabniki. po tem (ko imas nekaj v tabeli), pa samo se preveris ce se username ujema s passwordom (to pa lahko mal visje vidis)
^.^

Volk| ::

Ne skapiram teh sej. :'(

$connect = mysql_connect("localhost", "$username", "$password")or die("cannot connect to database");

javi mi, da ta username se ne more povezat na bazo. Je pa res da imam bazo na "W" ne na "C" particiji. Ima to kake veze?
Ne vem zakaj se pol ne more prijavit v bazo. Baza je ok.
_______________________________________________________
Izobražen je tisti človek, ki ve, kje bo našel tisto, česar ne ve.

Zgodovina sprememb…

  • spremenil: Volk| ()

Gost ::

Najbolje bi bilo, če začneš na php.net.

Tale vrstica drugače ustvari povezavo na podatkovno bazo in nima veze s "temi sejami" :).

Loči med povezavo na podatkovno bazo (mysql username in mysql password) in navadnim loginom username in password. W in C in D so particije diska. Mysql povezava potrebuje host vrednost (localhost).

Volk| ::

Ja, saj vem, toda v sluzbi imam instaliran myphpadmin v truecrypt kontejner in tam delam privat zadeve in zaradi tega sem mislil, da me ne konekta na bazo, ker ni intaliran na C:. Očitno mi ne najde baze.
Doma mi namrec dela ta koda, v kontejnerju pa ne. Ostalo mi sicer vse dela, tako da ne vem zakaj mi ta povezava ne dela.

Vem, da ta vrstica nima veze z sejami. Toda ce mi to ne dela kako lahko pol testiram seje?!
Z sejami se se vedno ukvarjam in raziskujem.
Mater, saj ni tako tezko, le skapirat moram. Očitno imam tule bolj dolgo "lajtungo".
_______________________________________________________
Izobražen je tisti človek, ki ve, kje bo našel tisto, česar ne ve.

Atos ::

Ne skapiram teh sej. :'(

$connect = mysql_connect("localhost", "$username", "$password")or die("cannot connect to database");

javi mi, da ta username se ne more povezat na bazo. Je pa res da imam bazo na "W" ne na "C" particiji. Ima to kake veze?
Ne vem zakaj se pol ne more prijavit v bazo. Baza je ok.


Tukaj še nimaš nikakršnega opravka s sejami! Tukaj je problem povezave na bazo. Pri tem moraš paziti na več stvari. Prva je ta, da mysql strežnik sploh teče. Druga je ta, da vneseš pravilen naslov strežnika. Če mysql strežnik teče na enaki mašini kot web strežnik potem je "localhost" pravilno (kar imaš tudi ti napisano). Tretja stvar pa je kot je že Gost povedal, da verjetno ti posreduješ username in password za uporabnika, ki se želi prijaviti v stran, vendar moraš ti tukaj posredovati mysql uporabniško ime in geslo. (KAR NI ENAKO! - uporabnik bo imel username in geslo shranjeno v bazi, do katere ti dostopaš z username in geslom od mysql uporabnika). Če se ne motim bi moral vpisati geslo za root pri inštalaciji mysql -> v tem primeru lahko tudi uporabiš to dvoje (root, kot uporabniško ime, in geslo, ki si ga posredoval pri inštalaciji)

Volk| ::

Ja, valda, hvala, Atos
Doma sem pred casom instaliral MyPhpAdmin in takras sem nastavil username in geslo enako kot sem definiral v bazi.
V sluzbi pa tega nisem naredil zato se prijavljam b bazo kot root(kar sem pa cist pozabil, ker sem se ukvarjal z sejami).

Uf, kaka glupa napaka. Seveda zato se mi ne konekta na bazo ce je drugi username.

Se vprasanje glede seje:
imam index.php kjer se loginas. Nato ta login klice config.php, kjer se konektam na bazo. še v config.php ustvarim sejo kjer posredujem podatke za preverjanje up. imena in gesla.
Na nekaterih straneh sem videl, da nekateri uporabljajo 2 seji(eno za username, eno za password).
Vecinoma sem sicer videl da je to "spravljeno" vse v eni seji.
Pol(dokler seje ne unicim) lahko to sejo vedno uporabljam? Kaj ce je brez imena? Se lahko pol drugo zacnem? Streznik bo vedel kero sejo mislim?
nekaj sem gledal TUKAJ

Torej ta forum poteka isto? Prijava v bazo, preverjanje username, seja,....
_______________________________________________________
Izobražen je tisti človek, ki ve, kje bo našel tisto, česar ne ve.

diso32 ::

Pozdrav.
Soočam se z naslednjo težavo: ne morem enostavno primerjat besede iz mysql baze in vpisane besede:

<?php
include("connect.php");

mysql_select_db("my_db", $con);

$a= "'$_POST[firstname]'";
$d= "'$_POST[lastname]'";

$result = mysql_query("SELECT LastName FROM Persons WHERE FirstName='$a'");
echo "$result";
if ($result == $d)
echo "pravilno logiran";
else
echo "napaka";

mysql_close($con);

?>
-

Gost ::

diso32,

malo čuden način prijave. Si prepričan, da želiš izumljati toplo vodo?

Drugače ti v zgornjem mysql poizvedovanju manjka kar nekaj zadev:
- while ($row = mysql_fetch_assoc($result))
- preprečitev sql injection-a z uporabo mysql_real_escape_string
- kaj če boš imel dva Janeza Novaka?

Preberi vsaj navodila:
http://si.php.net/manual/en/function.my...

Lion29 ::

$a= "'$_POST[firstname]'";
$d= "'$_POST[lastname]'";


wtf?
pravilno:

$a= $_POST['firstname'];
$d= $_POST['lastname'];


sicer pa rabis se cel kup varnostnih prijemov!
Founder and CTO @ Article-Fatctory.ai


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

PHP - header : javi napako

Oddelek: Izdelava spletišč
61165 (1120) Camel
»

PHP povezava z Mysql

Oddelek: Izdelava spletišč
16842 (687) snooze77
»

[PHP]Zajem podatkov iz baze

Oddelek: Programiranje
353747 (3384) cobrica
»

[php, mysql] sortiranje izpisa iz baze

Oddelek: Izdelava spletišč
262556 (2075) Binji
»

Raziskava o ranljivosti spletnih strani z SQL bazami podatkov

Oddelek: Novice / Varnost
204750 (4086) sverde21

Več podobnih tem