Autor | Zpráva | ||
---|---|---|---|
skrepyKOKO Profil |
#1 · Zasláno: 26. 9. 2011, 23:13:19
Ahoj,potřebuju pomoct...
mám problém s podmínkou <?php require_once "databaze.php"; $vysledek = mysql_query("SELECT jmeno,heslo FROM uzivatele"); while($zaznam=mysql_fetch_array($vysledek)){ if($_POST['heslo']==$zaznam['heslo']&&empty($_POST['heslo']){ if($_POST['jmeno']==$zaznam['jmeno']&&empty($_POST['jmeno']){ header('Location: obsah.php'); }else{ echo "<script>alert('Jméno je špatně zadáno');</script>"; } }else{ echo"<script>alert('Heslo je špatně zadáno');</script>"; } } $_SESSION[jmeno]=$_POST['jmeno']; $_SESSION[heslo]=$_POST['heslo']; ?> Co je na tom blbě? když vstoupím na stránku,tak všechno zmizí,prostě všechno je pryč... má to kontrolovat jestli je zadané heslo a jmeno správně.. když člověk příjde na tu stránku,tak by to nemělo nic psát,pokud zadá hodnoty,(jmeno,heslo) a bude špatně něco z toho,tak to napíše co je špatně... formulář s touhle kontrolou mám v jednom souboru.... jde o to,že pokud tam mám normální podmínku jen if($_POST['heslo']==$zaznam['heslo']){ if($_POST['jmeno']==$zaznam['jmeno']){ tak to jde,jenže když někdo vstoupí na tu stránku,tak to napíše že je špatné jméno,a přitom tam nic nezadal ještě... jinač value formuláře mám jmeno a heslo..takže isset je zbytečný,musí to být bych řekl empty.. |
||
joe Profil |
#2 · Zasláno: 26. 9. 2011, 23:22:30
skrepyKOKO:
„Co je na tom blbě?“ Už blbě na tom je ten dotaz do databáze, kterým vybíráš všechny uživatele. Zkus se zamyslet a udělat to lépe. |
||
Tori Profil |
#3 · Zasláno: 26. 9. 2011, 23:41:42
Ty podmínky jsou strašně divné: "Heslo je špatně zadáno" hlásí pouze v případě, že uživatel v databázi nemá vůbec uložené heslo a zároveň ho nezadal, jestli dobře vidím. To může někdy nastat?
Celé to hoďte do takové podmínky, aby se kontrola přihlášení prováděla skutečně jen v případě odeslání formuláře - např. if ($_POST) |
||
skrepyKOKO Profil |
#4 · Zasláno: 26. 9. 2011, 23:54:02
joe:
aha,mysql_fetch_array tam být nemusí?.. nebo pak už nevím kde je v tom načtení chyba.. Tori: já myslel že ta podmínka funguje takto.. že pokud se rovná heslo v databázi s _POST heslem,tak ho to pustí,stejně tak i s jmenem,ale asi jsem se spletl jak píšeš.. já mám ve formuláři onfocus a onblur,takže prázdný bych řekl že nebude nikdy... jinač,takže první podmínka bude if(_POST),a pak to ostatní jestli je heslo a jmeno správně? |
||
okolojdouci Profil * |
#5 · Zasláno: 26. 9. 2011, 23:58:57
skrepyKOKO:
„jinač,takže první podmínka bude if(_POST),a pak to ostatní jestli je heslo a jmeno správně?“ Ne. Chceš zjistit, jestli v tabulce uživatelů existuje řádek, ve kterém heslo = $_POST['heslo'] a zároveň jmeno = $_POST['jmeno']. Ověř existenci tohoto jednoho řádku, neprocházej všechny řádky. |
||
joe Profil |
#6 · Zasláno: 27. 9. 2011, 00:00:11
skrepyKOKO:
„že pokud se rovná heslo v databázi s _POST heslem“ Vyznač ve svém kódu tuto podmínku. Já ji v dotazu SELECT jmeno,heslo FROM uzivatele nikde nevidím. |
||
skrepyKOKO Profil |
#7 · Zasláno: 27. 9. 2011, 00:03:08
joe:
aha,že mě tam chybý WHERE pro jmeno? |
||
skrepyKOKO Profil |
#8 · Zasláno: 27. 9. 2011, 00:24:53
hm,tak ted mě to jde tak na 50%
nepřihlásí mě to když tam zadám špatně udaje,a když je zadám správně,tak mě to přihlásí,jenže když je zadám špatně,tak to nenapíše tu chybu o tom,že to napsal špatně..zde přihládám aktualní kod <?php require_once "databaze.php"; $vysledek = mysql_query("SELECT jmeno,heslo FROM uzivatele WHERE jmeno='{$_POST['jmeno']}'"); while($zaznam=mysql_fetch_array($vysledek)){ if($_POST){ if($_POST['jmeno']==$zaznam['jmeno']){ if($_POST['heslo']==$zaznam['heslo']){ header('Location: obsah.php'); }else{ echo "<script>alert('Heslo je špatně zadáno')</script>"; } }else{ echo"<script>alert('Jmeno je špatně zadáno')</script>"; } } } $_SESSION[jmeno]=$_POST['jmeno']; $_SESSION[heslo]=$_POST['heslo']; ?> |
||
Tori Profil |
#9 · Zasláno: 27. 9. 2011, 01:13:43
skrepyKOKO:
To if ($_POST) jsem myslela dát ještě před DB dotaz - odkud se má (na ř.4,21,22) číst $_POST['jmeno'], když pošlu prázdný formulář a budu mít zákeřně vypnutý JavaScript? Podmínka na ř.8 je zbytečná, totéž ověřujete už v dotazu, ve WHERE. Pokud uživatel toho jména neexistuje, mysql_fetch_* vrátí false a dovnitř cyklu se vůbec nedostanete -> místo cyklu dejte obyč. podmínku, jestli $zaznam není prázdný. Ad řádky 21+22 - neměly by být před řádkem 10? Takhle se provedou v případě špatného přihlášení. Mimo dotaz: neukládala bych hesla jako obyčejný text, ale hašovaná (např. funkcí sha1) - hodně lidí používá stejné heslo na x místech a když se vám někdo dostane do dat, tak má v ruce přístup k dalším účtům/e-mailům/... uživatelů. Subjektivně taky považuju za lepší nedávat přesné informace, jestli je špatné jméno nebo heslo, ale prostě jen že přihlášení selhalo a chybná příhlášení + důvody si třeba logujte. |
||
skrepyKOKO Profil |
#10 · Zasláno: 27. 9. 2011, 10:06:25
dobře..a ještě se chci zeptat,je lepší md5 nebo ten sha1?co je bezpečnější?
|
||
Tori Profil |
#11 · Zasláno: 27. 9. 2011, 10:31:01
Použila bych sha1.
Jinak koukněte třeba na článek Zabezpečení hesla z pohledu programátora. |
||
skrepyKOKO Profil |
#12 · Zasláno: 27. 9. 2011, 10:59:35
no,mám to tak,jak jste napsaly,jenže pořád mě to nechce hlásit chyby,když dá blbě heslo nebo jméno..nemůže to být formulářem?
i když..to bych řekl že je blbost <form method="POST" action=""> <label> <input name="jmeno" value="Jmeno" onfocus="if(this.value=='Jmeno')this.value=''" onblur="if(this.value=='')this.value='Jmeno'" type="text"> </label> <label> <input name="heslo" value="Heslo" onfocus="if(this.value=='Heslo')this.value=''" onblur="if(this.value=='')this.value='Heslo'" type="password"> </label> <label> <input type="submit" value="Přihlásit mě" style="background: url('images/signinbutton.png')100% no-repeat;background-position: center;border:0px;width:100px;height:27px;color:white;font-size:12px;"> </label> </form> |
||
skrepyKOKO Profil |
#13 · Zasláno: 27. 9. 2011, 14:19:43
Tak už vím proč
není to formulářem ale podmínkou, vlastně ta podmínka se ukáže,pokud je jmeno stejný jako v post, tudíž to mám špatně ty 2 podmínky..jak by to mělo vypadat? potřebuju to udělat takhle.. když někdo příjde na stránku,tak se mu žádná chyba neobjeví..to se udělá podmínkou if($_POST) když napíše špatně jmeno,nebo heslo,tak mu to napíše chybu... zkusil jsem to udělat znova,a takhle to momentálně vypadá <?php if($_POST){ require_once "databaze.php"; $vysledek = mysql_query("SELECT jmeno,heslo FROM uzivatele WHERE jmeno='{$_POST['jmeno']}'"); while($zaznam=mysql_fetch_array($vysledek)){ if($_POST['heslo']==$zaznam['heslo']) { $_SESSION[jmeno]=$_POST['jmeno']; $_SESSION[heslo]=$_POST['heslo']; header('Location: obsah.php'); }else{ echo "Jmeno nebo heslo je špatně zadané."; } } }else{echo "";} ?> |
||
okolojdouci Profil * |
#14 · Zasláno: 27. 9. 2011, 14:35:44
Použij
$vysledek = mysql_query("SELECT jmeno,heslo FROM uzivatele WHERE jmeno='".$_POST['jmeno']."' AND heslo='".$_POST['heslo']."' "); |
||
skrepyKOKO Profil |
#15 · Zasláno: 27. 9. 2011, 14:42:06
no,mě jde o to,že když napíšu jmeno nebo heslo špatně,tak to nenapíše tu hlášku
echo "Jmeno nebo heslo je špatně zadané."; ...pouze když napíšu správně jmeno tak se ta hláška objeví |
||
Tori Profil |
#16 · Zasláno: 27. 9. 2011, 14:46:44
skrepyKOKO:
> vlastně ta podmínka se ukáže,pokud je jmeno stejný jako v post, > tudíž to mám špatně ty 2 podmínky..jak by to mělo vypadat? viz #9 if (isset($_POST['jmeno'], $_POST['heslo'])) { require_once "databaze.php"; $jmeno = mysql_real_escape_string($_POST['jmeno']); $heslo = mysql_real_escape_string($_POST['heslo']); $vysledek = mysql_query("SELECT jmeno, heslo FROM uzivatele WHERE jmeno='$jmeno' AND heslo='$heslo'"); $zaznam = mysql_fetch_array($vysledek); if (!empty($zaznam)) { $_SESSION['jmeno']=$_POST['jmeno']; $_SESSION['heslo']=$_POST['heslo']; header('Location: obsah.php'); } else { echo "Jmeno nebo heslo je špatně zadané."; } } |
||
skrepyKOKO Profil |
#17 · Zasláno: 27. 9. 2011, 14:53:23
Tori:
jsi borec,díky moc |
||
okolojdouci Profil * |
#18 · Zasláno: 27. 9. 2011, 14:55:50
skrepyKOKO:
„jsi borec“ Omyl :) |
||
Časová prodleva: 14 let
|
0