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?
ID van 1 tot en met 2 krijg je "Foei, stout, niet lief! Jij mag niet andermans spulletjes verwijderen." melding en bij ID 3 krijg ik dit te zien "Zonder ID kan ik niks!".
Als kolom ID met sessie ID niet overheen komt dan is deze melding goed "Foei, stout, niet lief! Jij mag niet andermans spulletjes verwijderen.".
---MESSAGE-EDIT---
Ik heb even met excel een plaatje gemaakt om duidelijker te maken.
Rij 1 is USER tabel
Rij 2 is WERKSTUK tabel
Rij 3 is WERKSTUK van ingelogde USER.
Rij 3 heeft WERKSTUKID dat komt in URL balk ?id=2, ?id=4 en ?id=5
Wat ik nu heb is dat alles blokkeerd wordt behalve ingelogde USERID dus ID 3. ?id= verandert naar WERKSTUKID van ingelogde gebruikers.
Als ik het bovenstaande stuk code als leidraad moet nemen gebruik je $id foutief voor zowel het user id in de sessie (regel 23) alsmede het id van het werkstuk (regel 55, 57).
Ik stel voor dat je de verschillende acties die iemand op een werkstuk kan uitvoeren wat verder uit elkaar trekt, want het is nu nogal een clusterf... warboel.
Je geeft zelf ook al aan wat er gebeurt: je kunt alleen info van het werkstuk opvragen indien het user id gelijk is aan het id van het werkstuk.
<?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;
}
// ALLEEN ROW VAN SESSIES IS TOEGESTAAN
if(isset($id)) {
if($id == $_SESSION['user_id']) {
verwijder_bestand(); // <--- WAT MOET HIER KOMEN?
} else {
echo "Foei, stout, niet lief! Jij mag niet andermans spulletjes verwijderen.";
}
} else {
echo "Zonder ID kan ik niks!";
}
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>
@Frank:
Inderdaad ik heb precies wat je hebt genoteerd:
users:
- userid
- username
werkstukken:
- werkstukid
- userid (zegt dus van welke user dit werkstuk is)
- titel
- etc..
Ik zal even je code uitproberen.
@Thomas:
Na het inloggen kom je homepage in en dan kan je werkstukken uploaden (upload is nog niet gemaakt), naast dat heb je ook pagina om alle aangemaakte rows bekijken en eventueel aanpassen als het nodig is, achter elke row heb ik een button met link die eindigen op .php?id= als je er op klikt dan kan je aangemaakte gegevens bewerken, dat lukt nu wel alleen als je achter .php?id=(cijfers) aanpast dan kan ik bijvoorbeeld jou geuploade bestand met tekstvakken aanpassen, row die nog niet bestaat dus .php?id=10000000 kan je ook bekijken (het is wel leeg) en invullen. Ik hoop dat ik duidelijk kon uitleggen. Als je nog vragen hebt dan zal ik meer dan mij best doen om je vragen te beantwoorden.
Probeer de functies in te kapselen en exit-functies te vermijden.
Kijk eerst of er een ID is ingevoerd, dit kan resulteren in ja en nee, oftewel true of false. Kijk aan de hand van deze waardes wat de volgende stap is.
Probeer het anders eens in een flowchart te tekenen.
Hopelijk lukt het zo, anders zal ik morgen wel een opzetje maken.
Regels 32 t/m 36 en 54 t/m 64 moeten tussen regels 20 & 22 komen.
Op regel 23 moet je dan $row['user_id'] gebruiken i.p.v. $_SESSION['user_id']
Al heb je liever dat je op de huidige regel 39 nog controleert of user_id = $_SESSION['user_id'], dan hoef je op regel 23 niet meer het id te controleren, maar of het aantal geselecteerde rijen groter is dan 0.
Op regel 39 moet je ook weer een user_id = $_SESSION['user_id'] in de WHERE er bij zetten. Op regel 43 moet je dan ook controleren of het aantal aangepaste rijen groter is dan 0.
Op regel 24 moet de code die alleen uitgevoerd mag worden wanneer het jouw werkstuk is.
Wat voor dat bestand het grootste deel van het bestand hoort te zijn.
Wanneer je dat hebt gedaan mag je het laten zien, dan kunnen we je waarschijnlijk nog meer tips geven.