Autor Zpráva
Folker
Profil
Ahoj, řekněme že mám asociativní pole o několika řádcích, kde klíče jsou něčí jména a hodnoty hesla vytažené z databáze. Přes přihlašovací formulář někdo zadá své jméno a heslo a já potřebuji zadané údaje porovnat s hodnotami v poli tak, aby true bylo pouze v případě, že souhlasí klíč s loginem a zároveň hodnota s heslem přihlašovatele ze stejného řádku pole. Nesmí být použit login z třeba 2. řádku pole a hodnota z 5. řádku pole. Jakou funkci pro procházení pole mám použít?
Prosím poraďte.
MCKAY
Profil
Folker:
Myslím, že na procházení pole se používá cyklus foreach. Nevidím v tom, co jsi řekl žádný problém, pokud to chápu dobře, že ti jde jen o kontrolu, jestli souhlasí login.
Alphard
Profil
Folker:
Nevidím důvod dělat to takhle. V databázovém dotazu přidejte where jmeno = 'xxx' and heslo = 'xxx' a je to.
Folker
Profil
Zeptám se možná blbě, ale za 'xxx' mám dosadit proměnou, která přijímá údaj z formuláře?
Alphard
Profil
[#4]
Ano, ale měl by být ošetřený proti sql injection.

    // ošetříme vstupní údaje od uživatele
    // funkce trim() má význam hlavně u hesla, ořeže bílé znaky (např. mezery) na začátku a konci řetězce
    $username = gpc_addslashes(trim($_POST['username']));
    $password = gpc_addslashes(trim($_POST['password']));

    // zjistíme, jestli je v databázi daný uživatel a jestli se prokazuje platným heslem
    // více o ukládání hesel, např. o tzv. solení, najdete na http://php.vrana.cz/ukladani-hesel.php
    $result = mysql_query("SELECT COUNT(*) FROM users WHERE username = '$username' AND password = sha1('$password')");

    if (mysql_result($result, 0))  // předpokládáme, že dotaz proběhl úspěšně, pokud ne, bude stejně vráceno false
                                   // true (a splnění podmínky) nastane pouze tehdy, když v databázi existuje správná kombinace uživatelského jména a hesla


Tohle jsem vzal z FAQ. Najdete tam i definici funkce gpc_addslashes() a její zdůvodnění.
Folker
Profil
Díky, už to chápu, ale asi jsem něco zvoral. Napsalo mi to
Fatal error: Call to undefined function: gpc_addslashes() in C:\Program Files\VertrigoServ\www\administrace2\uvod.php on line 6

Nevíš prosím čím to je?
AM_
Profil
to je tím, že ta funkce v PHP neexistuje (stačí si přeložit hlášku:) ) řešení je napsat si ji, já bych jí řešil nějak takto:
function gpc_addslashes($str){
  return get_magic_quotes_gpc() ? $str : addslashes($str);
}
Alphard
Profil
Jak píše AM_. Ta funkce ale je na odkazované stránce, sem jsem ji zbytečně nekopíroval.
Folker
Profil
O.k. Díky moc, jste super!!!
Folker
Profil
PS: Ještě jeden dotaz! Když tam ta funkce není, jaké je riziko ?
Alphard
Profil
V tomto případě docela velké. Je to natolik profláklá zranitelnost (tzv. sql injection), že se vám potom do admistrace (za "vhodných" podmínek) dostane každý, kdo se trochu zajímá o PHP.
Folker
Profil
AHA! Tak to je nářez, díky moc.

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: