Autor Zpráva
ego
Profil *
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 *
$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 *
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
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 *
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"]?>">
mi přijde krajně nevhodné. A nepoužíval bych zkrácený zápis PHP tagů <? ?>
ego
Profil *
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 *
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
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
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 *
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
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 *
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
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
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
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
Ugo:
opravdu je nutné md5 hash escapovat?
neni. Hash, resp. sada znaku, ze ktere je hash slozen, lze povazovat vzhledem k MySQL za bezpecnou.
ego
Profil *
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
Jak mám ale definovat index nebo konstantu? Hledal jsem zde v diskusi, na internetu, ale nikde není to řešení které bych vlepil do toho skriptu ..
Alphard
Profil
[#21] Chcete pracovat s klíčem "jmeno" nějakého pole. Ten klíč ale neexistuje.
ego
Profil *
ale on přece existuje .. zde:
jmeno='".$_SESSION['jmeno']."'
Alphard
Profil
vypište si print_r($_SESSION); PHP by nehlásilo nedefinovaný klíč, kdyby definovaný byl.
ego
Profil *
no tak mi to navíc nad ty hlášení napsalo tohle: Array ( )
Alphard
Profil
To znamená, že dané pole je prázdné.
ego
Profil *
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
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 *
: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";
}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: