variabelen doorsturen met links

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Kevin Driessen

Kevin Driessen

21/12/2009 15:53:00
Quote Anchor link
Ik heb zelf een tijdlang zitten aanrommelen met PHP en ben mijn site nu eens flink aan het verbeteren.

Omdat het voorheen niet van belang was, is mijn site totaal niet veilig: variabelen worden doorgestuurd met links, waaronder variabelen die niet van belang zijn voor de inloggegevens. Totaal niet veilig dus, want door even in de link de juiste variabelen te bewerken valt er makkelijk schade aan te richten.

Dit wil ik dus ongedaan maken, maar dan stuit ik op het probleem van het doorsturen van variabelen.

Wat ik graag wil weten:
Zijn variabelen op een veilige manier door te sturen met links? en dan bedoel ik zonder dat er een enorme omweg via javascript toegepast moet worden, want in dat geval kan ik beter formulieren toepassen.
 
PHP hulp

PHP hulp

22/12/2024 20:08:38
 
Mr.Ark

Mr.Ark

21/12/2009 15:59:00
Quote Anchor link
Gebruik het id om variables door te sturen, controleer altijd of de variable wel bestaat, desnoods ook kijken of het bij een gebruiker of dergelijken hoort.

Daarbij gebruik je (int) of intval() in je query om aan te geven dat het id een cijfer is/moet zijn.

Edit:


Als het een cijfer moet zijn dan kan je bijvoorbeeld met een $_GET op de volgende manier controleren

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?PH

# Kijken of er een id is meegestuurd en of het een cijfer is
if(!empty($_GET['id']) && ctype_digit($_GET['id']))
{
    # H, $_GET ontvangen en het is een id
}
else
{
    # Foutje, geen $_GEt meegestuurd of het is geen cijfer.
}

?>
Gewijzigd op 01/01/1970 01:00:00 door Mr.Ark
 
Milo

Milo

21/12/2009 15:59:00
Quote Anchor link
Mr. Ark was me voor ;)

Als je iets uit de database haalt natuurlijk wel beveiligen met mysql_real_escape_string of intvalt bij nrs.

Gr,
Gewijzigd op 01/01/1970 01:00:00 door Milo
 
Kevin Driessen

Kevin Driessen

21/12/2009 16:13:00
Quote Anchor link
Lol, ik heb het idee dat jullie iets te ingewikkeld denken (of ik ben gewoon te dom om er iets van te snappen).

Wat ik wil is simpelweg een variabele doorsturen met iets simpels als een link, dus:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<a href=pagina.php?waarde=een_of_andere_waarde>link</a>


de variabele is op te roepen met $_GET['waarde']. Het probleem hierbij is dat de waarde in de link te bewerken is. Wat ik graag wil, is een waarde kunnen doorsturen zonder dat die te bewerken is of op z'n minst dat daarbij niet gezien kan worden om welke variabelen en waarden het gaat.

Van md5 met sessies opslaan weet ik niet echt veel, maar om iets met sessies op te slaan, moet er een php-code toegepast worden die in het script staat en naar mijn weten niet in iets dergelijks als een link te plaatsen is. Als dat wel het geval is, dan ben ik slechts benieuwd naar hoe dit dan kan.

In het algemeen komt mijn vraag op het volgende neer:
Is een variabele op een makkelijke en veilige manier door te sturen naar een andere (of dezelfde) pagina, dus zonder dat deze variabele van buiten de server zelf bewerkt kan worden? Zo ja, hoe?
Gewijzigd op 01/01/1970 01:00:00 door Kevin Driessen
 
Mr.Ark

Mr.Ark

21/12/2009 16:28:00
Quote Anchor link
@ Kevin

Lees mijn post nog eens rustig door...
 
Kevin Driessen

Kevin Driessen

21/12/2009 16:30:00
Quote Anchor link
Ik vind je bericht een beetje verwarrend, maar ik zal een poging doen en er wat dingetjes mee uitproberen ;)
Ik ga wel weer verderzeuren als ik er alsnog niet uitkomt. Mocht het wel lukken, dan bevestig ik dan nog even :D
 
Pim -

Pim -

21/12/2009 16:37:00
Quote Anchor link
Als je een variabele in een andere pagina wilt gebruiken en je zeker wilt weten dat deze niet aangepast wordt, zijn sessies echt de beste manier.

Sessies zijn echt makkelijk in gebruik, het enige wat je doet is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
// Boven elke pagina
session_start();

// En dan kan je zo variabelen aanroepen/ instellen
$_SESSION['a'] = 'b';

(
Of gencrypte waarden in cookies/post, maarja, ook niet echt handig)
 
Kevin Driessen

Kevin Driessen

21/12/2009 16:41:00
Quote Anchor link
@Mr.Ark
Ik denk dat ik je dan nog niet helemaal snap...

In je vorige bericht heb je het over het ophalen van een variabele waarbij dan gecheckt wordt of de waarde het juiste 'type' waarde is.

Je gebruikt als voorbeeld om te controlleren of de variabele 'id' wel nummeriek is. Als die niet nummeriek is, zal die niet aan de eis voldoen, nocht zal die niet aan de eis voldoen als die geen waarde heeft.

Echter is hiermee mijn vraag niet opgelost, want stel ik heb een pagina die ik test.php noem. Om die aan die id-variabele te voldoen, moet er in de link een waarde gegeven zijn, dus bijvoorbeeld als volgt:
test.php?id=5

Het resultaat hiervan is dat die aan de eisen voldoet. Mijn probleem is dat die ook aan de eisen voldoet wanneer deze id-waarde in de browser wordt gewijzigd. Anders gezegd: een bezoeker kan deze waarde veranderen, terwijl dat niet zou moeten kunnen.

Je suggestie voorkomt enkel dat er geen waardes als woorden toegepast worden als ik wil dat er enkel cijfers zijn. Wat ik wil is een waarde doorsturen die van buitenaf niet gewijzigd kan worden.
Gewijzigd op 01/01/1970 01:00:00 door Kevin Driessen
 
Mr.Ark

Mr.Ark

21/12/2009 16:54:00
Quote Anchor link
@ Kevin

Je controleer a.d.h.v een select query of het id geldig is.

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
<?PHP

# Kijken of er een id is meegestuurd en of het een cijfer is
if(!empty($_GET['id']) && ctype_digit($_GET['id']))
{

    # Query uitvoeren om te kijken of id voorkomt in de database
    $Query =
    "
        SELECT
            blaat
        FROM
            tabel
        WHERE
            id = '"
.intval($_GET['id'])."'
    "
;

    # Resultaat van de query
    $Result = mysql_query($Query);

    # Kijken of de query is gelukt
    if(!$Result)
    {

        # Foutje in de query
        echo 'Fout opgetreden, fout: '.mysql_error();
    }

    else
    {
        # Kijken of er een resultaat is
        if(mysql_num_rows($Result) == 0)
        {

            # Geen resultaat
            echo 'Geen resultaat gevonden met id: '.$_GET['id'];
        }

        else
        {
            # Wel een resultaat ga hier verder
        }
    }
}

else
{
    # Foutje, geen $_GET meegestuurd of het is geen cijfer.
}

?>


Hier controleer je nu of die geldig is het id.

Als je het voor gebruikers doet, dan kan je nog een AND in de query toevoegen bijvoorbeeld waar je het SESSIE ID van die gebruiker gebruikt.

Dus:

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
<?PHP

# Query uitvoeren
$Query =
"
    SELECT
        blaat
    FROM
        tabel
    WHERE
        id = '"
.intval($_GET['id'])."'
    AND
        gebruiker_id = '"
.intval($_SESSION['id'])."'
"
;

?>


Hoop dat je het nu een beetje snapt
 
Kevin Driessen

Kevin Driessen

21/12/2009 20:39:00
Quote Anchor link
Beschrijving van je script:
* Je hebt een variabele.
* Je controlleert of die variabele gedefinieerd is en of het een getal is.
* Met een Query check je in de database of die waarde voorkomt.


Ik waardeer het heel erg dat je zoveel moeite doet om mij te helpen, maar ik zie niet in hoe dit te maken heeft met het doorsturen van een variabele of het voorkomen dat iemand kan rommelen met de variabele.
Hetgeen wat je script doet is checken of die waarde wel mogelijk is, maar het blijft mogelijk dat een bezoeker een andere waarde verzint.


Laat ik maar een voorbeeld geven:
Ik heb een script voor privé-berichten waarbij leden elkaar berichten kunnen sturen. Het is natuurlijk niet de bedoeling dat leden berichten kunnen zien die niet aan hem/haar verzonden zijn.

In een inbox komen de onderwerpen van de berichten te staan, die tevens een link zijn naar de berichten. De link naar een bericht kan er bijvoorbeeld zo uitzien:
<a href=priveberichten.php?id=7574>Een of ander onderwerp</a>
Wanneer je op de link klikt, zal in het script het bijbehorende bericht opgehaald worden.
Wat je dus hierboven beschrijft is nuttig om te checken dat de invoer wel juist is, maar in de browser zie je de link staan. Je kunt het id-nummer dus gewoon veranderen. Door een beetje wat uit te proberen is het daardoor ook mogelijk berichten van anderen te bekijken.

Wat mij dus interesseert is een manier om via zo'n link het bijbehorende bericht te openen, zonder dat het mogelijk is dat je het id-nummer kunt bewerken:
Het id moet dus doorgegeven worden (via een link) en dit id moet aan te spreken zijn, maar dan eigenlijk op een andere manier dan via $_GET['id'] omdat dit te beïnvloeden is.


ps: ik weet dat er wel manieren bestaan om er bijvoorbeeld met extra velden voor te zorgen dat wanneer iemand zo'n id gaat bewerken in de link, dat hij dan niet zomaar willekeurig bericht kan zien, maar dat is niet mijn vraag. Ik wil slechts weten of wat ik vraag mogelijk is en zo ja, hoe? That't all.
 
Pim -

Pim -

21/12/2009 21:53:00
Quote Anchor link
Er is daar maar 1 manier voor, namelijk op de pagina waaraan het id via de URL is doorgegeven weer checken of de handeling toegestaan is. Dat is precies wat Mr.Ark heeft beschreven.

Met jou voorbeeld.
Tabel: pm
- id
- sender_id
- reciever_id
- msg
- time

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
<?php
if(!isset($_GET['id'])) {
   // Error
}
$id = $_GET['id'];
$userid = $_SESSION['userid'];

$sql = 'SELECT sender_id, msg, time FROM pm WHERE id ='.(int)$id.' and reciever_id='.$userid;

$res = mysql_query($sql);

if(!res) {
   // Mysql error
} elseif (mysql_num_rows() == 0) {
   // Fout: Of het bericht bestaat niet, of is aan iemand anders bestemd
   echo 'Dit bericht bestaat niet';
}
else {
   $bericht = mysql_fetch_assoc($res);
   // Rest van je script
}
?>
 
Kevin Driessen

Kevin Driessen

21/12/2009 22:18:00
Quote Anchor link
Ik snap jullie bedoeling ook wel en 't lijkt er inderdaad op dat dit de enige manier is. Ik zal het daar dan ook bij laten.

Het zal waarschijnlijk wel niet mogelijk zijn via een link een variabele door te sturen, zonder dat deze onbewerkbaar blijft. Links zijn immers ook via andere sites te verzenden, dus een server-inside variabele via een link zou dan een beetej gecompliceerd zijn.

Ik zal jullie niet meer verder lastig vallen met vragen en wil jullie bedanken voor het meedenken.
 
Mr.Ark

Mr.Ark

21/12/2009 22:44:00
Quote Anchor link
Verdiep je dan eens in SESSIONS.

Ik snap je punt eigenlijk niet, als je het gewoon goed afvangt dan is er niks aan de hand.
Gewijzigd op 01/01/1970 01:00:00 door Mr.Ark
 
Kevin Driessen

Kevin Driessen

22/12/2009 00:45:00
Quote Anchor link
Ik snap hoe sessions werken, althans genoeg om er wat mee te kunnen. Mijn hele punt ging erom om met links waardes op eenzelfde manier door te sturen als met een formulier (namelijk: verborgen en onbewerkbaar).
Wel of niet snappen waarom ik dat wil weten, lijkt me niet echt uitmaken. Het gaat mij om gemakzucht, kennis en begrip van de werking van bepaalde dingen.

Nogmaals: doe jezelf de ellende niet aan om verder antwoord proberen te geven. Ik heb jullie punt allang begrepen. Ik hou het er maar bij dat het antwoord op mijn vraag 'nee' is.
 



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.