Autor | Zpráva | ||
---|---|---|---|
Neas Profil |
#1 · Zasláno: 26. 5. 2010, 13:18:26 · Upravil/a: Neas
Ahoj.
Používám službu phpBB a nedávno jsem prohledával googlem weby, protože chci k fóru udělat i vlastní web a chci uživatele ušetřit druhé registrace. Našel jsem tedy soubor PasswordHash.php, díky kterému mohu hashovat hesla stejně, jako to dělá phpBB3 a tak je kontrolovat při přihlašování uživatelů. Narazil jsem však na problém. Udělal jsem si script, který má za úkol přihlašovat uživatele, funguje sice správně (tj. přihlašuje, odhlašuje i zobrazuje chybové hlášky), ale nedovoluje mi používat setcookies() a header(), protože údajně header již byl odeslán (jedna z chybových hlášek, které se mi zobrazujou, ve všech je prakticky to samé, jen každá odkazuje na jiný setcookie, případně header): Warning: Cannot modify header information - headers already sent by (output started at D:\xampp\htdocs\rpg2heaven\PasswordHash.php:1) in D:\xampp\htdocs\rpg2heaven\index.php on line 56 Tzn. chyba je údajně někde v PasswordHash.php PasswordHash.php: http://www.rpg2heaven.cz/PasswordHash.txt Můj přihlašovací script: <?php session_start(); include_once("rpg2H.config_file.inc.php"); include_once("PasswordHash.php"); $presmerovani = $_SERVER['HTTP_REFERER']; if(isset($_COOKIE['hero_heslo'])) { $heslo = $_COOKIE['hero_heslo']; $sql = mysql_query("SELECT username FROM forum_users WHERE user_password='$heslo' LIMIT 1"); $uspech_dotazu = mysql_num_rows($sql); if($uspech_dotazu==1) { $jmeno = mysql_fetch_array($sql); $jmeno = $jmeno[0]; goto prihlaseni; } } if(isset($_GET['akce']) AND $_GET['akce']=='prihlaseni' AND isset($_POST['jmeno']) AND isset($_POST['heslo'])) { $jmeno = htmlspecialchars($_POST['jmeno']); $heslo = htmlspecialchars($_POST['heslo']); prihlaseni: $sql = mysql_query("SELECT user_id, user_password FROM forum_users WHERE username='$jmeno' LIMIT 1"); $uspech_dotazu = mysql_num_rows($sql); if($uspech_dotazu==1) { $logger_info = mysql_fetch_array($sql); $passctrl_hasher = new PasswordHash(8, TRUE); $passctrl_heslo = $passctrl_hasher->CheckPassword($heslo,$logger_info[1]); if($passctrl_heslo == 1) { $_SESSION['hero_id'] = $logger_info[0]; $_SESSION['hero_jmeno'] = $jmeno; $_SESSION['hero_ip'] = $_SERVER["REMOTE_ADDR"]; if(isset($_COOKIE['hero_heslo']) == false) setcookie("hero_heslo", $logger_info[1], time() + 60*60*24*365 ); }else $_SESSION['zprava_o_prihlaseni'] = "Neplatné uživatelské heslo"; unset($passctrl_hasher); }elseif($jmeno == "" AND $heslo == "") $_SESSION['zprava_o_prihlaseni'] = "Je nutné vyplnit všchny údaje!"; elseif($jmeno == "") $_SESSION['zprava_o_prihlaseni'] = "Je nutné vyplnit jméno!"; elseif($heslo == "") $_SESSION['zprava_o_prihlaseni'] = "Je nutné vyplnit heslo!"; else { $_SESSION['zprava_o_prihlaseni'] = "Uživatel se zadaným jménem neexistuje"; } header("Location:$presmerovani"); }elseif(isset($_GET['akce']) AND $_GET['akce']=='odhlaseni') { if($_SESSION['hero_id'] > 0) { unset($_SESSION['hero_id']); unset($_SESSION['hero_jmeno']); unset($_SESSION['hero_ip']); setcookie("hero_heslo", "", time()-60); $_SESSION['zprava_o_prihlaseni'] = "Odhlášení proběhlo úspěšně :-)"; }else $_SESSION['zprava_o_prihlaseni'] = "Odhlásit se mohou pouze přihlášení uživatelé!"; header("Location:$presmerovani"); }else { unset($_SESSION['zprava_o_prihlaseni']); } ?> <html> kód stránky... </html> Nevíte někdo, prosím, jak to opravit, aby to fungovalo správně ? Děkuji :-) PS. zvýraznil jset ty části, kde používám setcookie, header, kde inluduji passwordhash a část, kde jej využívám. |
||
Mastodont Profil |
#2 · Zasláno: 26. 5. 2010, 13:24:22
|
||
Neas Profil |
#3 · Zasláno: 26. 5. 2010, 13:29:30
To jsem četl, ale za boha nemůžu najít, kde je ve scriptu nějaký výstup
|
||
Mastodont Profil |
#4 · Zasláno: 26. 5. 2010, 13:32:41
Pokud je text v UTF-8, tím výstupem může být i tzv. BOM signatura, vizte výše zmíněný Divný znak (čtvereček).
|
||
Neas Profil |
#5 · Zasláno: 26. 5. 2010, 13:34:44
kódování je windows-1250
|
||
Neas Profil |
#6 · Zasláno: 26. 5. 2010, 23:12:00
Nevíte tedy někdo, prosím, kdy ten script odesílá hlavičku? Potřeboval bych totiž použít setcookie, kvůli trvalému přihlášení :-(
|
||
nosko Profil |
#7 · Zasláno: 26. 5. 2010, 23:54:51 · Upravil/a: nosko
Možno hlúposť, nechce sa mi skúšať :) Tie medzery na začiatku toho skriptu majú byť?
|
||
Neas Profil |
#8 · Zasláno: 26. 5. 2010, 23:58:45
jaké mezery na začátku scriptu myslíš?
btw. teď mě něco napadlo, nemůže se za odeslání hlavičky brát to, že jsem použil objekt? (řádky 28 a 29) |
||
Davex Profil |
#9 · Zasláno: 27. 5. 2010, 00:14:27
Ta chybová hláška je naprosto jasná - na začátku souboru PasswordHash.php máš před otevíracím <?php několik mezer [#7], které jsou už součástí těla stránky. Hlavičky se musí posílat před jakýmkoli výstupem nebo musíš zapnout výstupní buffer.
|
||
Neas Profil |
#10 · Zasláno: 27. 5. 2010, 01:01:34 · Upravil/a: Neas
Aha, tyhle mezery. Jo, moc Vám děkuju nosko a Davex, pomohlo to, ale bohužel, způsobilo to najednou jinou chybu - přestalo fungovat odhlašování (aneb přesný opak toho, co jsem řešil teď :-) ).
... }elseif(isset($_GET['akce']) AND $_GET['akce']=='odhlaseni') { if($_SESSION['hero_id'] > 0) { unset($_SESSION['hero_id']); unset($_SESSION['hero_jmeno']); unset($_SESSION['hero_ip']); setcookie("hero_heslo", "", time()-60); $_SESSION['zprava_o_prihlaseni'] = "Odhlášení proběhlo úspěšně :-)"; }else $_SESSION['zprava_o_prihlaseni'] = "Odhlásit se mohou pouze přihlášení uživatelé!"; }else { unset($_SESSION['zprava_o_prihlaseni']); } ?> |
||
mattyZEM Profil |
#11 · Zasláno: 27. 5. 2010, 01:46:47 · Upravil/a: mattyZEM
Přestalo fungovat, Nějaká hláška? Bílá obrazovka?
Mimochodem blbá podmínka (4. řádek), doplnil bych isset() |
||
Neas Profil |
#12 · Zasláno: 27. 5. 2010, 11:31:03 · Upravil/a: Neas
Nic, do URL se mi zapíše ?akce=odhlášení, ale jinak se nestane vůbec nic.
-- 4. řádek -> díky, doplněno EDIT: už jsem našel chybu: bylo jen nuté ještě doplnit na 6. řádek (script v prvním postu) isset($_SESSION['hero_id']). Došlo mi to, když mattyZEM poradil doplnit to samé na řádek 4, takže díky :-) |
||
Časová prodleva: 14 let
|
0