Autor Zpráva
Neas
Profil
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
Přečti si FAQ:
http://diskuse.jakpsatweb.cz/?action=vthread&forum=9&topic=2111
Neas
Profil
To jsem četl, ale za boha nemůžu najít, kde je ve scriptu nějaký výstup
Mastodont
Profil
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
kódování je windows-1250
Neas
Profil
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
Možno hlúposť, nechce sa mi skúšať :) Tie medzery na začiatku toho skriptu majú byť?
Neas
Profil
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
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
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
Přestalo fungovat, Nějaká hláška? Bílá obrazovka?

Mimochodem blbá podmínka (4. řádek), doplnil bych isset()
Neas
Profil
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 :-)

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:

0