Veilig Update query via html form
Beste Php'ers,
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?
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?
Om te beginnen, vraag je af of het wel zo belangrijk is. Stel de gebruiker bekijkt het record met id=1, maar past het id aan in het hidden input naar 2. Lijkt een probleem, maar als die gebruiker ook gerechtigd is om dat record aan te passen, dan is er eigenlijk niets aan de hand.
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.
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.
Ja; het is vooral een kwestie van gebruikersrechten.
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.
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.
Als ik je goed begrijp zou dit een oplossing kunnen zijn.
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.
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
Meestal doe je dat met een IN (...).
Daarin zet je de gebruikers_id van de gebruiker ($_SESSION) en die van de beheerder/moderators.
Ik heb die SELECT halverwege uit mijn losse hoofd geschreven. Weet niet of dit direct zo werkt.
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.




