konto usunięte

Temat: problem z cannot modify header information

Witam

Natknąłem się na pewien problem, ale nie bardzo wiem jak go rozwiązać, szukałem rozwiązań w internecie, ale nie znalazłem nic co by pomogło.
Problem wygląda następujaco:


Warning: Cannot modify header information - headers already sent by (output started at D:\Documents and Settings\mklimek\Moje dokumenty\klimcio\xampplite\htdocs\zona_w_php\panel_login.php:9) in D:\Documents and Settings\mklimek\Moje dokumenty\klimcio\xampplite\htdocs\zona_w_php\panel_login.php on line 65
Warning: Cannot modify header information - headers already sent by (output started at D:\Documents and Settings\mklimek\Moje dokumenty\klimcio\xampplite\htdocs\zona_w_php\panel_login.php:9) in D:\Documents and Settings\mklimek\Moje dokumenty\klimcio\xampplite\htdocs\zona_w_php\panel_login.php on line 66
Warning: Cannot modify header information - headers already sent by (output started at D:\Documents and Settings\mklimek\Moje dokumenty\klimcio\xampplite\htdocs\zona_w_php\panel_login.php:9) in D:\Documents and Settings\mklimek\Moje dokumenty\klimcio\xampplite\htdocs\zona_w_php\panel_login.php on line 68


Wspomniana linia 9 to znacznik "<?php".
Zaraz za nim występuje połączenie z bazą.

Linie 65, 66, 68 to:


setcookie(ID_game, $_POST['username'], $hour);
setcookie(Key_game, $_POST['pass'], $hour);
//
header("Location: panel_main.php");


Próbowałem, zgodnie z niektórymi radami wstawić te linie w blok ob_start() ob_end_flush(), ale nie pomogło. Czy ktoś mógłby nakierować na poprawne rozwiązanie?

Z góry dziękuję ;)Mariusz Klimek edytował(a) ten post dnia 09.03.10 o godzinie 11:13

konto usunięte

Temat: problem z cannot modify header information

A co masz, od początku skryptu do linii 9?
Sprawdź, czy nie masz gdzieś przed tym znacznikiem spacji lub entera.

konto usunięte

Temat: problem z cannot modify header information

header() powinien być użyty przed wypisaniem na ekran jakichkolwiek danych - w tym kodu HTML, który pewnie masz przed `<?php`.

konto usunięte

Temat: problem z cannot modify header information

Po pierwsze: co znajduje się przed wspomnianą 9 linią?

Po drugie:


setcookie(ID_game, $_POST['username'], $hour);
setcookie(Key_game, $_POST['pass'], $hour);


ID_game i Key_game - obejmij to apostrofami, ponieważ nie są to stałe, prawda?

konto usunięte

Temat: problem z cannot modify header information

użyj:

na początku skryptu (zanim cokolwiek zrobisz, wyślesz na stdout etc.):
ob_start();

na końcu:
ob_end_flush();

ew. dodaj obsługę gzipowania;

odsyłam do manualaDarek Z. edytował(a) ten post dnia 09.03.10 o godzinie 11:51

konto usunięte

Temat: problem z cannot modify header information

Mariusz Klimek:
Witam

Natknąłem się na pewien problem, ale nie bardzo wiem jak go rozwiązać, szukałem rozwiązań w internecie, ale nie znalazłem nic co by pomogło.
Problem wygląda następujaco:

setcookie(ID_game, $_POST['username'], $hour);
setcookie(Key_game, $_POST['pass'], $hour);
//
header("Location: panel_main.php");

Pomijajac fakt problemu z headerem, pewnie juz jakas tresc WWW wysylasz przed stworzeniem ciastek, ale nie mow ze haslo trzymasz u kogos w cookiesie i to jesszcze w "zywej" formie, po prostu z POSTa.

konto usunięte

Temat: problem z cannot modify header information

Ale po co w ogóle kombinować z output bufferingiem? To jest tylko sposób na przykrycie nieeleganckiego programowania ;) A wystarczy po prostu przemyśleć strukturę skryptu.

konto usunięte

Temat: problem z cannot modify header information

Krzysztof Rakowski:
Ale po co w ogóle kombinować z output bufferingiem? To jest tylko sposób na przykrycie nieeleganckiego programowania ;) A wystarczy po prostu przemyśleć strukturę skryptu.

właśnie czasem te "po prostu" sprawia najwięcej problemów :D

Temat: problem z cannot modify header information

Taki problem może wystąpić w przypadku zapisania pliku w kodowaniu UTF-8 z BOM. Sprawdź pod edytorem hexadecymalnym (np. w Total Commander) czy twój plik tekstowy nie zaczyna się od jakiś "krzaków", a jeżeli tak, to zapisz bez BOM (np. używając Notepad++)

konto usunięte

Temat: problem z cannot modify header information

Wprowadziłem wspomniane zmiany, tzn.
1) wziąłem w apostrof wspomniane zmienne za radą Leszka
2) Usunąłem wszystkie znaczniki html przed headerami i wstawiłem je dla odmiany na końcu.

Dalej nie działało, ale wtedy zrobiłem to co próbowałem wcześniej bez skutku, a o czym pisał Przemysław, czyli zmieniłem kodowanie na UTF-8 z BOM (dzięki Notepad++ było to bardziej niż proste). I tym razem wszystko zadziałało :) Dziękuję wam za pomoc.

Niemniej, do jednego wątku chciałbym wrócić.
Andrzej Winnicki:

Pomijajac fakt problemu z headerem, pewnie juz jakas tresc WWW wysylasz przed stworzeniem ciastek, ale nie mow ze haslo trzymasz u kogos w cookiesie i to jesszcze w "zywej" formie, po prostu z POSTa.

Kiedy o tym wspomniałeś, faktycznie zauważyłem wady tego rozwiązania ;) Opierałem się na tutorialu, więc brałem raczej na wiarę. Czy przy tworzeniu cookies wystarczyłoby username bez hasła? Czy też znacie jakieś lepsze rozwiązania?

konto usunięte

Temat: problem z cannot modify header information

Mariusz Klimek:
Kiedy o tym wspomniałeś, faktycznie zauważyłem wady tego rozwiązania ;) Opierałem się na tutorialu, więc brałem raczej na wiarę. Czy przy tworzeniu cookies wystarczyłoby username bez hasła? Czy też znacie jakieś lepsze rozwiązania?

To jest osobny problem
pamietaj ze cookies moze zostac stworzony, wiec nie mozesz uzywac go do weryfikacji.. jesli juz to robisz.... staraj sie utrudnic zycie.. typu
data+username+pare cyfr losowoych+md5 i to zapiszesz.. a potem bedziesz to porownywac w swoim skrypcie.

JEsli planujesz robic logowanie, zrezygnowalbym z cookies i zrobil to przy uzyciu sesji. Bedzie latwiej dla Ciebie i bezpieczeniej dla uzytkownika (oczywiscie mozna dalej sie bawic w zabezpieczenia sesji zeby jej ktos nie przechwycil, ale to inna bajka) ;)
Radosław Roguziński

Radosław Roguziński programista,
developer aplikacji
internetowych

Temat: problem z cannot modify header information

Najlepiej za komentuj ten setcookie będziesz wiedział czy tu leży wina. A tak jeszcze spytam czy wcześniej nie includujesz jakiś plików w których by mogły być wcześniej wspomniane białe znaczki.

konto usunięte

Temat: problem z cannot modify header information

Czy przy tworzeniu cookies wystarczyłoby username bez hasła? Czy też znacie jakieś lepsze rozwiązania?
Ja bym to zrobił tak, że sesja dla krótkotrwałego zalogowania (oczywiście w sesji również nie zapisujemy hasła bezpośrednio!) a dla opcji typu „zawsze zalogowany” zapisałbym ciasteczka.
Hasło oczywiście kodowane szyfrem jednostronnym sha1 lub md5 (lub jedno z drugiego), a do tego sól – losowy ciąg znaków zapisany w bazie dla danego użytkownika (nawet jeśli ktoś odczytałby zaszyfrowane dane [tablice tęczowe czy coś…] to nie będzie posiadał hasła lecz jakiś ciąg hasła pomieszanego z tzw. solą).Michał Miszczyszyn edytował(a) ten post dnia 09.03.10 o godzinie 18:32

konto usunięte

Temat: problem z cannot modify header information

Cookie jest na maszynie użytkownika - może robić z nim co chce.

Sesji używasz to obsługi działającego użytkownika.
Cookie - do opcji 'zawsze zalogowany'/'zapamiętaj mnie' jak zwał tak zwał.

W ciacho możesz wrzucić: id użytkownika i klucz.
Sposób generowania klucza zależy tylko od twojej osobistej inwencji.
Tak samo zapis tego w cookies zależy tylko od ciebie.

W DB zapisujesz tylko, klucz, i że używa cookies.

Reszta z górki.

Najlepiej zrobić do tego klasę i mieć to z głowy :)Michał Wachowski edytował(a) ten post dnia 09.03.10 o godzinie 23:57
Bartłomiej Szczudło

Bartłomiej Szczudło Unix & Windows
Administrator

Temat: problem z cannot modify header information

Nie zapisywałbym user ID w cookie, zbyt łatwo go tam zmienić (np na "admin").
Jeśli nie ma jakiegoś konkretnego powodu na ustawianie cookie, proponuję w ogóle skorzystać tylko z sesji (w każdym pliku na początku session_start(), a user id pobierane tylko z $_SESSION['user_id'] które jest ustawiane podczas logowania).
PHP generuje tylko SessionID który może sobie siedzieć w cookie i nie musimy się nim w ogóle przejmować.
Michał Jastrzębski

Michał Jastrzębski Django-fu, phpjutsu,
sql-do

Temat: problem z cannot modify header information

Jednak trzymanie samego sessionID w cookie to dość niebezpieczna praktyka. Jeśli używasz opcji "zapamiętaj mnie", a klucz sesji będzie sobie siedział na serwerze, to można go bruteforceować. Zmiana na 'admin' nic nie da bo jak kolega imiennik napisał, będzie tam też klucz, którym może być np sha1 z timestampu logowania...jakakolwiek losowa wartość. Do tego zwykle dodaję też sprawdzanie user agenta, który jest zapisany na serwie np. w bazie danych. Generalnie jest parę zabezpieczeń przeciw włamaniom na sesję...ale trzymanie tylko sessionID jest ryzykowne. Do tego staram się unikać wysyłania zmiennych sesji na kompa klienta. Wolę trzymać je w db jeśli są jakkolwiek cenne.

Pozdrawiam!
Michał Jastrzębski

konto usunięte

Temat: problem z cannot modify header information

Bruteforsowanie 32-znakowego klucza sesji? Życzę powodzenia ;)

Ale zasadniczo zgadzam się z przedmówcą.

konto usunięte

Temat: problem z cannot modify header information

Krzysztof Rakowski:
Bruteforsowanie 32-znakowego klucza sesji? Życzę powodzenia ;)

Ale zasadniczo zgadzam się z przedmówcą.

"emacsem przez sendmaila" :D
Michał Jastrzębski

Michał Jastrzębski Django-fu, phpjutsu,
sql-do

Temat: problem z cannot modify header information

Da się;) po co kusić los? Przy obecnych mocach obliczeniowych parę tygodni i masz klucz, a z tego co zrozumiałem to sesja miałaby trwać tyle, ile uptime serwera, więc po co ryzykować że ktoś będzie zdesperowany?:)

ofc są lepsze sposoby na kradzież sesji;) to tylko dla naprawdę zdesperowanych.Michał Jastrzębski edytował(a) ten post dnia 10.03.10 o godzinie 17:01

konto usunięte

Temat: problem z cannot modify header information

Michał Jastrzębski:
Da się;) po co kusić los? Przy obecnych mocach obliczeniowych parę tygodni i masz klucz

Hm, mi wychodzi, że zakładając, iż będziemy sprawdzać milion kluczy na sekundę, zajmie nam to 10 kwadrylionów lat...

Następna dyskusja:

problem po grzebaniu w osco...




Wyślij zaproszenie do