GET id in url beveiligen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 4 volgende »

Johan de wit

johan de wit

17/05/2015 23:13:21
Quote Anchor link
Frank Nietbelangrijk op 17/05/2015 22:09:18:
Johan: Don't do it! Clear your mind!

Een gebruiker toetst in wat hij wil intoetsen als url. Ook met md5, unique_id or whatever string er in.
Stop je energie in "WAT LAAT IK ZIEN AAN WELKE GEBRUIKER".

(Hoeveel moeite kost het om iemand van een slecht idee af te helpen - lieve hemel :O )


Wees niet te snel boos ik doe wat er gezegd wordt. unique_id was alleen een extra laag om id nummer te veranderen maar dat wil je er van af komen dat begrijp ik nu.

Wat we samen hebben gemaakt heb ik voor profiel pagina toegepast dus iedereen kan alleen zijn eigen gegevens aanpassen van naam tot email adres.

Dan zit ik nog bij "Stop je energie in "WAT LAAT IK ZIEN AAN WELKE GEBRUIKER"." Het werkt goed alleen ik moet nog er voor zorgen dat user_id alleen database regels van used_id kan bewerken.
 
PHP hulp

PHP hulp

24/11/2024 06:38:52
 
Frank Nietbelangrijk

Frank Nietbelangrijk

17/05/2015 23:20:58
Quote Anchor link
Ik ben niet boos Johan :-) Het is meer zoiets dat ik niet begrijp waarom je je (nog steeds) druk maakt om een url die kunt wijzigen.

ff domme vergelijking:

bij ieder huis kun je proberen of er een deur los is. Nu wil jij dat mensen die door de straat lopen de deuren niet meer kunnen zien. Camoufleren met baksteenmotief dan maar of zo ? ;-)
 
Johan de wit

johan de wit

18/05/2015 00:13:47
Quote Anchor link
Gelukkig maar. Waar ik druk om maak is dit.

Stel jij logt in en upload je werkstuk dan is ID van je werkstuk 3.
Ik log in en upload voor de gein om te kijken waar de url op eindigd, dan zie ik achter ID 4 staan. Ik verander 4 naar 3 dan kan ik je geuploade bestand verwijderen.

Wat we net hadden was handig ik kon alleen met mij eigen ID bekijken, dat wil ik veranderen naar row van geuploaden bestanden en dat laten controleren door geuploaden gebruikers. Iedereen mag alleen zijn eigen geuploaden bestanden bewerken.
Gewijzigd op 18/05/2015 00:15:10 door johan de wit
 
- Ariën  -
Beheerder

- Ariën -

18/05/2015 00:18:54
Quote Anchor link
En in dat geval moet je een controle inbouwen, waarin je eerst controleert of iemand de eigenaar is:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
if(isset($_GET['ID'])) {
    if($_GET['ID'] == $_SESSION['UserID']) {
        verwijder_bestand();
    }
else {
        echo "Foei, stout, niet lief! Jij mag niet andermans spulletjes verwijderen.";
    }
}
else {
    echo "Zonder ID kan ik niks!";
}

?>
 
Frank Nietbelangrijk

Frank Nietbelangrijk

18/05/2015 00:21:17
Quote Anchor link
je moet aan de row van werkstuk ook een foreign key toevoegen die naar de userid van de eigenaar van het geuploade bestand wijst

hoe zit zo een row van geuploade bestanden er nu uit? ik bedoel welke kolommen heb je?
 
Johan de wit

johan de wit

18/05/2015 00:26:08
Quote Anchor link
Voorbeeld van jou genomen:

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
[mysql-server]
     |
     |- [database]
             |
             |---- [tabel] gebruikers
             |        |
             |        |---- [kolom] customer_id
             |        |---- [kolom] name
             |        |---- [kolom] email
             |
             |---- [tabel] werkstukken
                      |
                      |---- [kolom] werkstuk_id
                      |---- [kolom] customer_id
                      |---- [kolom] titel


Kortom er is een kolom voor geuploade eigenaren aanwezig.

Toevoeging op 18/05/2015 00:29:00:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<?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>  
Gewijzigd op 19/05/2015 13:44:31 door johan de wit
 
Johan de wit

johan de wit

19/05/2015 11:20:34
Quote Anchor link
Heb ik het goed?
 
- Ariën  -
Beheerder

- Ariën -

19/05/2015 11:34:00
Quote Anchor link
Ik vraag me af of je wel goed naar mijn code gekeken hebt?
Je zult in mijn code jouw taken moeten moeten verwerken, niet daaronder.

Of het nu om verwijderen of wijzigen gaat, het komt in mijn code op hetzelfde neer.
En die functie die er in staat, die moet je zelf aanmaken of toevoegen.
Gewijzigd op 19/05/2015 11:39:49 door - Ariën -
 
Johan de wit

johan de wit

19/05/2015 11:47:43
Quote Anchor link
Ik moet dan stukje van vorige code eruit halen en van jou inbouwen.
 
- Ariën  -
Beheerder

- Ariën -

19/05/2015 11:50:36
Quote Anchor link
Ja, en kijk logisch wat mijn code precies doet, en bouw hierop uit.
 
Johan de wit

johan de wit

19/05/2015 11:53:37
Quote Anchor link
Zowiezo kijk ik goed er naar maar om zeker te zijn stel ik van te voren vragen. Als het wel/niet lukt dan laat ik je wel weten.
 
- Ariën  -
Beheerder

- Ariën -

19/05/2015 13:00:11
Quote Anchor link
Prima, we horen het wel :)
 
Johan de wit

johan de wit

19/05/2015 13:41:07
Quote Anchor link
Dit doet hezelfde als hier voor.

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.

Afbeelding

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.
Gewijzigd op 20/05/2015 16:26:53 door johan de wit
 
- Ariën  -
Beheerder

- Ariën -

20/05/2015 19:27:15
Quote Anchor link
Vreemd dat je bij ID 3 die melding ziet?
Hoe ziet je code er nu uit?
 
Frank Nietbelangrijk

Frank Nietbelangrijk

20/05/2015 19:40:42
Quote Anchor link
Ik snap even niets van jouw plaatje maar je zou deze tabellen moeten hebben:

users:
- userid
- username

werkstukken:
- werkstukid
- userid (zegt dus van welke user dit werkstuk is)
- titel
- etc..

De ingelogde user is gewoon één user uit de tabel users.
Jij was ingelogd met userid 3.

Dan kun je zo de bijbehorende user gegevens zoeken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT * FROM users WHERE userid=3


en zo zoek je bijbehorende werkstukken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT * FROM werkstukken WHERE userid=3


en zo zoek je beiden in 1 keer:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT title, username, ... FROM werkstukken
JOIN users
ON users.userid=werkstukken.userid
WHERE userid=3
Gewijzigd op 20/05/2015 19:45:48 door Frank Nietbelangrijk
 
Thomas van den Heuvel

Thomas van den Heuvel

20/05/2015 19:48:50
Quote Anchor link
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.
 
Johan de wit

johan de wit

20/05/2015 23:48:02
Quote Anchor link
@Aar:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<?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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
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.
Gewijzigd op 20/05/2015 23:55:43 door johan de wit
 
- Ariën  -
Beheerder

- Ariën -

21/05/2015 00:28:28
Quote Anchor link
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.
 
Johan de wit

johan de wit

21/05/2015 00:50:12
Quote Anchor link
Afbeelding
Gewijzigd op 21/05/2015 00:51:30 door johan de wit
 
Dos Moonen

Dos Moonen

21/05/2015 09:47:58
Quote Anchor link
Afbeelding

Anyway...

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.
Gewijzigd op 21/05/2015 09:48:36 door Dos Moonen
 

Pagina: « vorige 1 2 3 4 volgende »



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.