Autor | Zpráva | ||
---|---|---|---|
ego Profil * |
#1 · Zasláno: 24. 6. 2012, 11:42:04
ahojte,
pokusil jsem se najít někde skript na změnu hesla a povedlo se, jenomže nastal problém ... já mám hashovanou databazi a ten skript je nehashovany (teda spíš hesla z něj), tím pádem mi to píše že se hesla neshodují ... jak zasadit hash (md5) do toho skriptu ? :)) formulář: <?php $Login = $_POST['Login']; $Heslo = $_POST['Heslo']; echo "<form action=\"zmenheslo.php\" method=\"POST\"> <input type=\"hidden\" name=\"StareHesloP\" value=\"$Heslo\"> <input type=\"hidden\" name=\"Login\" value=\"$Login\"> Zadaj Staré heslo: <br> <input type=\"password\" name=\"StareHeslo\"> <br> Zadaj Nové Heslo: <br> <input type=\"password\" name=\"NoveHeslo\"><br> Znova Zadaj Nové heslo: <br> <input type=\"password\" name=\"NoveHeslo.\"><br> <input type=\"submit\" value=\"Zmeň Heslo\">"; ?> zde skript: <?php $Login = $_POST['Login']; $NoveHeslo = $_POST['NoveHeslo']; $StareHeslo = $_POST['StareHesloP']; $StareHesloN = $_POST['StareHeslo']; $NoveHeslo2 = $_POST['NoveHeslo.']; if($StareHeslo == $StareHesloN) { if($NoveHeslo == $NoveHeslo2) { $con = mysql_connect("...","...","..."); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("...", $con); mysql_query("SET NAMES cp1250"); mysql_query("UPDATE Uzivatelia SET Heslo = '$NoveHeslo' WHERE Login = '$Login'"); } else { echo "Nové Hesla sa nezhodujú!"; } } else { echo "Straré heslá sa nezhodujú!"; } ?> |
||
mimochodec_ Profil * |
#2 · Zasláno: 24. 6. 2012, 11:45:43 · Upravil/a: mimochodec_
$StareHeslo a $StareHesloN berou hodnotu z POST a porovnáváš je mezi sebou, nikoliv s původním heslem. Proč? A proč vůbec má návštěvník vypisovat původní heslo dvakrát?
Původní heslo nech člověka napsat jen jednou a jeho hash porovnej dotazem s hashem uloženým v databázi. |
||
ego Profil * |
#3 · Zasláno: 24. 6. 2012, 11:49:43
ten skript není můj a měl by fungovat ... spíš mi jde o ten hash, ale jestli ani ta funkčnost není v pořádku tak to musíme napravit ... takže mám StareHesloN změnit na StareHesloP ?
|
||
Medvídek Profil |
#4 · Zasláno: 24. 6. 2012, 11:49:50
ego:
Toto mi nepřijde jako vhodný způsob změny hesla, šlo by lehce podvrhnout tu kontrolu starého hesla a změnit tak heslo k jakémukoliv účtu. Navíc posíláš do DB neošetřený data. |
||
ego Profil * |
#5 · Zasláno: 24. 6. 2012, 12:03:30
Medvídek:
ok. neni na netu nějakej ověřenej skript ? :) když prohlídnu net tak mě napadá ještě tenhle (z linuxsoftu) : <? // tělo skriptu - nejprve si vytvoříme odkaz na databázi $link=mysql_connect(SQL_HOST, SQL_USERNAME, SQL_PASSWORD); mysql_select_db(SQL_DBNAME); mysql_query("SET NAMES 'utf8'"); $BudemeZobrazovat=true; if (!empty($_POST)) // už se odeslalo { if ((strlen ($_POST["heslo"])>50) | strlen ($_POST["heslo"])<3) echo "Heslo musí mít 3-50 znaků"; else { // kontolou jsme prošli $BudemeZobrazovat=false; // poděkujeme uživateli echo "Vaše heslo bylo změněno"; // uložíme změny do databáze if (isset($_SESSION["id"])) mysql_query ("update uzivatele set heslo = '".$_POST["heslo"]."' where id=".$_SESSION["id"].";", $link); } } if ($BudemeZobrazovat):?> <form method="post" action="index.php?clanek=zmenahesla"> <table> <tr> <td>Nové heslo:</td> <td><input name="heslo" type = "password" value="<?echo $_POST["heslo"]?>"></td> </tr> <tr> <td colspan="2"><input type="Submit" name="odesli" value="Změnit heslo"></td> </tr> </table> </form> <?endif;?> zde je ale zase ten problém že tam neni hash ......... |
||
Amunak Profil |
ego:
Zkus přestat lepit a třeba si napiš něco vlastního. Jestli už máš přihlášení s registrací, přece nebudeš pro změnu hesla dělat naprosto odlišný kód. Pokud skutečně potřebuješ pouze zahashovat heslo, můžeme jen hádat, jakou funkci na to používáš. Obvykle třeba: $hash = sha1($_POST["heslo"]); Ten původní kód není ošetřený proti sql injection. Taky předvyplňovat heslo <input name="heslo" type = "password" value="<? echo $_POST["heslo"]?>"> <? ?>
|
||
ego Profil * |
#7 · Zasláno: 24. 6. 2012, 12:30:07 · Upravil/a: ego
Amunak:
díky, ale udelal jsem to jinak vytvořil jsem si vlastní kod: <?php if(isset($_POST['odeslat'])){ include("db.php"); $sql=mysql_query("UPDATE users SET pswd='".$_POST['password']."' where username='".$_SESSION['username']."'"); echo "<p class='msg done'>Vaše heslo bylo úspěšně změněno!</p>"; } ?> <form method="POST"> Nové heslo: <input type="password" name="password"> <input type="submit" value="Change" name="odeslat"> </form> nehashuju to, ale pořád to nejde ... co tam mam špatně ? aha tak už vím session start ... sakra :D taková banalita tak ne no, přidal jsem session start a ob start a stejne to nemeni .... |
||
Amunak Profil |
ego:
To nevím co máš špatně, protože tenhle kód přestože je ošklivý a neošetřený by měl fungovat. • odsazuj kód, dá se to pak lépe číst • include je jazykový konstrukt, ne funkce (smaž ty závorky) a bylo by asi vhodnější použít require • pokud při přihlášení ověřuješ hash hesla a v DB ukládáš hashe, musíš použít hash i tady (a proto ti to asi nefunguje). Řešení máš v [#6]. • na nové heslo by ses měl ptát asi dvakrát, kdyby se dotyčný přepsal a nevěděl to, už by se taky nikdy nemusel přihlásit. • asi by ses měl ptát na staré heslo pro případ, že se uživatel zapomněl odhlásit a někdo by se mu pak pokusil ukrást účet. • pokud to "nic nedělá" (typicky bílá nebo ukousnutá stránka) a nevidíš chybu, zapni si error_reporting |
||
ego Profil * |
#9 · Zasláno: 24. 6. 2012, 12:42:31 · Upravil/a: ego
error roportin je zapnutý a žádnou chybu mi to nehlásí .... je to divný ..
ok tak ne, vyhodilo mi to tohle: Notice: A session had already been started - ignoring session_start() in /d1/www/domain/lupacovka.cz/science/change.php on line 57 ale já mám zaplý sessiony + po zmáčknutí Change se objeví hláška Notice: Undefined index: jmeno in /d1/www/domain/lupacovka.cz/science/change.php on line 60 co znamená ? |
||
panther Profil |
#10 · Zasláno: 24. 6. 2012, 14:37:54
ego:
„ale já mám zaplý sessiony“ ta chyba, resp. varování povídá něco jiného. Vyhledávání zde na diskusi nebo nějakém vyhledávači nefunguje? ta noticka... opět, základní syntaxe PHP, přeložit nebo vygooglit ti zabere méně času, než napsat do diskuse. |
||
Amunak Profil |
#11 · Zasláno: 24. 6. 2012, 15:02:01
ego:
Ty chyby odpovídají jinému kódu než jsi poslal v [#7]. Hádám, že ze session taháš něco, co v nich není. Taky tam očividně máš navíc session_start .
|
||
ego Profil * |
#12 · Zasláno: 24. 6. 2012, 15:53:42
jak se tak koukám do diskusí tak mě nenapadá jak definovat tohle:
$sql=mysql_query("UPDATE uzivatele SET heslo='".$_POST['heslo']."' where jmeno='".$_SESSION['jmeno']."'");
všude je že to mužu definovat pomocí isset, ale tady mi to nepasuje .. ? co s tím ? |
||
Someone Profil |
#13 · Zasláno: 24. 6. 2012, 16:05:29
ego:
„co s tím ?“ Nauč se základy PHP a zkus přestat slepovat kódy, které najdeš někde na internetu. |
||
ego Profil * |
#14 · Zasláno: 24. 6. 2012, 22:17:58
Someone:
díky, rada za všechny prachy :) |
||
Ugo Profil |
ego:
všichni sme si tím prošli, většina osamotě. Jediným základem je aspoň nějaká znalost angličtiny abys rozuměl chybám, případně zapnout překaldač a přeložit si je. Indexy a nedefinovaný proměnný sem ze začátku neřešil, jestli máš hodně lepenýho kódu kde to není ošetřeno tak to taky neřeš a přenastav si error_reporting aby notice nezobrazoval, ostatně ještě se mi nestalo že by notice bylo příčinou nefunkčnosti (může jen pomoct s odhalením překlepů a zapomenutých dat) Toto jsou opravdu naprosté základy a jestliže chceš pomoct tak sem dej kód co používáš, jak říká Amunak tak ty chyby neodpovídají a telepat tu snad nikdo neni. Edit: tady máš nějaký nástřel ... další edit (lidé podemnou mají naprostou pravdu :) ) <?php $chyba = ""; $uspech = ""; if(isset($_POST['heslo_nove'], $_POST['heslo_nove_2'], $_POST['heslo_stare'])) { if(trim($_POST['heslo_nove']) == "") { $chyba = "Zadejte nové heslo"; } else { if(trim($_POST['heslo_nove']) == trim($_POST['heslo_nove_2'])) { mysql_query("UPDATE users SET pswd='".(md5($_POST['heslo_nove']))."' where username='".$_SESSION['username']."' and pswd='".(md5($_POST['heslo_stare']))."' limit 1")); if(mysql_affected_rows > 0) { $uspech = "Heslo bylo změněno"; } else { $chyba = "Chybé staré heslo"; } } else { $chyba = "Hesla se neshodují"; } } } if(!empty($chyba)) { echo $chyba; } if(!empty($uspech)) { echo $uspech; } ?> <form action="" method="post"> <label for="heslo_stare">Staré heslo</label> <input type="password" name="heslo_stare"> <br> <label for="heslo_nove">Nové heslo</label> <input type="password" name="heslo_nove"> <br> <label for="heslo_nove_2">Kontrola nového hesla</label> <input type="password" name="heslo_nove_2"> <br> <input type="submit" value="Změnit heslo"> </form> |
||
tatyalien Profil |
Ještě bych dodal možná u update limit 1, tedy alespoň já když aktualizuji údaje uživatle to tak mám pro jistotu a dělám to spíše než oproti username, tak jeho id + ještě ošetření mysql_real_escape_string(md5(trim($_POST['heslo_nove'])))
|
||
Šéva Profil |
#17 · Zasláno: 25. 6. 2012, 12:54:07
Ugo:
možná bych tam ještě přidal něco jako ověření starého hesla: ... if(mysql_affected_rows > 0) { $uspech = "Heslo bylo změněno"; } else { $chyba = "Chybné staré heslo"; } ... |
||
Ugo Profil |
#18 · Zasláno: 25. 6. 2012, 12:58:28
tatyalien:
opravdu je nutné md5 hash escapovat? Párkrát jsem slyšel že ne, párkrát že jo, já se kloním k tomu že ne, sic to za mě knihovna dělá, ale podle mě by neměl být důvod (hledat to jsem nějakej línej) :) |
||
tatyalien Profil |
#19 · Zasláno: 25. 6. 2012, 13:16:44
Ugo:
Abych pravdu řekl nevím... já to raději cpu kde to jde... vždyť to znáš, někde to nedáš a je to blbě... takhle je to jeden příkaz navíc a máš klid ;) |
||
panther Profil |
#20 · Zasláno: 25. 6. 2012, 13:51:27
Ugo:
„opravdu je nutné md5 hash escapovat?“ neni. Hash, resp. sada znaku, ze ktere je hash slozen, lze povazovat vzhledem k MySQL za bezpecnou. |
||
Časová prodleva: 3 dny
|
|||
ego Profil * |
#21 · Zasláno: 28. 6. 2012, 18:18:50
Ugo:
použil jsem tvůj kod, díky. Má to ale háček anglicky umím, ale bohužel nedokážu na internetu najít tu správnou variantu napravení chyby .. vypisuje mi to tohle: Notice: Undefined index: jmeno in /d1/www/domain/lupacovka.cz/science/change.php on line 65 Notice: Use of undefined constant mysql_affected_rows - assumed 'mysql_affected_rows' in /d1/www/domain/lupacovka.cz/science/change.php on line 66 |
||
Alphard Profil |
#22 · Zasláno: 28. 6. 2012, 18:38:02
[#21] Chcete pracovat s klíčem "jmeno" nějakého pole. Ten klíč ale neexistuje.
|
||
ego Profil * |
#23 · Zasláno: 28. 6. 2012, 19:01:23
ale on přece existuje .. zde:
jmeno='".$_SESSION['jmeno']."' |
||
Alphard Profil |
#24 · Zasláno: 28. 6. 2012, 19:05:44
vypište si
print_r($_SESSION); PHP by nehlásilo nedefinovaný klíč, kdyby definovaný byl.
|
||
ego Profil * |
#25 · Zasláno: 28. 6. 2012, 19:08:04
no tak mi to navíc nad ty hlášení napsalo tohle: Array ( )
|
||
Alphard Profil |
#26 · Zasláno: 28. 6. 2012, 19:09:24
To znamená, že dané pole je prázdné.
|
||
ego Profil * |
#27 · Zasláno: 28. 6. 2012, 19:10:46 · Upravil/a: ego
okey, já to všechno chápu, ale jak ho definovat ?
vydefinuju to přece tím "=" ne ? musím najít session přihlášeného uživatele?? |
||
Someone Profil |
#28 · Zasláno: 28. 6. 2012, 19:18:47
Omlouvám se, že nepřijdu s nějakou zlomovou radou, ale opět musím odkázat na [#13], protože definování proměnných jsou základy PHP... vypadá to, že session['jmeno'] pochází z dob přihlašování uživatele. Hádám, že se jedná o dva různé kódy, které ego někde sesbíral na internetu. První kód (přihlašovací) pravděpodobně nedefinuje $_SESSION (možná funguje na sušenkách).
[#23] ego není definování $_SESSION['jmeno'], jedná se pouze o její výpis. |
||
ego Profil * |
#29 · Zasláno: 28. 6. 2012, 19:28:38 · Upravil/a: ego
:D ale já umim definovat proměnnou ...
$jmeno = "....."; ale co patří na místo těch teček ??? to právě nevím? :D dík za rady |
||
Ugo Profil |
ego:
ty ale přeci nemáš problém s nedefinovanou proměnnou, ale s nedefinovaným indexem pole, $jmeno definovaná je, $_SESSION['jmeno'] neni. mysql_affected_rows má bejt samozřejmě funkce, mam tam chybu (kterou sem ale tušim editoval :D), má být mysql_affected_rows(). Ale i tak radim to nepoužívat, ani jeden z těch kódů co najdeš. Přečti si je, zavři je a napiš to sám ať příště něco takového řešíš 5 minut z hlavy místo dlouhého googlení a spoléhání na ostatní. Kontrolu definované proměnné ti udělá isset() nebo třeba empty() pokud jí nechceš zároveň prázdnou (pozor, proměnná s hodnoutou NULL neni definovaná :) ) /* isset ... $_SESSION['jmeno'] = "" projde */ if(isset($_SESSION['jmeno'])) { $jmeno = $_SESSION['jmeno']; } else { $jmeno = "Anonym"; } /* empty .. neprojde NULL, "", false, 0, array() , ještě je vhodné spojit s fcí trim :) */ if(!empty($_SESSION['jmeno'])) { $jmeno = $_SESSION['jmeno']; } else { $jmeno = "Anonym"; } |
||
Časová prodleva: 12 let
|
0