Phpbb jelszó hash probléma

Phpbb jelszó hash probléma
2015-11-26T21:55:48+01:00
2015-11-27T08:26:35+01:00
2022-12-03T02:00:33+01:00
*deleted_93831829
Sziasztok, van egy phpbb fórum motor telepítve mssql-re, a fórum motorba a regisztráció úgy történik hogy curl használatával adom tovább a fórumnál a feldolgozó php-nak az adatokat. Ehhez van egy titkos kód, amit előtte ellenőriz a php fájl hogy az is benne van e a post-ban ha nincs akkor vissza dob a főoldalra, ez a része lényegtelen.
Alapvetően működik a rendszer, ha a felhasználó a weboldalon jelszót vált, akkor a fórumban is módosul a jelszava.

$user->session_begin(); $auth->acl($user->data); $user->setup(''); $request->enable_super_globals(); $username=$_POST['username']; $user_password=$_POST['user_password']; $newpw=phpbb_hash($user_password); $update = ("update Forum.dbo.phpbb_users set user_password='{$newpw}' where username='{$username}'"); $db->sql_query($update);

Így történik a jelszó módosítás, ez is működik (alapvetően)
Viszont, ha a jelszóba speciális karakter kerül, akkor a fórumba nem tud belépni a felhasználó, direkt kipróbáltam és nálam sem működik, tehát ha ezen keresztül módosítok jelszót, és akár egy + jel van a jelszóban, akkor utána a fórumon nem tudok belépni. De ha a fórumon az admincp-ben átírom a jelszavam, akkor úgy természetesen jó a + is benne. Mi okozhatja a gondot? Valaki találkozott már hasonlóval? Ennek így működnie kéne, le kéne tudnia generálni a + jellel együtt is a hash-t.
Felül a php fájlban, természetesen meg vannak hívva a különböző includeok. 
Megnéztem és a két hash különbözik, tehát ha kézzel beírom az admincp-ben a jelszót +jellel, és ha ezen keresztül küldöm a jelszót + jellel, más hash-t rak be az adatbázisba (ami persze nem mérvadó, de ha + jel nélkül teszem, akkor azonos.).
Előre is köszönöm.
Mutasd a teljes hozzászólást!
Hogy paraméterezed fel a curl hívásnál a POST adatot?

Ha csak simán natúr belerakod a jelszót - pl:

$username = "valaki"; $password = "foo+bar"; curl_setopt($ch, CURLOPT_POSTFIELDS, "username=".$username."&user_password=".$password);
akkor ne csodálkozz. Encodolni kellene a paramétereket - pár lehetőség:

// 1. http_build_query() $username = "valaki"; $password = "foo+bar"; $post = array( 'username' => $username, 'user_password' => $password ); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post)); // 2. urlencode() $username = "valaki"; $password = "foo+bar"; curl_setopt($ch, CURLOPT_POSTFIELDS, "username=".urlencode($username)."&user_password=".urlencode($password)); // 3. sima tömb $username = "valaki"; $password = "foo+bar"; $post = array( 'username' => $username, 'user_password' => $password ); curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
Az első és második Content-Type: application/x-www-form-urlencoded-al küldi az adatot - a harmadik multipart/form-data-val.
Mutasd a teljes hozzászólást!

  • $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"forumurl"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS,"username={$user_id}&user_password={$user_pwd}&user_email={$user_mail}&ip={$_SERVER['REMOTE_ADDR']}"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $server_output = curl_exec ($ch); curl_close ($ch);

    Így adom át jelenleg.
    Mutasd a teljes hozzászólást!
  • Akkor válassz egyet a 3 lehetőségből, mert ebben a formában nem lesz jó. 
    Mutasd a teljes hozzászólást!
  • Bocsánat, ha hülyeséget kérdezek, de azt írtad, hogy:
    $password = "foo+bar";
    Tehát ott a szerveroldalon, te valami hasonló tartalmat várnál? El tudod képzelni, hogy a szerverre kliens oldalról beküldd a nyers, hash-eletlen jelszót? Van ilyen? Biztonságos? Miért?
    Mutasd a teljes hozzászólást!
  • A fenti példával arra próbáltam meg rávezetni, hogy a másik szerver feltételezi, hogy a kliens már encodeolva küldi az adatot és emiatt van az, hogy a + jel esetén nem egyezik a generált a hash, mert az a szóköz karakter urlencode-olt formája

    var_dump(urlencode("foo bar")); // foo+bar var_dump(urldecode("foo+bar")); // foo bar
    tehát a
    "username=valaki&user_password=foo+bar"
    esetében a másik oldalon a var_dump($_POST["user_password"]) értéke "foo bar" lesz aminek hash-e nem lesz egyenlő a "foo+bar" hashével.

    El tudod képzelni, hogy a szerverre kliens oldalról beküldd a nyers, hash-eletlen jelszót? Van ilyen? Biztonságos? Miért?

    Ha HTTPS csatornán megy át a nyers jelszó, akkor az tud biztonságos is lenni. Ha megnézel egy bankos bejelentkezést, akkor ott is a nyers jelszó megy át és nem valami kliensen generált hash. A másik dolog, hogy szerintem nem a kliens (még ha az egy másik szerver) "dolga" az, hogy tudja hogyan kell hash-elni a jelszót a másik oldal számára.
    Mutasd a teljes hozzászólást!
  • Köszi, javítottam, és így már tökéletesen megy a dolog.
    És igen https-el használom.
    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