[ taksistaZR @ 12.02.2007. 15:19 ] @

Poz!
U pitanju je login skripta koja podatke za pass i user cuva u cookie. Nije presudna bezbednost u ovom slucaju tako da sam se odlucio za cookie umesto session da korisnici nebi morali stalno da se registruju.

U lokalu isprobano (php 4.3.4.) sve radi kako treba, cookie pronadjem u Temporary Internet Files i login radi ok...
Kada sam hteo da isprobam skriptu na free hostingu (awardspace.com) ne mogu da se ulogujem i stalno dobijam poruku da je headers vec poslat kada stigne do linije gde treba da setuje cookie. Cookie se ne naprave i tu dolazi do pucanja.
Jasno mi je da se cookie salju sa headerom i da nece raditi ako je header vec poslat, kako u lokalu sve radi dobro..?

Pogledao sam slicne slucajeve na forumu. Uglavnom je greska kod koriscenja register globals ili je header vec poslat, ali to nije slucak kod mene.
Koristio sam setcookie(ID_my_site, $_POST['username'], $hour) i kasnije $username = $_COOKIE['ID_my_site'] , ali cookie se ne naprave.
Ako sve to radi u lokalu kako headers moze drugacije da se posalje na mrezi?
Gledao sam php info servera i nisam primetio neke bitne razlike..? Odakle da pocnem?
[ 1r0nM4n @ 12.02.2007. 16:18 ] @
Da li mozda taj free hosting stavlja neke banere na tvoj sajt?
[ taksistaZR @ 12.02.2007. 18:58 ] @
Nema banera ni iskacucih prozara.. nikakve reklame.
[ milannQchevo @ 13.02.2007. 07:15 ] @
meni se cini da je potrebno da ti postavljanje cookie bude pre kompletnog koda na stranicama. znaci pre svakog koda, ukljucuju html. mozda ti je to problem? ili taj free host nije kako treba..

probaj phpnet.us ja sam se sa takvim loginom igrao na tom hostu
[ Jezdimir Lončar @ 13.02.2007. 10:13 ] @
Vidi da li ti se nalazi neki html prije setcookie i da li nesto ispisuje prije iste.
Takođe vidi ob_ funkcije na php.net -u.
[ Nemanja Avramović @ 13.02.2007. 10:40 ] @
Proveri sa funkcijom headers_sent da li je heder već poslat. Ako jeste, imaš definitivno nešto pre slanja cookie-a
[ taksistaZR @ 13.02.2007. 16:28 ] @
Stvarno ne mogu da pronadjem sta se salje u header pre nego sto bi trebalo... najvise me buni to sto u lokalu sve radi dobro.
login.php radi prosto.. proveri da li postoje cookie, ako postoje i ako su odgovarajuci salje na members.php stranicu. Ako cookie ne postoje prikazuje se login forma. Kada se pritisne submit podaci se preko posta proveravaju u bazi i ako odgovaraju naprave se cookie i preko header saljem na members stranu. Evo koda:
Code:

<?php
// Konekcija na bazu
include ("konekcija.inc.php");

// Provera da li postoje cookie
if(isset($_COOKIE['ID_my_site']))

// ako postoje redirekt na members stranu

    $username = $_COOKIE['ID_my_site']; 
    $pass = $_COOKIE['Key_my_site'];
    
    $check = mysql_query("SELECT * FROM users WHERE username = '$username'")or die(mysql_error());

    while($info = mysql_fetch_array( $check ))     
        {

        if ($pass != $info['password']) 
            {
                        
            }
        else
            {
            header("Location: login/members.php");

            }

        }

}

// Ako je login forma submitovana
if (isset($_POST['submit'])) {


// Da li su popunjena oba polja
    if(!$_POST['username'] | !$_POST['pass']) {
        die('Nisu popunjena odgovarajuca polja.');
    }

    // provera da li username postoji
    if (!get_magic_quotes_gpc()) {
        $_POST['username'] = addslashes($_POST['username']);
    }

    $check = mysql_query("SELECT * FROM users WHERE username = '".$_POST['username']."'")or die(mysql_error());

// greska ako ne postoji username
$check2 = mysql_num_rows($check);
if ($check2 == 0) {
        die('Korisnicko ime ne postoji u bazi. <a href=add.php>Kliknite ovde za registraciju</a>');
                }


while($info = mysql_fetch_array( $check ))     
{

// md5 password
$_POST['pass'] = stripslashes($_POST['pass']);
    $info['password'] = stripslashes($info['password']);
    $_POST['pass'] = md5($_POST['pass']);

// greska ako password nije dobar
    if ($_POST['pass'] != $info['password']) {
        die('Neispravna lozinka. Molim pokusajte ponovo.');
    }

else
{
// ako je login ok napravi cookie
    
$_POST['username'] = stripslashes($_POST['username']);
    

$hour = time() + 3600; 
setcookie(ID_my_site, $_POST['username'], $hour );
setcookie(Key_my_site, $_POST['pass'], $hour, );    

// redirekt na members stranu
header("Location: login/members.php");
}

}

} else {    

// ako nema cookie
?>

<form action="<?php echo $_SERVER['PHP_SELF']?>" method="post">
<table border="0">

<tr><td>Korisnicko ime:</td><td>
<input type="text" name="username" maxlength="10">
</td></tr>
<tr><td>Lozinka:</td><td>
<input type="password" name="pass" maxlength="10">
</td></tr>
<tr><td colspan="2" align="right">
<input type="submit" name="submit" value=" Uloguj se ">
</td></tr>
<tr><td  colspan="2">&nbsp;</td></tr>
<tr><td  colspan="2" align="right"><a href="#"><font size="2">Zaboravljena lozinka?</font></a> </td></tr>
</table>
</form>
<?php
}
?>


Zatim na members strani proveram cookie i ako je sve ok prikazuje se stranica za registrovane. evo kod za members.php

Code:

// Provera da li postoje cookie
if(isset($_COOKIE['ID_my_site'])) 

$username = $_COOKIE['ID_my_site']; 
$pass = $_COOKIE['Key_my_site']; 
$check = mysql_query("SELECT * FROM users WHERE username = '$username'")or die(mysql_error()); 
while($info = mysql_fetch_array( $check )) 


// ako cookie ima pogresan password, poslati na index stranu
if ($pass != $info['password']) 
{ header("Location: index.php"); 


// ako je sve ok prikaz member strane...
else 

// ovde sada ide ostatak stranice...


Kada ovo postavim na mrezu dobijam gresku:

Warning: Cannot modify header information - headers already sent by (output started at url do fajla... .awardspace.com/login/konekcija.inc.php:2) in url... /login.php on line 76
Isto to dobijam za linije 76 , 77 i 80 a to je:

Code:

76: setcookie(ID_my_site, $_POST['username'], $hour);
77: setcookie(Key_my_site, $_POST['pass'], $hour);    
78:
79: // redirekt na members stranu
80: header("Location: login/members.php");


Pokusao sam da ubacim parametre za subdomen prilikom setovanja cookie, ali isto dobijam
setcookie(ID_my_site, $_POST['username'], $hour, '/', ".awardspace.com" );
Probao sam u action formi da upisem umeseto php_self ime strane i url strane.., medjutim nema razlike.

Eto, ako neko vidi neku gresku u kodu... mada pokazalo bi se to i na localhostu.
[ glavince @ 13.02.2007. 19:40 ] @
Prvo probaj prvo da postavis cookie bez drugih podataka.

if(!isset($_COOKIE['test'])) {
setcookie('test, 'test', time()+60);
} else {
ima cookija
}


Drugo proveri dali ti je konekcija.inc.php fajl zacuvan kao Unicode. Moguce je da postoji BOM. Probaj da taj fajl zacuvas kao ASCII.
[ taksistaZR @ 13.02.2007. 22:58 ] @
@glavnice, stvarno ne mogu da verujem... BOM signature u 4 fajla...
Citao sam o tome na ovom forumu, ali nikad mi nebi palo na pamet da to pogledam!

Mada i prethodno mi je Nemanja savetovao headers_sent () funkciju koju sam probao i video sam da je header poslat, ali u citavoj guzvi sam odlepio i mislio da ne kontam dobro headers_sent() posto mi je na nekoliko strana pokazivao da je header poslat, iako nije... ludilo, ovakve gluposti bas znaju da me izbace iz takta.

Hvala ljudi, stvarno ste najjaca ekipa!
[ taksistaZR @ 13.02.2007. 23:01 ] @
Jos samo jedno potpitanje.. ako BOM salje browseru te znakove u header kako je onda radilo na mom kompu?
[ glavince @ 14.02.2007. 01:01 ] @
Sigurno ti je localhost na win. Windows razlicno tretira te 3 bajte od Linux-a.
[ taksistaZR @ 14.02.2007. 01:59 ] @
Upravo tako... taj host je na linuxu.