Lid |
|
In mijn code wordt de naam geïmporteerd met de volgende code:
<?= $_SESSION['suser'] ?>
<?= $_SESSION['suser'] ?>
Boven aan elke pagina dat de gebruikersnaam weergeeft staat de volgende code:
<?php
require("connect.php");
requite("session.php");
?>
<?php require("connect.php"); requite("session.php"); ?>
Dit betekend dus dat, om erachter te komen wat de gebruikersnaam is, hij eerst verbinding zoekt met de database (uiteraard). Wanneer ik kijk in dit bestand kom ik dit tegen:
<?php
// Uiteraard heb ik mijn wachtwoord etc. hieruit weggelaten.
$host = "[...]";
$user = "[...]";
$pass = "[...]";
$dbas = "[...]";
if(mysql_connect($host, $user, $pass)) {
mysql_select_db($dbas) or die(mysql_error());
} else {
echo "Failed to connect to database.";
exit;
}
?>
<?php // Uiteraard heb ik mijn wachtwoord etc. hieruit weggelaten. $host = "[...]"; $user = "[...]"; $pass = "[...]"; $dbas = "[...]"; } else { echo "Failed to connect to database."; } ?>
In het bestand connect.php wordt er letterlijk alleen maar verbinding gemaakt met de database. Voor de rest valt er op de pagina met de geïmporteerde gebruikersnaam geen PHP te vinden. Session.php is dus toch wat ik nodig heb om erachter te komen wat ik moet aanpassen.
session.php (origineel)
<?php
session_start(); // start een sessie of zet een sessie voort
// als de gebruiker is ingelogd
if(isset($_SESSION['suser'])) {
// het volgende timeout deel is optioneel - dit mag worden weggelaten
// * timeout gedeelte *
$now = time();
// als er meer tijd is verstreken dan smaxidle
// sinds het aanmaken van de sessie
if($now - $_SESSION['stime'] > $_SESSION['smaxidle']) {
// breek de sessie af, de gebruiker dient opnieuw in te loggen
$_SESSION = array();
session_destroy();
} else {
// ververs anders de sessietijd. Dit zorgt er voor
// dat de gebruiker ingelogd blijft zolang deze actief is.
$_SESSION['stime'] = $now;
}
// * einde timeout gedeelte *
// v1.2 extra functionaliteit, onthouden login
} elseif(isset($_COOKIE['login_cookie'])) {
// bekijk de waarden van de cookie en als deze kloppen met de database - start alsnog een sessie
// aanname - er is een verbinding met de database
list($id, $wacht) = split(";", $_COOKIE['login_cookie']);
$res = mysql_query("SELECT id, pass, level, last_ip FROM users WHERE id='".$id."'") or die(mysql_error());
if(mysql_num_rows($res) > 0) {
$row = mysql_fetch_assoc($res);
if(!strcmp($wacht, $row['pass']) && $_SERVER['REMOTE_ADDR'] == $row['last_ip']) {
// init session
$_SESSION['suser'] = $naam;
$_SESSION['slevel'] = $row['level'];
$_SESSION['stime'] = time();
$_SESSION['smaxidle'] = 60 * 60;
// update cookie
// gebruik hierbij wederom het id en het versleutelde wachtwoord
setcookie("login_cookie", $id.";".$wacht, time()+3600*24*31*2, "/");
} else {
// password of ip komt niet overeen - unset het cookie en beeindig de sessie
setcookie("login_cookie", "", time(), "/");
$_SESSION = array();
session_destroy();
}
// geef resultaten vrij
unset($row);
mysql_free_result($res);
} else {
// gebruiker onbekend, cookie vervalst ?
$_SESSION = array();
session_destroy();
}
// ververs de pagina
header("Location: ".$_SERVER['REQUEST_URI']);
}
?>
<?php // als de gebruiker is ingelogd if(isset($_SESSION['suser'])) { // het volgende timeout deel is optioneel - dit mag worden weggelaten // * timeout gedeelte * // als er meer tijd is verstreken dan smaxidle // sinds het aanmaken van de sessie if($now - $_SESSION['stime'] > $_SESSION['smaxidle']) { // breek de sessie af, de gebruiker dient opnieuw in te loggen } else { // ververs anders de sessietijd. Dit zorgt er voor // dat de gebruiker ingelogd blijft zolang deze actief is. $_SESSION['stime'] = $now; } // * einde timeout gedeelte * // v1.2 extra functionaliteit, onthouden login } elseif(isset($_COOKIE['login_cookie'])) { // bekijk de waarden van de cookie en als deze kloppen met de database - start alsnog een sessie // aanname - er is een verbinding met de database list($id, $wacht) = split(";", $_COOKIE['login_cookie']); if(!strcmp($wacht, $row['pass']) && $_SERVER['REMOTE_ADDR'] == $row['last_ip']) { // init session $_SESSION['suser'] = $naam; $_SESSION['slevel'] = $row['level']; $_SESSION['stime'] = time(); $_SESSION['smaxidle'] = 60 * 60; // update cookie // gebruik hierbij wederom het id en het versleutelde wachtwoord setcookie("login_cookie", $id.";".$wacht, time()+3600*24*31*2, "/"); } else { // password of ip komt niet overeen - unset het cookie en beeindig de sessie } // geef resultaten vrij } else { // gebruiker onbekend, cookie vervalst ? } // ververs de pagina header("Location: ".$_SERVER['REQUEST_URI']); } ?>
Na even de code te hebben doorgelezen, heb ik het volgende stukje gevonden:
// geef resultaten vrij
unset($row);
mysql_free_result($res);
Wat ik denk dat er gebeurt is dat hij nu de gegevens van $res vrijgeeft die komen van de MySQL tabellen. En ik denk dan ook dat ik iets moet aanpassen in die rij!
Ik heb 'mail, ' er maar bij gezet (regel 26).
Ik heb het nu ook nog even nagekeken. Alle code klopt. Maar zelfs wanneer ik deze code gebruik:
<?php
// include/require hier evt nog andere zaken
require ("connect.php");
// we willen op deze pagina gebruik maken van beveiliging mbv sessies,
// dus includen (requiren) we session.php
require("session.php");
?>
<html>
<head>
<title>sessies · voorbeeld</title>
</head>
<body>
<?php
/*
we gaan hier kijken of de gebruiker is ingelogd, en welk
user level de gebruiker heeft. Op grond daarvan laten we
bepaalde delen al dan niet zien.
Een gebruikerslevel is een getal wat aangeeft hoeveel
"macht" je hebt. Vaak is het zo: hoe hoger het getal, hoe
meer je mag.
bijvoorbeeld:
Voor een bepaalde bewerking heb je gebruikers-
niveau 1 nodig, maar voor een andere bewerking heb je niveau
2 nodig. Een gebruiker die beide bewerkingen mag uitvoeren
heeft gebruikersniveau 1+2 = 3. MAAR: Een gebruiker die om
een of andere reden alleen de tweede bewerking mag uitvoeren
heeft gebruikersniveau 0+2 = 2. Dus je telt de nummers die
bij bepaalde rechten horen bij elkaar op.
Het nummer dat het recht geeft op een bepaalde bewerking is
altijd een macht van 2.
bijvoorbeeld:
recht #1 (bv inloggen) heeft gebruikers niveau 2^0 = 1
recht #2 (bv je eigen info veranderen) heeft gebr. niveau 2^1 = 2
recht #3 (bv nieuws toevoegen) heeft gebruikers niveau 2^2 = 4
recht #4 (bv members toevoegen) heeft gebruikersniveau 2^3 = 8
enz.
Iemand die al deze bewerkingen mag uitvoeren heeft dus
gebruikersniveau 1+2+4+8 = 15 (of 2^4 - 1)
Iemand die alleen recht #1 en recht #3 heeft, heeft
dus gebruikersniveau 1+4 = 5
*/
// controle op ingelogd zijn:
if(isset($_SESSION['suser'])) {
?>
user <b><?= $_SESSION['suser'] ?></b> is logged in.<br />
<?php
/*
vervolgens kijken we naar het userlevel, we vergelijken
bitsgewijs het gebruikerslevel - dit doen we met behulp van
een enkele '&' (de bitwise comparator)
*** LET OP ***
Enkel controleren met & is niet genoeg !
Stel dat je level 9 moet hebben voor een bepaalde bewerking, en je hebt
maar level 1. 1 & 9 is gelijk aan 1, en dan zou if(1 & 9) { ... } true opleveren
Je moet dus expliciet controleren of je level hoog genoeg is.
*/
if(($_SESSION['slevel'] & 1) == 1) {
// voer code uit behorend bij recht #1
?>
Je hebt recht #1.<br />
<?php
} else {
// geef een melding dat je de acties
// behorend bij recht #1 niet mag uitvoeren
?>
Je hebt recht #1 NIET.<br />
<?php
}
if(($_SESSION['slevel'] & 2) == 2) {
// voer code uit behorend bij recht #2
?>
Je hebt recht #2.<br />
<?php
} else {
?>
Je hebt recht #2 NIET.<br />
<?php
}
if(($_SESSION['slevel'] & 4) == 4) {
// voer code uit behorend bij recht #3
?>
Je hebt recht #3.<br />
<?php
} else {
?>
Je hebt recht #3 NIET.<br />
<?php
}
if(($_SESSION['slevel'] & 8) == 8) {
// voer code uit behorend bij recht #4
?>
Je hebt recht #4.<br />
<?php
} else {
?>
Je hebt recht #4 NIET.<br />
<?php
}
// et cetera
?>
<a href="logout.php">uitloggen</a><br />
<?php
} else {
?>
Je bent op dit moment niet ingelogd.<br />
<a href="login.php">inloggen</a><br />
<?php
}
?>
</body>
</html>
<?php // include/require hier evt nog andere zaken require ("connect.php"); // we willen op deze pagina gebruik maken van beveiliging mbv sessies, // dus includen (requiren) we session.php require("session.php"); ?> <html> <head> <title>sessies · voorbeeld</title> </head> <body> <?php /* we gaan hier kijken of de gebruiker is ingelogd, en welk user level de gebruiker heeft. Op grond daarvan laten we bepaalde delen al dan niet zien. Een gebruikerslevel is een getal wat aangeeft hoeveel "macht" je hebt. Vaak is het zo: hoe hoger het getal, hoe meer je mag. bijvoorbeeld: Voor een bepaalde bewerking heb je gebruikers- niveau 1 nodig, maar voor een andere bewerking heb je niveau 2 nodig. Een gebruiker die beide bewerkingen mag uitvoeren heeft gebruikersniveau 1+2 = 3. MAAR: Een gebruiker die om een of andere reden alleen de tweede bewerking mag uitvoeren heeft gebruikersniveau 0+2 = 2. Dus je telt de nummers die bij bepaalde rechten horen bij elkaar op. Het nummer dat het recht geeft op een bepaalde bewerking is altijd een macht van 2. bijvoorbeeld: recht #1 (bv inloggen) heeft gebruikers niveau 2^0 = 1 recht #2 (bv je eigen info veranderen) heeft gebr. niveau 2^1 = 2 recht #3 (bv nieuws toevoegen) heeft gebruikers niveau 2^2 = 4 recht #4 (bv members toevoegen) heeft gebruikersniveau 2^3 = 8 enz. Iemand die al deze bewerkingen mag uitvoeren heeft dus gebruikersniveau 1+2+4+8 = 15 (of 2^4 - 1) Iemand die alleen recht #1 en recht #3 heeft, heeft dus gebruikersniveau 1+4 = 5 */ // controle op ingelogd zijn: if(isset($_SESSION['suser'])) { ?> user <b><?= $_SESSION['suser'] ?></b> is logged in.<br /> <?php /* vervolgens kijken we naar het userlevel, we vergelijken bitsgewijs het gebruikerslevel - dit doen we met behulp van een enkele '&' (de bitwise comparator) *** LET OP *** Enkel controleren met & is niet genoeg ! Stel dat je level 9 moet hebben voor een bepaalde bewerking, en je hebt maar level 1. 1 & 9 is gelijk aan 1, en dan zou if(1 & 9) { ... } true opleveren Je moet dus expliciet controleren of je level hoog genoeg is. */ if(($_SESSION['slevel'] & 1) == 1) { // voer code uit behorend bij recht #1 ?> Je hebt recht #1.<br /> <?php } else { // geef een melding dat je de acties // behorend bij recht #1 niet mag uitvoeren ?> Je hebt recht #1 NIET.<br /> <?php } if(($_SESSION['slevel'] & 2) == 2) { // voer code uit behorend bij recht #2 ?> Je hebt recht #2.<br /> <?php } else { ?> Je hebt recht #2 NIET.<br /> <?php } if(($_SESSION['slevel'] & 4) == 4) { // voer code uit behorend bij recht #3 ?> Je hebt recht #3.<br /> <?php } else { ?> Je hebt recht #3 NIET.<br /> <?php } if(($_SESSION['slevel'] & 8) == 8) { // voer code uit behorend bij recht #4 ?> Je hebt recht #4.<br /> <?php } else { ?> Je hebt recht #4 NIET.<br /> <?php } // et cetera ?> <a href="logout.php">uitloggen</a><br /> <?php } else { ?> Je bent op dit moment niet ingelogd.<br /> <a href="login.php">inloggen</a><br /> <?php } ?> </body> </html>
en dan bij regel 46 dit erbij zet:
<?= $_SESSION['smail'] ?>
<?= $_SESSION['smail'] ?>
lukt het niet.
(PS: Ik heb ook nog bij 'session.php' geprobeert dit:
$_SESSION['smail'] = $mail;
$_SESSION['smail'] = $mail;
te plaatsen na regel 31 (regel 32, dus). Maar dat werkt niet.)
Conclusie: Ik heb nu werkelijk geen idee wat te doen.
----
----
EDIT!
Na nog eens even de code goed te hebben bekeken, ben ik erachter gekomen dat alle informatie van de gebruiker wordt geïmporteerd uit de database van het ID dat gelijk is aan het ID van de ingelogde gebruiker. Dus als de ingelogde gebruiker bijvoorbeeld "$id = 1" heeft, worden alle gegevens (gebruikersnaam, wachtwoord etc.) naar binnen gebracht.
Het stuk code dat dit doet?
$res = mysql_query("SELECT id, pass, level, last_ip FROM users WHERE id='".$id."'") or die(mysql_error());
Even in het Nederlands: Haal de volgende gegevens uit de database waarmee ik ben verbonden uit tabel 'users': id, pass, level, last_ip op de plaats waar het ID in de database gelijk is aan het ID van de op het moment ingelogde gebruiker. Niet mogelijk? SQL_error!
Dit betekent dus dat ik in dat lijstje het woord "mail" er ook bij moet zetten. Want dat is ten slotte de naam van de kolom waar het e-mailadres in staat.
----
Ik heb net even Martijns post gelezen (de post hieronder) en ik ga maar even overnieuw beginnen! |