[PHP] Geen sessie gevonden/beschikbaar

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Xanland
  • Registratie: Oktober 2007
  • Laatst online: 12-09 16:30
Dag geachte GoT'ters,

Op moment van schrijven en eerder ben ik met een eigen CMS bezig die gebruik maakt van PHP, SQL en bijbehoren om het te leren. Nu is er alleen een probleem met een aardig belangrijk iets, sessie's, gaanda..
Het werkte tto nu toe eigenlijk allemaal goed, maar mijn CMS zou naar mijn mening geen CMS zijn als je niet kon inloggen en dus registreren. Helaas werkt dat om de één of andere manier niet (meer).

Ik maak gewoon gebruik van de ingebouwde $_SESSION-dingen van PHP. Tot zover werken ze perfect, want onder andere maakt mijn config.php er gebruik van (denk aan db e.d.).

Mijn main-problem ligt nu bij het inloggen, dat wordt nu wordt aangeroepen door het Smarty-template systeem (denk aan bijv. {$login} 'functie'/variable). Het opbouwen van de template gaat perfect al zeg ik het zelf, tevens heb ik ook al veel zitten debuggen (denk aan phpinfo, print_r'en van de $_SESSION-variable etc. etc.) -alleen werkt de login-module niet mee (om het zo maar even te noemen) want die (her)kent vreemd genoeg geen sessie. Want hij wil gewoonweg geen sessie opzetten. En ja, er staat toch echt wel session_start() bovenaan de pagina, op beide zelfs. Dit omdat je invult op de pagina login.php en daarna geredirect wordt naar logining.php - alleen gaat het daar kennelijk ergens fout.

Alleen zijn er in de login.php geen sessie's aanwezig kennelijk, handmatig setten van een sessie werkt dan weer wel. Maar print_r ervan werkt dan weer niet, alleen als ik het niet in de login.php doe, of dus wel in logining.php (want hij wordt geïncluded) dan output hij netjes alles geset in de config e.d.

Tevens heb ik ook al de compiled-dir van smarty leeggegooid, maar dat heeft ook niet gewerkt. Daarbij staat error_reporting uiteraard aan en op het hoogste niveau.

Wat mis ik hier of wie of wie kan mij helpen?

RobIII: Ik probeer als ik wil stoppen met mijn auto ook altijd de sigarettenaansteker, de airco, 3 radioknoppen en de binnenverlichting en dan de rem :P


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Xanland schreef op zaterdag 13 maart 2010 @ 22:15:
Ik maak gewoon gebruik van de ingebouwde $_SESSION-dingen van PHP. Tot zover werken ze perfect, want onder andere maakt mijn config.php er gebruik van (denk aan db e.d.).
$_SESSION voor je db? :?
Dit omdat je invuld
invult

Zit alles op hetzelfde domein enzo? Je kunt eens kijken wat er allemaal over de lijn gaat (via sniffer of browser plugin), en wat er op de server wordt opgeslagen aan sessies.

Acties:
  • 0 Henk 'm!

  • Xanland
  • Registratie: Oktober 2007
  • Laatst online: 12-09 16:30
Gegevens om met de db te connecten.
[...]

invult

Zit alles op hetzelfde domein enzo? Je kunt eens kijken wat er allemaal over de lijn gaat (via sniffer of browser plugin), en wat er op de server wordt opgeslagen aan sessies.
Het hele CMS zit gewoon op hetzelfde (subdomein).

RobIII: Ik probeer als ik wil stoppen met mijn auto ook altijd de sigarettenaansteker, de airco, 3 radioknoppen en de binnenverlichting en dan de rem :P


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Xanland schreef op zaterdag 13 maart 2010 @ 22:36:
[...]
Gegevens om met de db te connecten.
Wat hebben die met de gebruiker te maken dan? :?

Acties:
  • 0 Henk 'm!

  • Xanland
  • Registratie: Oktober 2007
  • Laatst online: 12-09 16:30
Niks, maar op die manier heb ik de hele config global en wel aangezien die op verschillende plekken gebruikt worden. :)

RobIII: Ik probeer als ik wil stoppen met mijn auto ook altijd de sigarettenaansteker, de airco, 3 radioknoppen en de binnenverlichting en dan de rem :P


Acties:
  • 0 Henk 'm!

  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 11-09 23:46
Wat je kunt doen is even dit opnemen rond session_start();:

PHP:
1
2
3
echo('<pre>' . print_r($_SESSION,1));
session_start();
echo(print_r($_SESSION,1), '</pre>');

En dan kijken of ze verschillen.

[ Voor 7% gewijzigd door _eXistenZ_ op 13-03-2010 23:14 ]

There is no replacement for displacement!


Acties:
  • 0 Henk 'm!

  • Xanland
  • Registratie: Oktober 2007
  • Laatst online: 12-09 16:30
Voor het inloggen is het gewoon:
undefined
session_start
lege array

In zowel index.php als login.php

Maar na het inloggen krijg ik iets vreemds:
index.phplogin.php
undefinedundefined
array met naam, nick, emaillege array


En op de één of andere manier gaat daar dus iets fout. Heb tevens ook al naar PHPSESSID en Cookie's gekeken, maar in phpinfo (kopje: HTTP Headers Information - HTTP Request Headers) staat gewoon:
CookiePHPSESSID=480rc7c21rc923cd0nhdlk0f07

RobIII: Ik probeer als ik wil stoppen met mijn auto ook altijd de sigarettenaansteker, de airco, 3 radioknoppen en de binnenverlichting en dan de rem :P


Acties:
  • 0 Henk 'm!

  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 11-09 23:46
Doe es

test.php:
PHP:
1
2
3
session_start();
$_SESSION['test']= 'DitIseenTest';
header('location: test2.php');


test2.php:
PHP:
1
2
session_start();
die('Dit zit nu in de sessie:<br/><pre>' . print_r($_SESSION,1) . '</pre>');


en dan test.php openen in je browser. Wat zegtie dat in je session zit?

There is no replacement for displacement!


Acties:
  • 0 Henk 'm!

  • Xanland
  • Registratie: Oktober 2007
  • Laatst online: 12-09 16:30
Dit zit nu in de sessie:
code:
1
2
3
4
Array
(
    [test] => DitIseenTest
)
Als ik ingelogd ben staan er nog 3 andere dingen bij (en dat klopt). Maar als ik weer uitlog staat er alleen dat, wat volgens mij ook gewoon goed is! :)

RobIII: Ik probeer als ik wil stoppen met mijn auto ook altijd de sigarettenaansteker, de airco, 3 radioknoppen en de binnenverlichting en dan de rem :P


Acties:
  • 0 Henk 'm!

  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 11-09 23:46
Het ligt iig dus niet aan de inrichting van de server, maar aan je script. Als je er nog niet uit komt post de relevante delen maar, dan zal ik er naar kijken.

There is no replacement for displacement!


Acties:
  • 0 Henk 'm!

  • Peter
  • Registratie: Januari 2005
  • Laatst online: 13-09 17:10
Xanland schreef op zaterdag 13 maart 2010 @ 22:45:
Niks, maar op die manier heb ik de hele config global en wel aangezien die op verschillende plekken gebruikt worden. :)
Dat is natuurlijk een no-go voor sessies hé, hiermee komt je configuratie ook terecht in bestanden waar andere accounts- en mensen bijkunnen, uitgaande dat je op een shared server zit. Gebruik liever een classe voor configuratie.

Acties:
  • 0 Henk 'm!

  • Xanland
  • Registratie: Oktober 2007
  • Laatst online: 12-09 16:30
Mee eens inderdaad Peter, maar hij gaat naar een private server - hoewel ik inderdaad nog wel naar een andere manier wil kijken. Deze code is al wel zeer oud. :D

@_eXistenZ_: Ik ga gelukkig nog veel beveiliging toepassen, zoals salts en regelateerde dingen, alleen wil ik het eerst werkend hebben.

login.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
session_start();

if (!isset($_SESSION['login']))
{

    <form method="post" action="/logining.php">
        <table cellpadding="0" cellspacing="0" border="0" style="table-layout:fixed" width="225">
            <tr>
                <td width="75">Gebr.naam:</td>
                <td width="150" align="center"><input type="text" name="gebruikersnaam" size="15" maxlength="25" /></td>
            </tr>
            <tr>
                <td width="75">Wachtwoord:</td>
                <td width="230" align="center"><input type="password" name="wachtwoord" size="15" maxlength="25" /></td>
            </tr>
        </table>
        <p><br /></p>
        <input type="submit" value="Login" name="B1" />&nbsp;&nbsp;<input type="reset" value="Invoer wissen" name="B2" />
    </form>

}
else
{
    echo 'Welkom '.$_SESSION['login'];
    header('Location: ' . $_SERVER['HTTP_REFERER']);
    
    <form method="POST" action="/13/Loguit.html">
    <input type="submit" value="Loguit" name="B1">
    </form>
}
?>



logining.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
session_start();

include('includes/index.php');
include('functions/index.php');
include('functions/sitemenu.php');
include('template/smarty.php');
$smarty = new Smarty_xanlandCMS();

$pagina             = 'Login';
$salt             = 'jaj lollerz';
$gebruikersnaam  = $_POST['gebruikersnaam'];
$wachtwoord      = sha1($salt.md5($_POST['wachtwoord']));

$sql1 = 'SELECT * FROM users WHERE gebruikersnaam= \''.$gebruikersnaam.'\'';
$result1 = mysql_query($sql1);
$output1 = mysql_fetch_array($result1);
if ($output1['gebruikersnaam'] != $gebruikersnaam || $output1['wachtwoord'] != $wachtwoord)
{
    $inhoud = 'Je hebt een verkeerde gebruikersnaam/wachtwoord ingevuld<br>
    <a href="#back" onclick="history.go(-1)">Ga terug</a> om het opnieuw te proberen.';
}
else
{
    $_SESSION['login'] = $output1['gebruikersnaam'];
    $_SESSION['name'] = $output1['voornaam'].' '.$output1['achternaam'];
    $_SESSION['email'] = $output1['email'];
    header('Location: ' . $_SERVER['HTTP_REFERER']);
    $inhoud = 'Je bent nu ingelogd<br>
    <a href="' . $_SERVER['HTTP_REFERER'] . '">Klik hier</a> om terug te gaan naar waar je vandaan kwam.';
}

$smarty->assign('pagina', $pagina);
$smarty->assign('pagina2', $pagina);
$smarty->assign('inhoud', $inhoud);
$smarty->display('index.tpl');
?>



De kantjes klopen dan weer niet (figuurlijk hè ;)), maar <insert wat ik op regel 1 zei>.

RobIII: Ik probeer als ik wil stoppen met mijn auto ook altijd de sigarettenaansteker, de airco, 3 radioknoppen en de binnenverlichting en dan de rem :P


Acties:
  • 0 Henk 'm!

  • Tharulerz
  • Registratie: April 2009
  • Laatst online: 10-04 05:16
var_dump() van $output1 in de else aub?

Tips:

-SQL injection (google it)
- Doe geen SELECT * als je het niet nodig hebt, security wise, performance wise, en code wise (want nu zie je bijvoorbeeld de variabele namen niet die je gaat terugkrijgen zonder naar je tabel te gaan kijken).

Acties:
  • 0 Henk 'm!

  • Xanland
  • Registratie: Oktober 2007
  • Laatst online: 12-09 16:30
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
array(14) {
  [0]=>
  string(1) "2"
  ["user_id"]=>
  string(1) "2"
  [1]=>
  string(7) "Xanland"
  ["gebruikersnaam"]=>
  string(7) "Xanland"
  [2]=>
  string(6) "Xander"
  ["voornaam"]=>
  string(6) "Xander"
  [3]=>
  string(8) "Hoogland"
  ["achternaam"]=>
  string(8) "Hoogland"
  [4]=>
  string(15) "home@xanland.nl"
  ["email"]=>
  string(15) "home@xanland.nl"
  [5]=>
  string(40) "e8f190baa71d10b4ee98246b1a023e8ff2631404"
  ["wachtwoord"]=>
  string(40) "e8f190baa71d10b4ee98246b1a023e8ff2631404"
  [6]=>
  string(1) "2"
  ["level"]=>
  string(1) "2"
}
Is de output van var_dump ($output1);

- SQL weet ik, dat bedoelde ik ook met wat ik aan het begin van mijn vorige post zei. :D
- SELECT ga ik inderdaad meenemen, wel handig! :)

RobIII: Ik probeer als ik wil stoppen met mijn auto ook altijd de sigarettenaansteker, de airco, 3 radioknoppen en de binnenverlichting en dan de rem :P


Acties:
  • 0 Henk 'm!

  • Cascade
  • Registratie: Augustus 2006
  • Laatst online: 12-09 15:29
Paar dingen:
  • $_SERVER['HTTP_REFERER'] kan leeg zijn en is niet op te vertrouwen. Je kan daar zeker niet zomaar een redirect op doen.
  • output voor header gaat niet werken zoals nu in login.php, daar hoor je een foutmelding 'header already sent' voor te krijgen ipv de beoogde redirect.
  • ik zou verwachten dat HTML na een redirect met header( 'Location: ...' ) niet zichtbaar is. Krijg jij het wel te zien?
  • dubbel hashen van het wachtwoord is niet nodig, ik zou daar hash_hmac tegenaan gooien. Maar als het oude code is met bestaande gebruikers dan zit je redelijk vast aan dat sha1( $salt . md5($pass) ).
  • escape je gebruikersnaam/wachtwoord als je ze in de query gebruikt (mysql_real_escapestring) (maar dat moest nog, zei je al).
  • controleer de return waardes van mysql_connect / mysql_query / mysql_fetch_... e.d.
  • ipv mysql_fetch_array zou je mysql_fetch_array($result1,MYSQL_ASSOC) of mysql_fetch_assoc($result1) kunnen gebruiken voor een wat 'schonere' result set (niet belangrijk, wel prettig).
  • je gaat er nu van uit dat als $_SESSION['login'] ge-set is dat je ingelogd bent. Eigenlijk zou je moeten controleren of de session gehijacked is en of de logingegevens in de session wel kloppen (en dan niet door username + password of password zoals gehashed in je db er in op te slaan).
  • om uit te loggen moet je nog zorgen dat de logingegevens uit de session verwijderd worden. Gebeurt dat wel?
  • meteen aanleren om HTML opmaak netjes te doen (minimaal DOCTYPE + html/head/title/body).
Dat header('Location: ' . $_SERVER['HTTP_REFERER']); en output ervoor / erna zint me niet, ik zou dat als eerste bekijken. Zou best eens kunnen dat de session daardoor kapot gaat.

Acties:
  • 0 Henk 'm!

  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 11-09 23:46
In je loginscript zet je nergens $_SESSION['login'] waardoor ie altijd zal doen alsof je nog niet ingelogd bent en je de loginpagina laat zien...

Protip: classes.

There is no replacement for displacement!


Acties:
  • 0 Henk 'm!

  • Xanland
  • Registratie: Oktober 2007
  • Laatst online: 12-09 16:30
Die set ik in logining.php, waar de gegevens naar toe gestuurd worden. Het lijkt mij dan dat als ik daarna weer naar login.php ga dat ze dan (al) wel bekend zijn?

RobIII: Ik probeer als ik wil stoppen met mijn auto ook altijd de sigarettenaansteker, de airco, 3 radioknoppen en de binnenverlichting en dan de rem :P


Acties:
  • 0 Henk 'm!

  • Xanland
  • Registratie: Oktober 2007
  • Laatst online: 12-09 16:30
Klein bumpje/kickje! :+

RobIII: Ik probeer als ik wil stoppen met mijn auto ook altijd de sigarettenaansteker, de airco, 3 radioknoppen en de binnenverlichting en dan de rem :P

Pagina: 1