ugrás a tartalomhoz

MySQL táblák értékének összehasonlítása

Szabó Gergő · 2007. Jún. 5. (K), 20.31
Sziasztok!

Nekem avval akadt problémám amikor nekikezdtem egy beléptető rendszer elkészítésének, hogy odáig rendben, hogy ellenőrzőm van-e adat,stb... de amikor arra kerülne sor, hogy azt ellenőrizze, hogy a beírt (mezőbe) és a db.-ben lévő adat egyezik-e, akkor mindig azt írja ki amit hibaüzenetnek kreáltatok vele -noha beírt felh.név/jelszó páros helyes is - ha valami baj van a lekérdezéssel

<?php
$felh_nev  = $_POST['fnev'];
$jelszo      = $_POST['jelszo'];
 /*SESSION elindítása*/
    session_save_path("sessions");
    session_start(); 
 /*--------------------------*/
 
if (empty($felh_nev) || empty($jelszo)) {
echo 'Hiba! Valamely mezo ures! Kerem lepjen vissza es toltse ki! Koszonom!';
} 
elseif((strlen($felh_nev)<2) || (strlen($jelszo )<2))
{
echo'Hiba! Valamely mezo erteke rovidebb mint 2 karakter! Kerem lepjen vissza es javitsa!';
}
else {
        //----------------------------------------------------------------
             include 'mysql/mysql_conn.php';
	     include 'mysql/mysql_select_db.php';
	     $result          = mysql_query("SELECT * FROM felhasznalok");
	     $tabla_hossz  = mysql_num_rows($result);     
	     $tabla            = mysql_query("Select * FROM felhasznalok WHERE fnev="$felh_nev." and jelszo=".$jelszo." ");
	 //---------------------------------------------------------------
	if($tabla_hossz<0)
	{
	echo'Hiba! Ures az adatbazis!';
	}
	elseif($tabla) {
	                          $row = mysql_fetch_array($result);
                                  $_SESSION['belepve']=$row['fnev']; /* Ez jelzi, hogy sikerült, és bárhol ki is irathatod */
                                  header("Location: index2.html"); /* Átirányít */
                                  exit; /* Biztossá teszi azt, hogy az következő kódrész nem fut le. */
	}
	else {
	echo 'Hiba! A felhasznalonev vagy a jelszo nem letezik!';
	}
	} 
?>
Ez volna a probléma
Működése:
1, megvizsgálja üres-e a mező. OK
2,Megvizsgálja, hogy nem-e rövidebb a jelszó/felh.név mint 2 karakter. OK
3,Megvizsgálja, hogy a táblában vannak-e sorok. OK
Pontosan amivel problémám lenne az ez a sor

$tabla = mysql_query("Select * FROM felhasznalok WHERE fnev="$felh_nev." and jelszo=".$jelszo." ");
Még ha azt is írom be felh.névnek/jelszónak ami az adatbázisban van akkor is, a hibaüzit írja ki!

Köszönöm előre is a segítségeteket!
Sziasztok!
 
1

elgépelés

erenon · 2007. Jún. 5. (K), 21.00
mert lemaradt egy pont a $felh_nev előtt.
ezenkívül nagyon megterhelő, hogy minden bejelentkezésnél lekéred az egész táblád, ezentúl felesleges a beírt adatokat azonosításnál ellenőrizni (hossz) hiszen azokat nem adhatta meg regisztrációkor (mert ott viszont ellenőrzöd) ha meg nem adhatta meg, akkor úgyse tud bejelentkezni.
+A jelszót ne valódi formájában, hanem valami hash értékben tárol biztonsági szempontból szvsz.
2

nem jó...

Szabó Gergő · 2007. Jún. 5. (K), 22.44
Szia!
Köszi a választ, csak az a baj, hogy kitettem oda a pontot, és még így sem jó...
UI.: Ezt a hash dolgot el tudnád nekem magyarázni miképp kell? Megköszönném!
Szia!
3

huhh

gonoszcsiga · 2007. Jún. 5. (K), 23.08
1. haszáld a var_dump fv-t. pl. az if($tabla_hossz<0) sor elé beírnám, hogy:
var_dump($tabla); ez kiírja a nyers változót, amit ha becopiznál, akkor tudnánk érdemben segíteni.
2. hibás ez a sor is:
$row = mysql_fetch_array($result);
a $result helyett $tabla kene
3. illik a stringeket egyes idézőjelbe írni:
$tabla = mysql_query("Select * FROM felhasznalok WHERE fnev='".$felh_nev."' and jelszo='".$jelszo."' ");
4. lehet, hogy a karakterkódolással is gond van
4

sql injection

gex · 2007. Jún. 6. (Sze), 10.19
a címben írt kifejezésre keress rá itt a fórumon, mert bár minden héten szóba kerül, mégsem látszik az eredménye sem a kérdéseken, sem a válaszokon.
5

hatékonyság, idézőjelek, escapelés

zila · 2007. Jún. 6. (Sze), 12.52
Hello!

1. Miért fontos tudatni a belépővel, hogy üres a tábla? De ha fontos, akkor miért nem egy select count(1) from tabla lekérdezéssel kérdezed le miért select *-gal? Az előbbi 1 db értéket ad vissza a tiéd meg mindent lekérdez, ez nagy tábla/nagy forgalom kombóban igencsak odaverhet az adatbáziskezelőnek....

2. Rossz a lekérdezésed (az sql injection az egy dolog... :) idézőjelek lemaradtak.
$tabla = mysql_query("Select * FROM felhasznalok WHERE fnev="$felh_nev." and jelszo=".$jelszo." ");
helyett

$query = sprintf("SELECT * FROM felhasznalok WHERE fnev ='%s' AND jelszo ='%s'",
            mysql_real_escape_string($felh_nev),
            mysql_real_escape_string($jelszo));
$result = mysql_query($query);
6

Rossz...

Szabó Gergő · 2007. Jún. 6. (Sze), 17.13
Sziasztok!
Köszi a sok választ, de ennek ellenére még mindig rossz, most a köv. probléma állt elő:
Bármit írok be a felh.név/jelszó mezőbe elfogadja és mindjárt oda ugrik ahová csak akkor kellene amikor a felh.név/jelszó páros egyezik!
Most így néz ki a kódom:

<?php
 /*SESSION elindítása*/
    session_save_path("sessions");
    session_start(); 
 /*--------------------------*/

$_felh_nev       = $_POST['fnev'];
$_jelszo           = $_POST['jelszo'];

            include 'mysql/mysql_conn.php';
	    include 'mysql/mysql_select_db.php';
$query = sprintf("SELECT * FROM felhasznalok WHERE fnev ='%s' AND jelszo ='%s'",mysql_real_escape_string($_felh_nev),mysql_real_escape_string($_jelszo));
            $result = mysql_query($query);     

if (empty($_felh_nev) || empty($_jelszo)) {
echo 'Hiba! Valamely mezo ures! Kerem lepjen vissza es toltse ki! Koszonom!';
} 
elseif($result) {
                                  $row = mysql_fetch_array($result);
                                  $_SESSION['belepve']=$row['fnev']; /* Ez jelzi, hogy sikerült, és bárhol ki is irathatod */
                                  header("Location: index2.html"); /* Átirányít */
                                  
	}
	else {
	echo 'Hiba! A felhasznalonev vagy a jelszo nem letezik!';
	}
	
Egy kicsit lecsupaszítottam most már csak megnézi, hogy üres-e a két mező, ha nem akkor - elvileg - azt vizsgálja, hogy egyezik e a felh.név/jelszó duó avval ami az adatbázis felhasznalok táblájában van.
De ehelyett - mint már fentebb is említettem - bármit is írok be, egyszerűen beléptet, mintha ez lenne a helyes felh.név/jelszó páros.
Nagyon köszönöm az eddigi sok segítséget!
Sziasztok!
7

vegyük sorba

gex · 2007. Jún. 6. (Sze), 18.05
csinálsz egy sql parancsot a $query változódba, ez eddig korrekt, szépen lemásoltad

futtatod ezt a parancsot, az eredményt (ami vagy erőforrás vagy hamis érték lesz) a $result változóba rakod
A SELECT utasításra alkalmazott mysql_query() függvény siker esetén egy erőforrással tér vissza, hiba esetén pedig FALSE-al.


ezek után 3 lehetőség van:
1.
ha üres a felhasználónév vagy a jelszó, kiírsz egy hibát
2.
ha mindkettőben van érték és a $result nem hamis (nem lesz az, mert egy erőforrás lesz benne, ha szintaktikailag helyes az sql parancs) akkor beléptél
(itt látszik, hogy a notice hibákat nem is figyeled, mert ha rossz adatokat adsz meg, a $row változónak nem is lesz fnev indexű eleme)
3.
ha mindkét változóban (felh_nev, jelszo) van érték és hamis van a $resultban (azaz helytelen az sql parancsod) akkor kiírod, hogy ilyen nincs.