Autor Zpráva
tn
Profil *
V PHP mám vytvořený formulář pro zadání dvou údajů - jméno a heslo.
Jméno a heslo mám uložené v databázi MySQL.
Takže pak po odeslání dat ze stránky kontroluji zda tyto údaje souhlasí, skript vypadá zhruba následovně:

$jmeno=$_POST['jmeno'];
$heslo=$_POST['heslo'];
if (@$vysledek=mysql_query("select pw from uziv where jm = $jmeno")):
$zaznam=MySQL_Fetch_Array($vysledek);
if ($zaznam["pw"]==$heslo):
echo "údaje OK";
else:
echo "špatné heslo";
endif;
else:
echo "špatné jméno";
endif;

Když mám v databázi nastavené jm např. číslici 1 a pw číslici 2, tak to funguje OK.
Jakmile však nastavím jm např. na písmeno A a pw na písmeno B, tak to nefunguje a skončí to hned na chybně zadané jméno. V databázi to nenajde jm=A.
PHP soubor mám uložený v kódování UTF-8 (meta http-equiv="Content-Type" mám taky UTF-8) a pro tabulku uziv mám v databázi MySQL nastaveno porovnávání utf8_general_ci.
V MySQL jsem zkoušel nastavit porovnávání utf8_czech_ci, ale nepomohlo to a stále to nenajde jm=A v databázi.
Takže s čísly to funguje, ale s písmeny ne.

Ještě doplnění, když skript napíšu následovně, tak funguje OK i s čísly i s písmeny.

$jmeno=$_POST['jmeno'];
$heslo=$_POST['heslo'];
if (@$vysledek=mysql_query("select * from uziv")):
$zaznam=MySQL_Fetch_Array($vysledek);
if ($zaznam["jm"]==$jmeno):
if ($zaznam["pw"]==$heslo):
echo "údaje OK";
else:
echo "špatné heslo";
endif;
else:
echo "špatné jméno";
endif;
endif;

Prosím poraďte v čem je problém.
Joker
Profil
Pár tipů:
1. řetězcové hodnoty v databázi nejsou v uvozovkách. Pak to těžko může fungovat.
Ne: SELECT sloupce FROM tabulka WHERE jm=jméno
ale: SELECT sloupce FROM tabulka WHERE jm="jméno"

2. Chybí kontrola vstupních dat. I když tam ty uvozovky budou, pokud zadám jméno třeba:
" OR 1=1 --
Vznikne dotaz: SELECT pw FROM uziv WHERE jm="" OR 1=1 --"
...který vrátí všechna hesla v databázi. Sice mě nenapadá nějaké zneužití pro tenhle konkrétní případ, ale je snad zřejmé, jak to je potenciálně nebezpečné.
Pokud doplňujeme uživatelsky zadané vstupy do databázového dotazu, je potřeba hodnoty nejdříve validovat. Když jde o řetězce, mysql_real_escape_string() je náš kamarád.

3. Heslo by se nemělo v databázi ukládat přímo. Když už nic, tak alespoň MD5 jako minimální zabezpečení.

4. Dá se to udělat jednodušeji, předpokládejme úpravy, které jsem napsal v předchozích třech bodech:
$jmeno = $_POST["jmeno"];
$heslo = md5($_POST["heslo"]);
$sql = 'SELECT id FROM uziv WHERE jm ="'.mysql_real_escape_string($jmeno).'" AND pw="'.$heslo.'"';
...uděláme query a pokud vrátí nějaký řádek, existuje správné přihlášení.
tn
Profil *
Dík za rady.
To co píšeš ohledně kontroly vstupních dat a ukládání hesel samozřejmě vím. Tady jsem to uvedl schválně zjednodušeně, protože nemůžu rozchodit to porovnání zadaného jména se jménem uloženým v databázi.
Zkoušel jsem i tvůj dotaz dle bodu 4, ale bez úspěchu. Stále to nefunguje.

Tak už nevím.

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: