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?
<?php
if(is_numeric($_GET['id'])) {
// her is een ID, voer de rest van het script + de query uit.
} else {
// het script bevat geen ID, try again....
}
?>
Dit moet gewoon werken.
Verder nog een paar tips:
- Gebruik geen alerts's, maar laat gewoon met een echo zien dat het record is geupdated
- Gebruik geen die(), je script moet niet doodgaan als de query niet werkt.
- Op lijn 36 vergeet je PHP te starten voor die variabele
Zo sluit je tevens een negatief id of een id=0 uit:
<?php
if(intval($_GET['id']) > 0) {
// her is een ID, voer de rest van het script + de query uit.
} else {
// het script bevat geen GELDIG ID, try again....
}
?>
<?php
if(is_numeric($_GET['id'])) {
// her is een ID, voer de rest van het script + de query uit.
} else {
// het script bevat geen ID, try again....
}
?>
Dit moet gewoon werken.
Verder nog een paar tips:
- Gebruik geen alerts's, maar laat gewoon met een echo zien dat het record is geupdated
- Gebruik geen die(), je script moet niet doodgaan als de query niet werkt.
- Op lijn 36 vergeet je PHP te starten voor die variabele
Vanaf welke regel moet ik je script plaatsen?
Dank je wel:
- Alerts is vervangen door echo.
- Die() is vervangen door echo.
- Regel 36 heb ik PHP toegevoegd.
[size=xsmall]Toevoeging op 16/05/2015 13:37:22:[/size]
Frank Nietbelangrijk op 16/05/2015 11:27:30
Kleine aanvulling op Aar:
Zo sluit je tevens een negatief id of een id=0 uit:
<?php
if(intval($_GET['id']) > 0) {
// her is een ID, voer de rest van het script + de query uit.
} else {
// het script bevat geen GELDIG ID, try again....
}
?>
Welke regel(s) moet ik vervangen door je aangepaste script?
Op regel 26 injecteer je $_GET['id'] in één keer in je query terwijl je nog helemaal niet weet of:
- $_GET['id'] wel bestaat
- $_GET['id'] wel een juiste waarde heeft. (numeriek en groter dan nul)
Dat kan dus beter:
<?php
if(isset($_GET['id']) && intval($_GET['id']) > 0)
{
// je query
try {
$query = "SELECT * FROM tabel WHERE id=?";
$stmt = $dbc->prepare($query);
$stmt->bindParam(1, intval($_GET['id'])); // met intval aub
$stmt->execute();
$row=$stmt->fetch(PDO::FETCH_ASSOC);
$username = $row['user_name'];
$id = $row['id'];
} catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
} else {
// een nette foutmelding
echo "Geen of ongeldig ID opgegeven.";
exit;
}
?>
Op regel 26 injecteer je $_GET['id'] in één keer in je query terwijl je nog helemaal niet weet of:
- $_GET['id'] wel bestaat
- $_GET['id'] wel een juiste waarde heeft. (numeriek en groter dan nul)
Dat kan dus beter:
<?php
if(isset($_GET['id']) && intval($_GET['id']) > 0)
{
// je query
try {
$query = "SELECT * FROM tabel WHERE id=?";
$stmt = $dbc->prepare($query);
$stmt->bindParam(1, intval($_GET['id'])); // met intval aub
$stmt->execute();
$row=$stmt->fetch(PDO::FETCH_ASSOC);
$username = $row['user_name'];
$id = $row['id'];
} catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
} else {
// een nette foutmelding
echo "Geen of ongeldig ID opgegeven.";
exit;
}
?>
Aangepast: bij regel 9 krijg ik de volgende foutmelding.
$stmt->bindParam(1, intval($_GET['id'])); // met intval aub
Strict Standards: Only variables should be passed by reference in
Ik krijg dit keer netjes foutmelding zodra ik 0 achter id= en als ID niet bestaat dan krijg ik geen melding, onbevoegde kunnen wel bij anderemanse ID komen, welke oplossingen kan ik hiervoor gebruiken? Ik dacht aan iets als base64_encode() maar dat kan je makkelijk omzetten met base64_decoder().