Ik heb een pagina aangemaakt dat gebruikers gegevens kunnen bewerken maar er viel mij iets op dat je vanaf urlbalk andere regels (en ook ids wat nog niet bestaat) van tabellen kunt bewerken terwijl dat de bedoeling niet is of je voert zomaar bijvoorbeeld letters er achter id= dan zie je nog steeds geen foutmelding.
Hoe zorg ik er voor dat je geen id uit je hoofd kan invoeren en overbodige letters met andere leestekens blokkeren?
Je moet nooit aan de hand van een URL gaan bepalen of iemand een pagina wel of niet mag zien. Urls zijn bedoeld om naar een pagina toe te kunnen surfen en dienen gebruiksvriendelijk te zijn.
In de basis is iedere gebruiker anoniem. Pas als we hem op de website wat vragen stellen kunnen we aan de hand van de antwoorden proberen te achterhalen wie het is. Die vragen zijn dan de alom bekende username en wachtwoord. Nadat we achterhaald hebben met wie we te maken hebben kunnen we het id van de gebruiker opslaan in een sessie. Dat id staat dus niet in een url! aan de hand van het id dat in de sessie is opgeslagen bepalen we welke pagina bekeken mag worden of welke gegevens gewijzigd mogen worden.
Alle drie de bovenstaande urls zijn geldige url's
Alle drie de bovenstaande urls zijn door iedereen over de hele wereld opvraagbaar!
Alle drie de url's leiden naar HETZELFDE php script!
JOUW php script MOET dus gaan bepalen WIE die pagina opvraagt.
antwoorden op die vraag kunnen zijn:
- dat weten we niet want de vrager is niet ingelogd dus anoniem
- de gebruiker is ingelogd dus we weten wie het is (id staat in de $_SESSION)
als de gebruiker ingelogd is wil het nog niet zeggen dat hij de pagina ook mag bekijken.
Ik kan me voorstellen dat je enkel wilt dat een gebruiker kan kijken als het zijn EIGEN gegevens zijn.
Je moet dan dus gaan kijken of het ingelogde_gebruiker_id HETZELFDE is als het OPGEVRAAGDE id (met $_GET)
[size=xsmall]Toevoeging op 17/05/2015 16:57:16:[/size]
Laat anders even een stukje uit je login script zien. (dat stukje waar iets in de $_SESSION bewaard wordt als iemand succesvol ingelogd is). Dan kan ik je wat gerichter helpen.
<?php
$user_sessies = $id;
switch($user_sessies)
{
case $id :
echo '$user_sessies is gelijk aan $id';
break;
default :
echo '$user_sessies voldoet niet aan een van de genoemde voorwaarden';
}
?>
Laat anders even een stukje uit je login script zien. (dat stukje waar iets in de $_SESSION bewaard wordt als iemand succesvol ingelogd is). Dan kan ik je wat gerichter helpen.
/**
* simply return the current state of the user's login
* @return boolean user's login status
*/
public function isUserLoggedIn()
{
if (isset($_SESSION['user_login_status']) AND $_SESSION['user_login_status'] == 1) {
return true;
}
// default return
return false;
}
<?PHP
session_start();
if (!(isset($_SESSION['user_login_status']) && $_SESSION['user_login_status'] != '')) {
header ("Location: index.php");
exit; // NA HEADER EEN EXIT EN JE SCRIPT STOPT DAN OOK DAADWERKELIJK
}
// INITIALISATIE ID MET DEFAULTWAARDE 0
$id = 0;
if(isset($_GET['id'])) {
$id = intval($_GET['id']);
}
// VALIDATIE VAN $id
if($id < 1) {
echo 'Ongeldige GET parameter id';
exit;
}
// EN HIER GAAN WE DAN :-)
if($id != $_SESSION['user_id']) { // WE VERGELIJKEN DUS HET ID DAT MET GET IS OPGEVRAAGD MET HET USER_ID VAN DE INGELOGDE GEBRUIKER
echo 'U mag niet de gegevens van anderen bekijken';
exit;
}
try {
$dbc = new PDO('mysql:host=localhost; dbname=', '', '');
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
if(isset($_POST['submit_btn'])) { // HIER ZOU JE EERST NOG JE FORMULIER MOETEN VALIDEREN
$query = "UPDATE tabel SET name=? WHERE id=?";
$stmt = $dbc->prepare($query);
$stmt->bindParam(1, $_POST['name']);
$stmt->bindParam(2, $_POST['uid']);
if($stmt->execute()) {
echo "Geupdated";
} else {
echo "Probeer nogmaals";
}
// EEN GOEDE GEWOONTE IS OM NA HET VERWERKEN VAN EEN 'POST' TE REDIRECTEN
header ("Location: whatever.php"); // KIES ZELF MAAR NAAR WELKE PAGINA JE WILT
exit;
}
try {
$query = "SELECT * FROM tabel WHERE id=?";
$stmt = $dbc->prepare($query);
$stmt->bindParam(1, $id);
$stmt->execute();
$row=$stmt->fetch(PDO::FETCH_ASSOC);
$username = $row['user_name'];
$id = $row['id'];
} catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
?>
<form id="<?php $row["id"] ?>" action="" method="POST">
<input type="hidden" value="<?php echo $id; ?>" name="uid">
<div class="container">
<div class="panel-heading">
<h3 class="panel-title">Gegevens</h3>
</div>
<div class="panel-body">
<div class="row">
<div class="col-md-6">
<table class="table">
<tbody>
<tr>
<td>Naam</td>
<td><input class="form-control" type="text" id="formGroupInputSmall" placeholder="Naam"name="username" value="<?php echo $username; ?>"/></td>
</tr>
</tbody>
</table>
<input class="btn btn-default" type="submit" name="submit_btn" value="Bevestigen"/>
</form>
</div>
</div>
</div>
</div>
</body>
</html>
Na het inloggen krijg ik geen toegang meer bij bewerken pagina.
<?PHP
session_start();
if (!(isset($_SESSION['user_login_status']) && $_SESSION['user_login_status'] != '')) {
header ("Location: index.php");
exit; // NA HEADER EEN EXIT EN JE SCRIPT STOPT DAN OOK DAADWERKELIJK
}
// INITIALISATIE ID MET DEFAULTWAARDE 0
$id = 0;
if(isset($_GET['id'])) {
$id = intval($_GET['id']);
}
// VALIDATIE VAN $id
if($id < 1) {
echo 'Ongeldige GET parameter id';
exit;
}
// EN HIER GAAN WE DAN :-)
if($id != $_SESSION['user_id']) { // WE VERGELIJKEN DUS HET ID DAT MET GET IS OPGEVRAAGD MET HET restaurant_id VAN DE INGELOGDE GEBRUIKER
echo 'U mag niet de gegevens van anderen bekijken';
exit;
}
try {
$dbc = new PDO('mysql:host=localhost; dbname=', '', '');
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
if(isset($_POST['submit_btn'])) { // HIER ZOU JE EERST NOG JE FORMULIER MOETEN VALIDEREN
$query = "UPDATE tabel SET name=? WHERE id=?";
$stmt = $dbc->prepare($query);
$stmt->bindParam(1, $_POST['name']);
$stmt->bindParam(2, $_POST['uid']);
if($stmt->execute()) {
echo "Geupdated";
} else {
echo "Probeer nogmaals";
}
// EEN GOEDE GEWOONTE IS OM NA HET VERWERKEN VAN EEN 'POST' TE REDIRECTEN
header ("Location: lijst.php"); // KIES ZELF MAAR NAAR WELKE PAGINA JE WILT
exit;
}
try {
$query = "SELECT * FROM tabel WHERE id=?";
$stmt = $dbc->prepare($query);
$stmt->bindParam(1, $id);
$stmt->execute();
$row=$stmt->fetch(PDO::FETCH_ASSOC);
$username = $row['user_name'];
$id = $row['id'];
} catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
?>
<form id="<?php echo $row["id"]; ?>" action="" method="POST">
<input type="hidden" value="<?php echo $id; ?>" name="mid">
<div class="container">
<div class="panel-heading">
<h3 class="panel-title">Gegevens</h3>
</div>
<div class="panel-body">
<div class="row">
<div class="col-md-6">
<table class="table">
<tbody>
<tr>
<td>Naam</td>
<td><input class="form-control" type="text" id="formGroupInputSmall" placeholder="Naam"name="username" value="<?php echo $username; ?>"/></td>
</tr>
</tbody>
</table>
<input class="btn btn-default" type="submit" name="submit_btn" value="Bevestigen"/>
</form>
</div>
</div>
</div>
</div>
</body>
</html>