Veilig Update query via html form

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Marvin H

Marvin H

27/12/2012 14:31:09
Quote Anchor link
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?
 
PHP hulp

PHP hulp

21/11/2024 20:56:27
 
Erwin H

Erwin H

27/12/2012 15:00:18
Quote Anchor link
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.
 
Kris Peeters

Kris Peeters

27/12/2012 15:22:28
Quote Anchor link
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.
 
Machiel K

Machiel K

27/12/2012 21:16:47
Quote Anchor link
Als ik je goed begrijp zou dit een oplossing kunnen zijn.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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!';
    }

?>


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
 
Eddy E

Eddy E

27/12/2012 21:28:14
Quote Anchor link
Meestal doe je dat met een IN (...).
Daarin zet je de gebruikers_id van de gebruiker ($_SESSION) en die van de beheerder/moderators.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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();
    }

?>


Ik heb die SELECT halverwege uit mijn losse hoofd geschreven. Weet niet of dit direct zo werkt.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.