Autor | Zpráva | ||
---|---|---|---|
T-fon Profil |
#1 · Zasláno: 27. 1. 2012, 11:12:46
podle zdejšího návodu jsem použil přihlašování, ale pokud použiju SHA1, tak mi to heslo vyhodí jako špatné, když SHA1 odeberu, vše je vpořádku.
registrace do databáze: $dotaz="INSERT INTO registrace (Prijmeni,Jmeno,Email,Nick,Heslo,Kolo,Casto) VALUES ('$_POST[prijmeni]','$_POST[jmeno]','$_POST[mejl]','$_POST[nick]',SHA1('$_POST[heslo]'),'$_POST[kolo]','$_POST[casto]')"; $vysledky=mysql_query($dotaz,$db) or die(mysql_error($db)); přihlášení: if (isset($_POST['username']) && isset($_POST['password'])) { $username = db_escape(trim($_POST['username'])); $password = db_escape(trim($_POST['password'])); $result = mysql_query("SELECT COUNT(*) FROM registrace WHERE Nick = '$username' AND Heslo = SHA1('$password')"); if (mysql_result($result, 0)) { $_SESSION['username'] = $username; header ('Location:index.php'); exit; } ještě bych prosil o stručné vysvětlení té funkce db_escape |
||
Alphard Profil |
#2 · Zasláno: 27. 1. 2012, 11:24:05
T-fon:
Do databáze vkládáte přímo heslo z POST, ale při přihlašování projde funkcí db_escape() a trim(). Je to kvůli bezpečnosti a stejným procesem by mělo projít vždy, tj. i při insertu. Jinak doufám, že to heslo máte v databázi uložené fakt v hashi, že jste ho tam pro testování nenapsal v nějakém adminu přímo. |
||
T-fon Profil |
#3 · Zasláno: 27. 1. 2012, 11:28:21 · Upravil/a: T-fon
ano, vkládal jsem ho tam přes ten registrační formulář, kterej mám uvedenej v dotazu - SHA1('$_POST[heslo]'
ten trim vím, že ořezává mezery, ale co přesně dělá ten db_escape? |
||
Joker Profil |
#4 · Zasláno: 27. 1. 2012, 11:30:08
T-fon:
Není problém v tom, že při zakládání účtu se na heslo nevolá trim a db_escape, čili to nemusí být úplně stejný řetězec? „ještě bych prosil o stručné vysvětlení té funkce db_escape“ Escapuje data odesílaná do databáze. Například v tom kódu výše kdybych při zakládání účtu odeslal například údaje: prijmeni: prijmeni1 jmeno: jmeno1 mejl: a@b.cz nick: nick1 heslo: heslo', 5, 0), ('prijmeni2', 'jmeno1', 'c@d.cz', 'nick2', SHA1('heslo kolo: 5 casto: 0 Ta funkce právě zabrání tomu, aby řetězec šlo upravit tak, aby se interpretoval jako část SQL dotazu. |
||
T-fon Profil |
já myslim že v tomhle problém neni, protože když použiju úplně stejné heslo a odeberu to SHA1 (ze zakládání účtu i z ověření), tak to funguje správně
já to teda vyzkoušim, takže by to mělo vypadat takto při té registraci? db_escape(trim(SHA1('$_POST[heslo]')))? |
||
Joker Profil |
#6 · Zasláno: 27. 1. 2012, 11:50:12
T-fon:
„když použuju úplně stejné heslo a odeberu to SHA1 (ze zakládání účtu i z ověření), tak to funguje správně“ Tyhle chyby jsou na 99% způsobené tím, že buď při registraci, nebo při ověření, se do SHA1 pošle špatný řetězec. První krok je ověřit (SHA1 si jde vygenerovat i online), jestli hash uložený v databázi je skutečně správný hash toho hesla. Pokud není, je chyba při zakládání účtu. Pokud je, zaměřil bych se na ověřování hesla. „takže by to mělo vypadat takto při té registraci?“ Práce s tím heslem by měla být úplně stejná jako při té kontrole. |
||
juriad Profil |
#7 · Zasláno: 27. 1. 2012, 11:54:41
ideálně si vytvoř jednu funkci, kterou proženeš heslo VŽDY, při vytváření účtu i při přihlašování. Vyhneš se tak těmto nepříjemnostem.
Neznám php, ale nelíbí se mi: db_escape(trim(SHA1('$_POST[heslo]'))) Pokud vím, tak apostrofy neinterpretují svůj vnitřek, tedy provádíš hash nad řetězcem znaků: dolar podtrzitko velke p velke o velke s velke t leva hranata zavorka... Navíc výstup SHA1 jsou jen znaky 0-9a-f, takže žádné bílé znaky ani další nebezpečné sekvence tam nebudou. (U ostatních polí vždy db_escape, nebo obdobné prováděj.) |
||
T-fon Profil |
takže problém vyřešen, bylo to opravdu špatným vygenerováním hashe (mel jsem nastaven ve sloupci špatný počet znaků)
děkuji všem za pomoc ta funkce, kterou použiju na heslo, by mohla vypadat takto? function provereni_hesla ($hheslo){ db_escape(trim(SH1($hheslo))); } a pak to použit při registraci takto? .......'$_POST[nick]','provereni_hesla($_POST[heslo])','$_POST[kolo]',........ (jde mi o to, jestli tam mají být apostrofy nebo ne) |
||
martin1312 Profil |
#9 · Zasláno: 27. 1. 2012, 12:21:26
nejak nerozumiem, preco escapujes uz vytvoreny hash. V nom nikdy nebudu ziadne nebezpecne znaky
|
||
Alphard Profil |
#10 · Zasláno: 27. 1. 2012, 12:25:41
T-fon:
Musíte si uvědomit, které funkce jsou v PHP a které v MySQL. Ve vzoru máte funkci sha1() použitou v MySQL (je to sha1, ne sh1). Ekvivalentní funkce je i v php sha1(), ale měl by vám být jasný řetězec aplikace funkcí, ne to nějak nakombinovat a doufat, že to vyjde. Je hloupost prvně hashovat a až pak trim(), db escape není nezbytné, ale klidně to tam nechce. „.......'$_POST[nick]','provereni_hesla($_POST[heslo])','$_POST[kolo]',........“ To nepůjde právě proto, že mícháte php funkci do mysql. mysql_query("'$_POST[nick]','".provereni_hesla($_POST['heslo'])."','$_POST[kolo]'"); |
||
juriad Profil |
#11 · Zasláno: 27. 1. 2012, 13:15:49
T-fon:
udělej si pořádek v použití uvozovek a apostrofů a také, kdy je proměnná řetězec a kdy není: $_POST je pole 1) $_POST[*] je přístup k prvku pole, typ se zachovává pokud je * řetězec, neuvozený, tak se interně v tomto kontextu převede, toto nepoužívat! pokud je * 'řetězec', tak se použije přesně tak jak je zapsaný pokud je * "řetězec", tak je ekvivalentní 'řetězec', dokud řetězec neobsahuje proměnné a nějaké další speciální konstrukce (*) 2) '$_POST[*]' je řetězec obsahující znaky 'dolar p o s t zavorka ... zavorka' pokud je * řetězec, neuvozený, je výsledek triviální: 'dolar p o s t zavorka ř e t ě z e c zavorka' pokud je * 'řetězec', dojde k chybě pokud je * "řetězec", bude výsledek 'dolar p o s t zavorka uvozovka ř e t ě z e c uvozovka zavorka' 3) "$_POST[*]" je řetězec který obsahuje hodnotu prvku pole $_POST převedenou na řetězec pokud je * řetězec, neuvozený, tak se interně v tomto kontextu převede, toto nepoužívat! pokud je * 'řetězec', získá z pole $_POST hodnotu s klíčem 'řetězec' a převede ji na řetězec pokud je * "řetězec", dojde k chybě první způsob vrací hodnotu takového typu, jakého skutečně je, například 12 druhý způsob žádný přístup do pole neprovádí, ani není možný třetí způsob vrátí hodnotu z pole převedenou na řetězec, například '12' pokud vím, že výstupem je řetězec, nemá smysl funkci obalovat uvozovkami (apostrofy už vůbec ne, to nezpůsobí zavolání funkce) php je dynamický jazyk, proměnné nemají přímo určené typy, ale každá hodnota ví, kterého je typu a sama se převádí na jiný typ v závisloti na kontexu, kde je použita apostrofy obecně nijak neinterpretují obsah mezi nimi, řetězec přesně odpovídá tomu, jak je zapsaný, uvažuj o nich jako o správném zápisu řetězce uvozovka jen vynutí interpretaci proměnné v řetězcovém kontextu (hodnota se převede na řetězec), uvozoky jsou používány často nadbytečně, většinou nejsou třeba pro interpretaci proměnných a lze je nahradit apostrofy převedení na řetězec jde také vynutit operátorem sloučení řetězců, tečkou: 'hodnota prvku pole $_POST pro klíč \'a\' je '.$_POST['a'] // použití \' umožní zapsat znak apostrof uvnitř řetězce "hodnota prvku pole \$_POST pro klíč 'a' (\$POST['a']) je $_POST['a']" // použití \$ umožní interpretovat $_POST jako posloupnost znaků // bez zpětného lomítka by nahradil $_POST za jeho hodnotu a tu převedl na řetězec a doplnil na dané místo (*) umí jen hodnotu proměnné, hodnotu prvku pole a o moc víc už ne, neumí ani volání funkce. tento příspěvek přenechávám djpw, aby s ním naložila, jak bude chtít |
||
T-fon Profil |
#12 · Zasláno: 27. 1. 2012, 13:39:26
no jsem úplnej začátečník a koukám že v tom mám větší bordel než jsem si myslel. tyhle vaše příspěvky mi moc pomohly trochu pokročit, díky za ně všem...
|
||
T-fon Profil |
#13 · Zasláno: 28. 1. 2012, 10:40:59
tak jestě mi furt není jasné to pouziti apostrofů. Alphard uvádí příklad: mysql_query("'$_POST[nick]',...
ale Juriad píše, ze druhý způsob (s apostrofy) žádný přístup do pole neprovádí... |
||
Alphard Profil |
#14 · Zasláno: 28. 1. 2012, 10:53:30
T-fon:
Ty apostrofy patří SQL dotazu, z pohledu PHP je to v uvozovkách. Je-li pole v uvozovkách, již se neuvozuje jednoduchý klíč, tj. můj způsob je správný. juriad má pravdu v 1 a 2, ale v 3 (tento případ), se mýlí. To, co píše nepoužívat, se má používat :-). Vše o řetězcích, ale je to aspoň na hodinu. |
||
Časová prodleva: 4 dny
|
|||
T-fon Profil |
#15 · Zasláno: 1. 2. 2012, 16:18:39
prosím ještě o jednu radu se syntaxí, je to taková kravina:
echo '<img src=$color.".gif" alt="barva">'; do $color se mi v cyklu načte název barvy stejný jako název souboru. zkoušel jsem kombinovat apostrofy, uvozovky i závorky a nic, jsem z toho zoufalej..... |
||
juriad Profil |
#16 · Zasláno: 1. 2. 2012, 16:58:37
dosazení hodnoty do stringu:
echo "<img src='$color.gif' alt='barva'>"; echo "<img src=\"$color.gif\" alt=\"barva\">"; nebo spojováním pomocí apostrofu: echo '<img src="' . $color . '.gif" alt="barva">'; echo '<img src=\'' . $color . '.gif\' alt=\'barva\'>'; moc jiných způsobů není, nejpříjemnější je asi ten první |
||
Keeehi Profil |
#17 · Zasláno: 1. 2. 2012, 16:59:32
echo '<img src="'.$color.'.gif" alt="barva">'; |
||
YoSarin Profil |
T-fon:
1) php řetězce uvozené pomocí apostrofů (') neumožňují vkládání přoměnných (prostě proměnnou kterou obsahují nenahradí za její hodnotu). 2) u html atributů se uvozovky (") píší mezi rovnítko a hodnotu (nevím proč je máš až za $color) 3) řetězit řetězce můžeš jen pokud je ukončíš (a to musíš stejným znakem jako kterým jsi řetězec uvodil). echo 'první řetězec v apostrofech' . $promenna ' . "řetězec v uvozovkách" . 'apostrofy s něčím obaleným uvozovkami "Jupí' . $dalsiPromenna . '!" posledni retezec';
4) pokud v tom máš zmatek, není nic jednoduššího než se tomu vyhnout - všechny řetězce ukončuj, používej apostrofy, proměnné vkládej do řetězců pomocí tečkového operátoru atd atd atd (nic z toho není nijak závazné, ale možná ti to pomůže zpřehlednit řetězce). 5) ten kód bych já osobně napsal takhle: echo '<img src="' . $color . '.gif" alt="barva" />';
|
||
T-fon Profil |
#19 · Zasláno: 1. 2. 2012, 17:12:35
díky
|
||
Časová prodleva: 11 let
|
0