variabelen doorsturen met links
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.
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
Als het een cijfer moet zijn dan kan je bijvoorbeeld met een $_GET op de volgende manier controleren
Gewijzigd op 01/01/1970 01:00:00 door Mr.Ark
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
Wat ik wil is simpelweg een variabele doorsturen met iets simpels als een link, dus:
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
Lees mijn post nog eens rustig door...
Ik ga wel weer verderzeuren als ik er alsnog niet uitkomt. Mocht het wel lukken, dan bevestig ik dan nog even :D
Sessies zijn echt makkelijk in gebruik, het enige wat je doet is:
Code (php)
1
2
3
4
5
6
7
8
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)
// 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)
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
Je controleer a.d.h.v een select query of het id geldig is.
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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.
}
?>
# 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)
Hoop dat je het nu een beetje snapt
* 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.
Met jou voorbeeld.
Tabel: pm
- id
- sender_id
- reciever_id
- msg
- time
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
}
?>
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
}
?>
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.
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
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.