| 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: 16 let
|
|||
0