Veilig Update query via html form
Ik vraag me het volgende af;
Als je een records in een table wilt updaten, waarbij de gegevens via een formulier worden aangeleverd. Hoe kan je er dan op een veilig manier voor zorgen dat alleen het betreffende record wordt geupdate en niet bijvoorbeeld een ander records als de bezoeker in het formulier (hidden field) een ID aanpast?
Wat ik tot nu toe heb:
Ik maak een hidden field aan met het ID van de betreffende record in de table en maak een $_SESSION aan waarin dit ID ook wordt opgeslagen. Alvorens ik een update Query uitvoer in de database vergelijk ik de $_POST met de $_SESSION of deze gelijk zijn, indien niet dan is de waarde in het hidden field aangepast.
Is dit een beveiling die voldoende is ? of zijn er nog andere mogelijkheden?
Als het echt een probleem is, dan zal je via andere gegevens moeten achterhalen of het wel mag of niet. Stel diezelfde gebruiker doet weer hetzelfde. Alleen nu is hij niet gerechtigd om id=2 aan te passen, omdat dat record aan een andere gebruiker toebehoort. In dat geval zal je voor de update moeten controleren of de gebruiker het wel mag doen aan de hand van zijn gebruikers id. Heeft hij geen toegang, dan voer je de update niet uit.
Dus, bij elk record houd je bij welke gebruiker de auteur is.
Bij het updaten/deleten:
- ofwel is de gebruiker een admin
- ofwel heeft de gebruiker rechten om andermans' records aan te passen (moderator)
- ofwel is de gebruiker de auteur van de record
In elk ander geval is het antwoord nee.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$chek = mysql_query("SELECT id FROM tabel WHERE id = '".mysql_real_escape_string($_GET['id'])."' AND naam = '".$_SESSION['user']."' ") or die ("Lezen gegevens mislukt");
if(mysql_num_rows($chek) == 1){
$ok = true;
} else {
$ok = false;
}
if($ok == true) {
echo 'Alles klopt, formulier';
} else {
echo 'Oeps daar ging iets fout!';
}
?>
$chek = mysql_query("SELECT id FROM tabel WHERE id = '".mysql_real_escape_string($_GET['id'])."' AND naam = '".$_SESSION['user']."' ") or die ("Lezen gegevens mislukt");
if(mysql_num_rows($chek) == 1){
$ok = true;
} else {
$ok = false;
}
if($ok == true) {
echo 'Alles klopt, formulier';
} else {
echo 'Oeps daar ging iets fout!';
}
?>
Zo haal je dus een ID uit de tabel met 2 controles. 1: Het id, het ID moet aan het ID zelf kloppen. Kan handig zijn als je wel een ID 1, 3, 4 hebt. Als je dan id=2 doet word ok = false. 2: De naam die aan de session is gegeven moet gelijk zijn aan de gebruiker die 'eigenaar' is van dat ID.
Een hidden field is dus niet meer nodig.
Gewijzigd op 27/12/2012 21:17:55 door Machiel K
Daarin zet je de gebruikers_id van de gebruiker ($_SESSION) en die van de beheerder/moderators.
Code (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
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
<?php
// eerst opschrijven, eventueel echoén is dan makkelijker
$sql = "UPDATE tabel
SET kolom = '" . mysql_real_escape_string($_POST['je_tekst']) . "'
WHERE id = " . intval($_GET['id']) . "
AND poster_id IN ('" . $_SESSION['user_id'] . "', SELECT user_id FROM users WHERE rang = 'Admin')
";
// hier kan je even je query echoén zoals hij vezonden gaat wordne
// echo $sql;
// voer query uit en sla resultaat (of foutmelding!) op in een variable
$res = mysql_query($sql);
// controleer of query is gelukt en of er rijen zijn bijgewerkt
if($res !== false AND mysql_affected_rows() == 1)
{
// 't is goed, alles goed
echo 'Alles klopt, formulier';
}
else
{
echo 'Oeps daar ging iets fout in ' . $sql . ': ' . mysql_error();
}
?>
// eerst opschrijven, eventueel echoén is dan makkelijker
$sql = "UPDATE tabel
SET kolom = '" . mysql_real_escape_string($_POST['je_tekst']) . "'
WHERE id = " . intval($_GET['id']) . "
AND poster_id IN ('" . $_SESSION['user_id'] . "', SELECT user_id FROM users WHERE rang = 'Admin')
";
// hier kan je even je query echoén zoals hij vezonden gaat wordne
// echo $sql;
// voer query uit en sla resultaat (of foutmelding!) op in een variable
$res = mysql_query($sql);
// controleer of query is gelukt en of er rijen zijn bijgewerkt
if($res !== false AND mysql_affected_rows() == 1)
{
// 't is goed, alles goed
echo 'Alles klopt, formulier';
}
else
{
echo 'Oeps daar ging iets fout in ' . $sql . ': ' . mysql_error();
}
?>
Ik heb die SELECT halverwege uit mijn losse hoofd geschreven. Weet niet of dit direct zo werkt.