[PHP]Login script werkt, maar na een include niet meer

Pagina: 1
Acties:
  • 123 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Zjemm
  • Registratie: Februari 2001
  • Laatst online: 16:59
Ik heb het volgende probleem met een login script en het includen daarvan.

Ik heb een login.php file die als ik deze direct open in de browser, goed werkt.
maar als ik deze login.php include in de pagina waar ik hem wil hebben krijg ik onderstaande error's:

Warning: session_start(): Cannot send session cookie - headers already sent by (output started at c:\program files\easyphp1-8\www\main.php:9) in c:\program files\easyphp1-8\www\login.php on line 3

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at c:\program files\easyphp1-8\www\main.php:9) in c:\program files\easyphp1-8\www\login.php on line 3


ik heb al gezocht op deze error's en ook wel het een en ander gevonden maar nog niet de oplossing.
ik heb begrepen dat er al output (header) is verzonden voordat het script wordt uitgevoerd en dat niet kan. Een oplossing hiervoor is ervoor te zorgen dat er niets voordat het script word uitgevoerd verzonden wordt. De enige manier in mijn ogen is door het script bovenaan het .php document te plaatsen (en dat werkt dan ook) maar dan staat het login form dus niet meer op de juiste plaats

Hieronder de code:

login.php

<?php
//login.php
session_start();
require('functions.php');

if($_SERVER['REQUEST_METHOD']=='POST')
{
if(FALSE!==($rDbConn=connectdb()))
{
$sQuery='SELECT id FROM users WHERE username="'.$_POST['username'].'" AND password="'.md5($_POST['password']).'"';
if(!$rResult=mysql_query($sQuery,$rDbConn))
{
echo 'Hey een foutmelding: '.mysql_error($rDbConn).'<BR>'.$sQuery;
}
else
{
if(mysql_num_rows($rResult)==0)
{
echo 'Gebruikersnaam en wachtwoord horen niet bij elkaar.';
}
else
{
//En dan komt hier het loginverhaal
//willekeurige string maken
$sValidate=md5(rand(0,99999));

//cookies setten voor 7dagen
$iUserId=mysql_result($rResult,0,'id');
setcookie('validate',$sValidate,time()+60*60*24*7,'/','localhost');
setcookie('user_id',$iUserId,time()+60*60*24*7,'/','localhost');

//de gegevens in de tabel zetten
$sQuery='REPLACE INTO logins (tijdstip, validate, user_id, client_ip)
VALUES (NOW(), "'.$sValidate.'", '.$iUserId.', "'.$_SERVER['REMOTE_ADDR'].'")';
if(!mysql_query($sQuery,$rDbConn))
{
echo 'Hey een foutmelding: '.mysql_error($rDbConn).'<BR>'.$sQuery;
}

//de sessie gegevens schrijven
$_SESSION['user_id']=$iUserId;
$_SESSION['ingelogd']=TRUE;
$_SESSION['client_ip']=$_SERVER['REMOTE_ADDR'];

//doorsturen naar de volgende pagina
header('location: secure.php');
}
}
mysql_close($rDbConn);
}
}
else
{
//het formulier (zonder te letten op HTML-standaarden):
echo '<FORM NAME="inlogform" METHOD="post" ACTION="'.$_SERVER['PHP_SELF'].'">
Login: <INPUT TYPE="text" NAME="username" SIZE="10"><BR>
Passw: <INPUT TYPE="password" NAME="password" SIZE="10"><BR><BR>
<INPUT TYPE="submit" VALUE="Login"></FORM>';
}
?>





infomenu.php

<div id="infomenu">
infomenu
<?php include("login.php"); ?>
</div>


Heeft iemand hier een idee over om dit op te lossen?

opensecure.nl


Acties:
  • 0 Henk 'm!

  • Justifier
  • Registratie: December 2004
  • Laatst online: 06-04-2024
Dit kan waarschijnlijk niet maar ik kan niet ruiken wat er op function.php staat dus die moet je ook even posten. of je hebt twee keer session_start gedaan.
//doorsturen naar de volgende pagina
header('location: secure.php');

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Probeer te begrijpen wat er gebeurt. Voor sessions heb je een cookie nodig die moet worden verstuurd. Je script moet dit dus al redelijk vroeg afhandelen. Laat er nu niet 1 regel in je script verantwoordelijk zijn voor die afhandeling, en laat dat nu nou net de enige regel zijn die voor je andere output moet staan....


----
Blacksnak schreef op maandag 16 januari 2006 @ 15:37:
Dé oplossing voor jouw probleem is om het script zo te schrijven dat er pas output komt nadat alle php-code is uitgevoerd (eventuele output opvangen in een variabele en deze later effectief afdrukken).
Niet alle code. Alleen die code die graag nog ff aan de header wil sleutelen voordat deze verstuurd is.

[ Voor 41% gewijzigd door Janoz op 16-01-2006 15:43 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Blacksnak
  • Registratie: Oktober 2001
  • Laatst online: 07-07-2024
Dé oplossing voor jouw probleem is om het script zo te schrijven dat er pas output komt nadat alle php-code is uitgevoerd (eventuele output opvangen in een variabele en deze later effectief afdrukken).
Janoz schreef op maandag 16 januari 2006 @ 15:34:
Niet alle code. Alleen die code die graag nog ff aan de header wil sleutelen voordat deze verstuurd is.
Weet ik. Ik vind het alleen mooier om de code zoveel mogelijk gescheiden te houden van het output-gedeelte. Wordt anders altijd zo'n puinhoop :)

[ Voor 48% gewijzigd door Blacksnak op 16-01-2006 15:51 ]


Acties:
  • 0 Henk 'm!

  • Pete
  • Registratie: November 2005
  • Laatst online: 07-09 17:51
Dus je moet de sessionstart ook voor de htmloutput starten dus
infomenu.php

PHP:
1
2
3
4
5
<?php session_start(); ?>
<div id="infomenu">
infomenu
<?php include("login.php"); ?>
</div>


en dan de session_start() uit de login.php verwijderen

[ Voor 16% gewijzigd door Pete op 16-01-2006 20:52 ]

petersmit.eu


Acties:
  • 0 Henk 'm!

  • _Sunnyboy_
  • Registratie: Januari 2003
  • Laatst online: 19-09 14:58

_Sunnyboy_

Mooooooooooooooooo!

-

[ Voor 100% gewijzigd door _Sunnyboy_ op 16-01-2006 15:41 ]

Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life


Acties:
  • 0 Henk 'm!

  • ramonp
  • Registratie: Januari 2001
  • Laatst online: 19-09 10:35
phsmit schreef op maandag 16 januari 2006 @ 15:37:
Dus je moet de sessionstart ook voor de htmloutput starten dus
infomenu.php

code:
1
2
3
4
5
<?php session_start(); ?>
<div id="infomenu">
infomenu
<?php include("login.php"); ?>
</div>


en dan de session_start() uit de login.php verwijderen
en je moet ook eerst setcookie uitvoeren voor er html output wordt verstuurd.
PHP:
1
2
3
4
5
6
7
<?php
session_start();
include("login.php");
?>
<div id="infomenu">
infomenu
</div>


Zie hier http://nl2.php.net/manual/nl/function.setcookie.php

[ Voor 28% gewijzigd door ramonp op 16-01-2006 15:49 ]


Acties:
  • 0 Henk 'm!

  • Pete
  • Registratie: November 2005
  • Laatst online: 07-09 17:51
You're right

dan moet echter het output-gedeelte van het script wel uitgesplitst worden, want nu word het loginbalkje op de verkeerde plek neergezet

petersmit.eu


Acties:
  • 0 Henk 'm!

  • Zjemm
  • Registratie: Februari 2001
  • Laatst online: 16:59
Oke rustig aan (thnx voor de reeks reacties die jullie geven) ik zal dit even rustig bekijken (heb er even de tijd voor nodig omdat ik nog niet heel lang met deze zaken bezig ben.

iig thnx....als ik er nog niet uit kom dan kom ik er op terug

opensecure.nl


Acties:
  • 0 Henk 'm!

  • Zjemm
  • Registratie: Februari 2001
  • Laatst online: 16:59
nog even voor de volledigheid

functions.php

<?php
//functions.php
function connectdb()
{
//inloggegevens van de database
$sHost='localhost';
$sUser='root';
$sPass='test';
$sDb='LoginDB';

if(!$rDbConn=mysql_connect($sHost,$sUser,$sPass))
{
echo 'Kon niet verbinden met de databaseserver';
return FALSE;
}
else
{
if(!mysql_select_db($sDb,$rDbConn))
{
echo 'Kon de database niet selecteren';
return FALSE;
}
}
return $rDbConn;
}

function check_login($rDbConn)
{
$bLogin=FALSE;

if(empty($_SESSION['ingelogd']))
{
//niet aangemeld volgens sessie, wel volgens db?
if(isset($_COOKIE['user_id']) && isset($_COOKIE['validate']) &&
strlen($_COOKIE['validate'])==32 && preg_match('/^[0-9]{1,8}$/',$_COOKIE['user_id']))
{
//de cookies bestaan en zijn geldig, kijken in de db
$sQuery='SELECT COUNT(*) FROM logins
WHERE user_id='.$_COOKIE['user_id'].' AND validate="'.$_COOKIE['validate'].'"
AND client_ip="'.$_SERVER['REMOTE_ADDR'].'"
AND tijdstip>DATE_SUB(NOW(),INTERVAL 7 DAY)';
if(!$rResult=mysql_query($sQuery,$rDbConn))
{
echo 'Hey een foutmelding: '.mysql_error($rDbConn).'<BR>'.$sQuery;
}
else
{
if(mysql_num_rows($rResult)==1)
{
//volgens db al geldig ingelogd
$bLogin=TRUE;

//de sessie gegevens schrijven
$_SESSION['ingelogd']=TRUE;
$_SESSION['client_ip']=$_SERVER['REMOTE_ADDR'];
$_SESSION['user_id']=$_COOKIE['user_id'];

//willekeurige string maken
$sValidate=md5(rand(0,99999));

//cookies setten voor 7dagen
setcookie('validate',$sValidate,time()+60*60*24*7,'/','localhost');
setcookie('user_id',$_SESSION['user_id'],time()+60*60*24*7,'/','localhost');

//de gegevens in de tabel zetten
$sQuery='REPLACE INTO logins (tijdstip, validate, user_id, client_ip)
VALUES (NOW(), "'.$sValidate.'", '.$_SESSION['user_id'].', "'.$_SERVER['REMOTE_ADDR'].'")';
if(!mysql_query($sQuery,$rDbConn))
{
echo 'Hey een foutmelding: '.mysql_error($rDbConn).'<BR>'.$sQuery;
}

//deze functie behandel ik straks
clean_up($rDbConn);

return $bLogin;
}
}
}
}
elseif(isset($_SESSION['client_ip']) && $_SESSION['client_ip']==$_SERVER['REMOTE_ADDR']
&& isset($_SESSION['user_id']) && preg_match('/^[0-9]{1,8}$/',$_SESSION['user_id'])
&& isset($_SESSION['ingelogd']) && $_SESSION['ingelogd']===TRUE)
{
return TRUE;
}
return FALSE;
}

function clean_up($rDbConn,$iUserId=0)
{
if(empty($iUserId))
{
//er werd geen userID meegegeven, dus algemene opruiming?
if(rand(1,500)==1)
{
//alle rijen ouder dan een maand wissen
$sQuery='DELETE FROM logins WHERE tijdstip<DATE_SUB(NOW(),INTERVAL 1 MONTH)';
if(!mysql_query($sQuery,$rDbConn))
{
echo 'Hey een foutmelding: '.mysql_error($rDbConn).'<BR>'.$sQuery;
}
}
}
elseif(preg_match('/^[0-9]{1,8}$/',$iUserId))
{
//er werd een userID meegegeven, wissen dat kreng
$sQuery='DELETE FROM logins WHERE user_id='.$iUserId;
if(!mysql_query($sQuery,$rDbConn))
{
echo 'Hey een foutmelding: '.mysql_error($rDbConn).'<BR>'.$sQuery;
}
}
}
?>

opensecure.nl


Acties:
  • 0 Henk 'm!

  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 14:41

Salandur

Software Engineer

offtopic:
gebruik een [ code=php ] tags om je code en spring een beetje in. dat maakt de code wat leesbaarder

Assumptions are the mother of all fuck ups | iRacing Profiel


Acties:
  • 0 Henk 'm!

  • Zjemm
  • Registratie: Februari 2001
  • Laatst online: 16:59
phsmit schreef op maandag 16 januari 2006 @ 16:00:
You're right

dan moet echter het output-gedeelte van het script wel uitgesplitst worden, want nu word het loginbalkje op de verkeerde plek neergezet
precies als ik het zo voor elkaar speel dat ik de error's dus niet meer krijg door de hele handel boven aan te zetten dan staat dus met login formpje helemaal boven aan de pagina inplaans van in de pagina

opensecure.nl


Acties:
  • 0 Henk 'm!

  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 14:41

Salandur

Software Engineer

je moet de login-check bovenin de pagina doen zoals je nu doet en het weergeven even verplaatsen naar een functie.

zoiets wordt het dan:
PHP:
1
2
3
4
5
6
7
8
<?
include("login.php");
?>
<div>
<?
maakLoginFormulier();
?>
</div>


In login.php hou je dan bij of iemand goed is ingelogd en dus het formuilier weer moet geven of iets anders.

Assumptions are the mother of all fuck ups | iRacing Profiel


Acties:
  • 0 Henk 'm!

  • TRON
  • Registratie: September 2001
  • Laatst online: 16-09 13:13
Kijk ook eens naar ob_start() en ob_flush() :)

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


Acties:
  • 0 Henk 'm!

  • Equator
  • Registratie: April 2001
  • Laatst online: 09-09 15:29

Equator

Crew Council

#whisky #barista

als session.auto_start aanstaat in php.ini hoef je geen session_start() meer aan te roepen.
Das was bij mij het probleem.
Dus of je zet die setting op 0 (danwel via ini_set of in het daadwerkelijk file alhoewel ik er voor ben om ini_set te gebruiken) of roep session_start() niet meer aan want dat is niet meer nodig.

kijk naar de output van
PHP:
1
echo ini_get("session.auto_start");

om te achterhalen wat de ingestelde waarde is.
Janoz schreef op maandag 16 januari 2006 @ 15:34:
Probeer te begrijpen wat er gebeurt. Voor sessions heb je een cookie nodig die moet worden verstuurd. Je script moet dit dus al redelijk vroeg afhandelen. Laat er nu niet 1 regel in je script verantwoordelijk zijn voor die afhandeling, en laat dat nu nou net de enige regel zijn die voor je andere output moet staan....
Cookies zijn niet per definitie nodig voor een session.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Dan zou ik nog maar eens doornemen hoe sessions werken. De foutmelding komt juist omdat session_start een cookie header toe wil voegen met hierin de session ID.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Even offtopic, maar toch
PHP:
1
2
3
4
5
if ($posting_code == true) {
  $use_tags = true;
  $message = "[php]" . strip_useless_code($jouw_code_hier) . "[/php]";
  post_message($message);
}

[ Voor 24% gewijzigd door MueR op 16-01-2006 20:44 ]

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
offtopic:
Ik ken dat script, staat ergens op phpfreakz geloof ik

March of the Eagles


Acties:
  • 0 Henk 'm!

  • Zjemm
  • Registratie: Februari 2001
  • Laatst online: 16:59
klopt goed gezien. de meeste scripts die je ziet krijgen nogal negatief commentaar kwa veiligheid ed.
bij de viel dat wel mee. ik ga er gemakshalve dan ook even van uit dat deze redelijk veilig is.

opensecure.nl


Acties:
  • 0 Henk 'm!

  • Zjemm
  • Registratie: Februari 2001
  • Laatst online: 16:59
ben ik nou blind?

<?php
echo '<div id="menu">menu';
echo '<ul>';
echo '<li><a href="main.php?id=downloads">Downloads</a></li>';
echo '<li><a href="main.php">Home</a></li>';
if(isset($_SESSION['user_id'] || $_COOKIE['user_id'])) {
echo '<li><a href="main.php?id=downloads">Downloads</a></li>';
echo '<li><a href="main.php">Home</a></li>';
}
echo '</div>';
?>


Parse error: parse error, expecting "," or ")" in ....... on line 6


ik mis volgens mij helemaal geen komma of haakje-sluiten?

opensecure.nl


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Zjemm schreef op donderdag 19 januari 2006 @ 12:48:
ben ik nou blind?

PHP:
1
2
3
4
5
6
7
8
9
10
11
<?php
echo    '<div id="menu">menu';
echo    '<ul>';
echo    '<li><a href="main.php?id=downloads">Downloads</a></li>';
echo    '<li><a href="main.php">Home</a></li>';
if(isset($_SESSION['user_id'] || $_COOKIE['user_id'])) { 
  echo  '<li><a href="main.php?id=downloads">Downloads</a></li>';
  echo  '<li><a href="main.php">Home</a></li>';
} 
echo    '</div>';
?>


Parse error: parse error, expecting "," or ")" in ....... on line 6


ik mis volgens mij helemaal geen komma of haakje-sluiten?
sinds wanneer kan je een || gebruiken om meerdere variabelen te checken met isset ;)

offtopic:
gebruik eens [php]-tags ipv [b] ;)

Acties:
  • 0 Henk 'm!

  • iH8
  • Registratie: December 2001
  • Laatst online: 17-06-2024

iH8

Zjemm, zou je alsjeblieft je code tussen de geschikte tags willen plaatsen?

code:
1
2
3
4
5
[php]
<? php
...
?>
[/php]

wordt;
PHP:
1
2
3
<? php
...
?>


dat leest stukken fijner. je zou ook eens kunnen zoeken op code identing/inspringen. je code is echt niet lekker leesbaar.

[ Voor 14% gewijzigd door iH8 op 19-01-2006 12:59 ]

Aunt bunny is coming to get me!


Acties:
  • 0 Henk 'm!

  • Zjemm
  • Registratie: Februari 2001
  • Laatst online: 16:59
Erkens schreef op donderdag 19 januari 2006 @ 12:53:
[...]

sinds wanneer kan je een || gebruiken om meerdere variabelen te checken met isset ;)

offtopic:
gebruik eens [php]-tags ipv [b] ;)
niet dan? heb het me laten vertellen van wel...... hoe zou je het dan wel moeten doen?

opensecure.nl


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

isset verwacht een variabele, niet een boolean resultaat van een expressie. Wat jij daar doet is het resultaat van de expressie " $_SESSION['user_id'] || $_COOKIE['user_id'] " bepalen en dit vervolgens meegeven met isset. Wat jij wilt is kijken of elk van deze variabelen geset is en vervolgens die resultaten in een booleaanse expressie opnemen.

In principe is dit gewoon standaard programmeer kennis. Ik raad je dan ook aan om je eens iets meer hierin te verdiepen. Wanneer je dit doorneemt en ook allemaal begrijpt ben je alvast een heel eind.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Zjemm
  • Registratie: Februari 2001
  • Laatst online: 16:59
dus dan zou het iets als

if(isset($_SESSION['user_id']) || (isset($_COOKIE['user_id']) {


moeten worden?

opensecure.nl


Acties:
  • 0 Henk 'm!

  • Brecht Laitem
  • Registratie: November 2005
  • Laatst online: 07-06-2024
Zjemm schreef op donderdag 19 januari 2006 @ 16:00:
dus dan zou het iets als

if(isset($_SESSION['user_id']) || (isset($_COOKIE['user_id']) {


moeten worden?
nee :)
PHP:
1
if(isset($_SESSION['user_id']) || isset($_COOKIE['user_id'])) {

Je had een haakje verkeerd geplaatst

Acties:
  • 0 Henk 'm!

  • Zjemm
  • Registratie: Februari 2001
  • Laatst online: 16:59
ik zie het nu jah thnx

ik heb nu geen foutmeldingen meer. echter gaat er nog wel iets fout.

PHP:
1
2
3
4
5
6
7
8
9
10
11
<?php 
echo    '<div id="menu">menu'; 
echo    '<ul>'; 
echo    '<li><a href="main.php?id=downloads">Downloads</a></li>'; 
echo    '<li><a href="main.php">Home</a></li>'; 
                 if(isset($_SESSION['user_id']) || isset($_COOKIE['user_id'])) {
echo    '<li><a href="main.php?id=downloads">Downloads</a></li>'; 
echo    '<li><a href="main.php">Home</a></li>'; 
                 }  
echo    '</div>'; 
?>



ik krijg mijn extra menu opties er niet bij als ik ingelogt ben (cookie)
de cookie staat er wel degelijk

doe ik nog iets fout? of is dat moeilijk te beoordelen met alleen deze informatie?

opensecure.nl


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Gebruik aub indenting. Dit leest vervelend. Regel 7 en 8 moeten dus 1 stukje meer ingegesprongen zijn dan de if statement.

Verder kan je tijdens het debuggen de functie print_r($eenArray) voor bijvoorbeeld die $_SESSION en $_COOKIE gebruiken, dan zie je wat er echt in zit. :)

Overigens sluit je nergens je <ul> af. ;)

[ Voor 8% gewijzigd door Voutloos op 19-01-2006 19:56 ]

{signature}

Pagina: 1