[ _CaRtMan_ @ 24.01.2008. 14:47 ] @
Ovako:

Imam logiraj_me.php fajl i tu je samo forma i šalje na login.php . Provjerio sam, kada upišem u logiraj_me.php username i passwordu bude vamo u login.php uradio echo username i password u login.php .

login.php:


Code:
<?php
session_start();
include("config.php");

$username = addslashes($_POST["username"]);
$password = addslashes($_POST["password"]);

$a = mysql_query("SELECT * FROM korisnici") or die();
while($c=mysql_fetch_array($a)){

$id = $c["id"];
$user = $c["username"];
$pass = $c["password"];

}

if($username==$user AND $password==$pass){

        
        $session_id = session_id();
        $_SESSION["user_id"] = $id;
        setcookie("checksid",$session_id,time()+60*60*24*30);

        header("Location: index.php"); 
    
} else {
    
echo "nije";

}


?> 


Prije me je slalo na index.php , ali kako sam dodao još jednog usera neće..

I sad ja znam kako ću dobijati podatke o useru: SELECT * FROM korisnici WHERE id='$id', ali ne znam kako da dođem do $id , šta je pogrešno u ovom login.php

?
[ kazil @ 24.01.2008. 15:05 ] @
ne valja ti pristup. ovde:
while($c=mysql_fetch_array($a)){

$id = $c["id"];
$user = $c["username"];
$pass = $c["password"];

}
u $user i $pass ce ti upisivati samo poslednjeg korisnika iz tabele.

promeni upit:

SELECT * FROM korisnici WHERE username = '$username' AND password = '$password'

tako ces dobijati samo tog jednog korisnika koji je odredjen sa tim usernameom i tom sifrom.
[ _CaRtMan_ @ 24.01.2008. 15:11 ] @
Promijenio sam query. Sada me šalje na index stranicu. Kako ću sada na naslovnoj doći do usernamea tj do ID-a. Na početku sam stavio session_start(); ne kontam.. kako da dobijem id.. znam da cu otic WHERE id='$id' ali ne znam to '$id', stavio sam tamo $_SESSION["user_id"] = $id; ali kada upisem echo $id nista.. (kad upisem u index.php) a u logiraj.php se nalazi to $_SESSION... Hvala.
[ kazil @ 24.01.2008. 15:16 ] @
zju... morao sam dva puta da procitam...

oces na index.php da dobijes $id koji je upisan u SESSION? peace of cake:

na index.php prva linija:

session_start();

posle gde ti treba:

$user_id = $_SESSION['user_id'];

pod uslovom da si u login.php skriptu upisao u $_SESSION['user_id']

zop :)

dodatak: i meni je trebalo vremena da skontam kako rade sesije. dok ne skontas, zna biti zbunjujuce. uglavnom, ako na jednoj strani, prvoj, recimo login.php pokrenes sesiju sa session_start() pa posle, recimo redirekcijom odes na index.php, ako ponovo kazes session_start() ne pokrece novu sesiju, nego nastavlja onu sesiju koju si poceo na login.php. tako ono sto si upisao u login.php u $_SESSION ti je dostupno na index.php isto u $_SESSION. nastavljanje sesija sa session_start() (najcesce) vazi sve dok ne ugasis browser (ili sam u programu unistis sesiju).

dodatak dodatku: vidi ovde za vise o sesijama: http://www.php.net/manual/en/ref.session.php
[ _CaRtMan_ @ 24.01.2008. 15:21 ] @
E super! Buljim dva sata u kod, a ne mogu da skontam sta je greska, samo sad mi se javlja nesto sto se do sad nikad nije javilo:


Warning: Unknown: Your script possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively. in Unknown on line 0

Hvala ti puno..

Edit: Dva put imao $_SESSION u kodu.. riješeno
[ kazil @ 24.01.2008. 15:28 ] @
daj kazi sta je bilo tacno, jos nisam video takvo upozorenje :o cackam po localhostu, al nikako da dobijem takav vorning :)
[ _CaRtMan_ @ 24.01.2008. 16:07 ] @
Hehe, pa bilo ono $_SESSION dva puta u kodu, konkretno:

$user_id = $_SESSION['user_id'];

I dole negdje:

$_SESSION['user_id'] = $id;

[ jumper2high @ 26.01.2008. 08:43 ] @
Citat:

promeni upit:

SELECT * FROM korisnici WHERE username = '$username' AND password = '$password'

tako ces dobijati samo tog jednog korisnika koji je odredjen sa tim usernameom i tom sifrom.



Jedno pitanje, sto se tice ovog Query-ja ... da li je bolje raditi:

SELECT * FROM korisnici WHERE username = '$username'

pa onda proveravati uneti password sa onim koji si izvukao iz baze, ili:

SELECT * FROM korisnici WHERE username = '$username' AND password = '$password'

i onda samo proveriti da li je broj vracenih linija razlicit od nule?



[ kazil @ 26.01.2008. 09:04 ] @
SELECT * FROM korisnici WHERE username = '$username' AND password = '$password' je bolje. odma uzimas tacno taj red, nemas jos jednu proveru. i proveravas na jedan red, ne na vise od nule.
[ jumper2high @ 26.01.2008. 09:15 ] @
Istina da je to onda jedna provera manje, ali kako znati da li je korisnik uneo neispravan password ili nepostojeci username?
Odnosno kako informisati korisnika tacno zasto je login odbijen?
[ Jbyn4e @ 26.01.2008. 10:40 ] @
Ja ipak vise volim

SELECT password FROM korisnici WHERE username = '$username'

jer onda izvalcim tacno jedan podatak koji posle proverim. Zasto ljudi vole da izvuku sve (*) ako im nije neophodno, nije mi jasno, samo se puni memorija i opterecuje baza da vraca vise podataka.
Na ovaj nacin mozes i da mu kazes sta nije dobro (mada je iz sigurnosnih razloga bolje da mu kazes da ili jedno ili drugo nije dobro, jer moze na osnovu ispravnog username-a da pogadja password), tako sto ako nemas redova - onda nije dobar username, nema toga u bazi, a ako ima a ne slazu se passwordi- onda nije dobar password. Prosta logika.

[ jumper2high @ 26.01.2008. 11:05 ] @
Hvala na informacijama - kao sto sam i predpostavio, i jedan i drugi metod je zastupljen medju grupom :)
[ Tesla90 @ 02.02.2008. 21:18 ] @
Da ne bi zapocinjao novu temu,ja takodje imam jedan problem oko logina moja skripta glasi ovako:

<form action="login.php" method="post" name="frm">
<table cellspacing="4" cellpadding="4" style="border-bottom-width: thin; border-left-width: thin; border-right-width: thin; border-top-width: thin; border-style: dotted; border-color: red;">
<tr>
<td>username</td>
<td><input type="text" name="formlogin" class="cssborder"></td>
</tr>
<tr>
<td>password</td>
<td><input type="password" name="formpass" class="cssborder"></td>
</tr>
</table>
<br> <input type="submit" value="login" class="cssborder">
</form>

<?php
if ($formpass == $pass && $formlogin == $username) {
session_register("loggedin");
$loggedin = "1";
//javascript-a za redirect to admin page.
?>
<script language="javascript">

location.replace("admin");

</script>

<h4><a href='admin'>you are now logged in, continue to the admin section</a></h4>
<?php
}
?>

Meni je jako sumljiv ovaj deo
if ($formpass == $pass && $formlogin == $username)
{
session_register("loggedin");
$loggedin = "1";

Inace pravim sebi Content manager pa iz vise skripta pravim sebi najbolju...

Znali neko sta je problem?


[ holodoc1701 @ 02.02.2008. 22:20 ] @
Samo dve usputne napomene.

Kao prvo nadam se da je poznato da su direktni upiti tipa
Code:
SELECT password FROM korisnici WHERE username = '$username'

visoko podložni SQL injekciji i da je pre bilo kakvog izvršavanja dotičnog upita potrebno iskoristiti primera radi mysql_real_escape_string funkciju nad svim vrednostima koje dolaze direktno iz forme. Naravno pre toga je potrebno proveriti da li je uključen magic_quotes sistem i pre toga očistiti prosleđene vrednosti od escape-ovanih karaktera. Krajnji odbrambeni mehanizam je addslashes(). Sve navedeno otpada u slučaju korišćenja skladištenih procedura (stored procedures) koje mogu da se koriste u verziji 5 MySQL-a.

Druga stvar. Lično kod provere legitimnosti unetih podataka korisnika u login formi koristim metod
Code:
SELECT username FROM korisnici WHERE username = '$username' AND password='$password'

iz jednostavnog razloga što je iz sigurnosnih razloga preporučljivo u svim situacijama kada postoji više kriterijuma za ocenu ispravnosti nekog podatka iskoristiti što je moguće više dostupnih uslovljavanja. Primera radi u upitu
Code:
SELECT password FROM korisnici WHERE username = '$username'

potencijalnom napadaču je ostavljeno dosta mesta za manevrisanje jer upit bez ikakvih pitanja vraća lozinku za svako uspešno pogođeno korisničko ime.

Zaštita sa proverom korisničkog imena i lozinke je utoliko sigurnija ako se koriste skladištene procedure.

Usput... Nikada ne treba obelodanjivati korisniku šta tačno nije u redu kod podataka koji su korišćeni u login formi. U tim slučajevima treba biti maksimalno nekooperativan i obavestiti korisnika da je logovanje neuspešno ili zbog korisničkog imena i/ili zbog lozinke ili čak samo da je login neuspešan :)

@Tesla
U svom kodu imaš dosta konceptualnih grešaka.
Kao prvo ako si imao nameru da proveru ispravnosti podataka izvršiš u istom dokumentu gde ti se nalazi forma (stranica sa formom poziva samu sebe) onda si trebao redirekciju da izvršiš direktno iz PHP-a a ne putem Javascripta. To znači da bi nakon slanje forme odmah na početku fajla trebao da imaš deo koji proverava ispravnost forme i koji će putem funkcije header() da preusmeri tok izvršavanja na stranicu koja bi sadržala poruku o uspešnom logovanju. Ako bi kojim slučajem podaci bili neispravni onda bi taj deo sa redirekcijom jednostavno bio preskočen a ti bi mogao lepo u formi da naznačiš delove koji nisu ispravni.

Sledeća stavka je da se tvoj kod oslanja na činjenicu da je na serveru na kome se izvršava fajl register_globals uključen tj. da su dozvoljene globalne promenjljive. Šanse da je to slučaj sa nekim novijim serverom su otprilike ravne nuli :) Umesto globalnih promenjljivih treba da koristiš superpromenjljive $_POST, $_GET, $_SESSION, $_COOKIE... Razlog za ovo je potencijalni rizik po sigurnost aplikacije.

Usput... session_register() je zastarela funckija koja se više skoro i ne koristi. Umesto nje preporučuje se direktno deklarisanje promenjljive putem $_SESSION-a i inicijalizacija na neku početnu vrednost.

Generalna koncepcija tvog koda bi trebala da izgleda ovako:
Code:
<?php 
if(isset($_POST['formpass']) && isset($_POST['formlogin'])) 
     if(proveraKorisnika($_POST['formpass'], $_POST['formlogin'])){
          $_SESSION['logged_in'] = true;
          header("Location: fajl_sa_porukom_o_uspesnom_logovanju.php");
     } else
          $_SESSION['logged_in'] = false;
}
?>

<!-- Ovde ide forma ciji action atribut ukazuje na ovu stranicu (stranicu gde se nalazi forma) -->

Ovo je samo generalna koncepcija.

I za kraj... Izraz
Code:
if ($formpass == $pass && $formlogin == $username)

je ispravan jer operacija komparacije == ima prednost nad operacijom logičko ILI & ali je uvek dobra paksa delove odvajati dodatnim zagradama čak i kada to nije potrebno.
Evo primera radi jedne kompletne liste operatora koji se koriste u PHP-u sa njihovim prioritetom.
http://www.php.net/operators

[Ovu poruku je menjao holodoc1701 dana 02.02.2008. u 23:36 GMT+1]

[Ovu poruku je menjao holodoc1701 dana 02.02.2008. u 23:37 GMT+1]

[Ovu poruku je menjao holodoc1701 dana 02.02.2008. u 23:40 GMT+1]

[Ovu poruku je menjao holodoc1701 dana 02.02.2008. u 23:41 GMT+1]
[ Tesla90 @ 02.02.2008. 23:13 ] @
@holodoc1701 hvala

Neznam bas najbolje php,naucio sam pomocu primera("naucio")mysql znam odlicno ali mi php bas neide u glavu ono znam osnovno ali opet.usvakom slucaju hvala,skontacu nesto sta dalje da radim...