SESSION alapú jelszó váltás

SESSION alapú jelszó váltás
2011-06-21T17:10:24+02:00
2011-06-21T18:58:32+02:00
2022-11-22T06:10:41+01:00
Tomikapc
Üdv. Egy webshophoz készítek jelszó változtatót.
Úgy oldom meg, hogy felugrik egy ablak

(Dialog)

amiben elkérem a jelenlegi jelszót és az újat kétszer.
Ezután a jelenlegiből md5 hash-t csinálok és elküldöm ajaxszal egy phpnak a hasht, hogy hasonlítsa össze az adatbázisban tárolt értékkel. Ha azt a választ kapja, hogy egyezik, akkor megvizsgálja, hogy a megadott új jelszavak egyeznek-e, ha azok is, akkor megvizsgálja a hosszát, ha az is stimmel, akkor meghívok ajaxszal get metódussal (jquery) egy php-t ami megkapja ujpw néven a get tömbbe az új pw md5 hashét. Ez a php a sessionban tárolt username alapján átírja az adatbázisban az users táblában a megfelelő username-hoz tartozó passwordot az új értékre majd visszatér az ajaxnak, hogy sikeres volt-e vagy nem. Elég biztonságos ez így szerintetek? Köszi aki végigolvasta és értelmezte :)
Mutasd a teljes hozzászólást!
get metódussal vigyázz, mert böngészők hajlamosak cache-ből válaszolni és így nem jut el a szerverre, ha olyan paramétereket adsz meg, amelyek már szerepeltek. Jelszónál ez kevésbé problémás, de form adatokat mindig post-tal küldj.

Amúgy alapvető kitétel, hogy a kliens nem biztonságos. Azaz semmilyen logikát ne bízz a böngészőre, küldd el a formot az összes mezővel és a php ellenőrizze a jelenlegi jelszót és módosítson, ha az jó volt és az újak egyezőek és megfelelnek a követelményeknek.

Ha egyszer beléptem a rendszeredbe, onnantól bármikor beírom a böngészőbe a jelszóváltoztató url-t és az oldalból kilesett paramétereket és kész. Ha az user is benne lenne a requestben, akkor másét is:)

Amúgy meg hiába képzel md5-öt a passwordből és küldöd el a szervernek, ha valaki elfogja, akkor küldi ő is azt, nem kell a jelszó kitalálásával vesződnie. Ha titkosítani akarod az átvitel során, akkor https.
Mutasd a teljes hozzászólást!

  • Köszi! Nem szeretném titkosítani, csak egy nagyon minimális biztonságot talán ez is ad.
    Igazából amikor belép valaki, akkor a $_SESSION['username'] változó megkapja az illető felhasználónevét.
    Az nem gond, ha az alapján változatom a jelszót? Tehát így képzelem:

    jelszo_modosit.php
    <?php session_start(); define('inwebshop',true); include('functions.php'); $ujpw=mysql_real_escape_string($_GET['ujpw']); $username=$_SESSION['username']; $sql="update users set password='$ujpw' where username='$username'"; mysql_query($sql); ?>

    Amúgy persze az adatokat szerver oldalon is ellenőrzöm plusz mysql_real_escape_string.


    Ha valaki szeretné átböngészni:


    function modosit_jelszo(username) { $("#dialog").html('Először adja meg jelenlegi jelszavát: <input id="jelenlegi" type="password" /><br />Új jelszava: <input id="ujpw1" type="password" /><br />Új jelszava mégegyszer: <input id="ujpw2" type="password" />'); $.fancybox.close(); $("#dialog").dialog({ buttons: [ { text: 'Tovább', click: function() { var jelenlegi=$("#jelenlegi").val(); var ujpw1=$("#ujpw1").val(); var ujpw2=$("#ujpw2").val(); jelenlegi=calcMD5(jelenlegi); $.get("osszehas.php",{ megadottjelenlegi: jelenlegi }, function(data) { if (data == 'true') //ha egyezik a visszakapott { if (ujpw1 !== ujpw2) //ha nem egyezik a két jelszó { alert('A két megadott új jelszó nem egyezik! Kérem ellenőrizze!'); } else //ha egyezik a két jelszó és a visszakapott is jó { if (ujpw1.length < 5) //ha túl rövid { alert('A megadott új jelszó túl rövid! Minimum 5 karakternek kell lennie!'); } else //ha egyezik a visszakapott és a két jelszó is és a hossza is jó { ujpwmd5=calcMD5(ujpw1); $.get("jelszo_modosit.php", { ujpw: ujpwmd5 }, function(data) { $("#dialog").dialog('close'); alert('A módosítás sikeres!'); $("#beallitasaimkatt").click(); }); } } } else //ha nem egyezik { alert('A megadott jelenlegi jelszó nem egyezik! Kérem ellenőrizze!'); } }); } } ] } ); $("#dialog").dialog("option", "width", 500); }

    osszehas.php

    <?php session_start(); define('inwebshop',true); include('functions.php'); $username=$_SESSION['username']; $jelenlegimd5=mysql_real_escape_string($_GET['megadottjelenlegi']); $igazimd5=mysql_result(mysql_query("select password from users where username='$username'"),0,'password'); if ($igazimd5 == $jelenlegimd5) { echo 'true'; } else { echo 'false'; } ?>


    Mutasd a teljes hozzászólást!
  • Szerintetek akkor nem gond, ha session['username'] alapján változtatom a jelszót? Másképp hogy lehetne? A session változókat a felhasználó nem tudja manipulálni én úgy tudom.
    Mutasd a teljes hozzászólást!
  • Szia!

    Szerintem $_SESSION["username"] helyett használj auto_increment azonosítókat, abból még véletlen sem lehet kettő egyforma és lényegében mindenkinek egyedi azonosítója van, és véletlen sem kerülhet ki akárkinek még a felhasználóneve sem.

    Egy jelszóváltoztatóhoz én nem használnék AJAX-ot mert véleményem szerint fölösleges, maximum egyszer lefrissíti az oldalt, de a legbiztonságossabb AJAX nélkül. Ha mégis AJAX akkor mindent POST-ol soha ne GET-el.
    Mutasd a teljes hozzászólást!
  • Üdv. Köszi meggondolom az id-set. Bár azonos nem lehet a felhasználónév, ezt a regisztrációkor elintéztem.
    Azért választottam az ajaxot mert így sokkal egyszerűbb és felhasználóbarátabb.

    Akkor a get-et megis szüntetem! Köszi!!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd