login  Naam:   Wachtwoord: 
Registreer je!
 Tutorials

Tutorials > PHP


Gegevens:
Geschreven door:
Joel
Moeilijkheidsgraad:
Normaal
Hits:
22168
Punten:
Aantal punten:
 (3.2)
Aantal stemmen:
15
Stem:
Niet ingelogd
Nota's:
 Lees de nota's (3)
 


Tutorial:

Variabelen en veiligheid

POST & GET en de veiligheid... Er blijkt weinig verstand te zijn dat de register_globals uit staan.
Ik zie vaak nog scripts staan die aannemen dat als je script.php?var=hallo dat er dan een variabele $var in script.php te gebruiken is die de waarde "hallo" meedraagt ... Tegenwoordig is dit standaard NIET meer het geval! Sinds PHP 4.2.0 staat de register_globals standaard uit, dit staat in je php.ini (meestal te vinden in je C:Windows directory, voor de Windows gebruikers onder ons). Het is niet aan te bevelen om de register_globals aan te zetten, waarom? ik zal het je vertellen.

Als je een simpel member systeem hebt, kunnen mensen onbedoeld binnenkomen via een simpele aanpassing van de URI (ja, je leest het goed URI en geen URL, het is geen typfout, lees W3C er maar op na http://www.w3.org/Addressing/ ) binnen komen.

  <?PHP //member.php
if($gebruikersnaam=="jan" && $wachtwoord=="super-geheim")
{
//ok, je bent blijkbaar goed ingelogd :)
  
$goed_ingelogd=1;
}
if(
$goed_ingelogd==1)
{ echo
"super geheime en gevoelige data :)";
  
// meer geheime data
}
?>

Stel je hebt een member pagina waar mensen moeten inloggen omdat er 'geheime' of gevoelige data opstaat die je niet aan iedereen kwijt wilt, een voorbeeldje van een mogelijk script member.php:

Als je dit scriptje bekijkt en denkt ... "zo doe ik het zelf ook, het is toch goede code ?" dan zou ik maar heel snel deze pagina lezen, want het is GEEN goede code.
Want de variabele $goed_ingelogd kan ook vanaf buiten het script komen, van de client machine via een GET, POST of een COOKIE. Door simpel member.php?goed_ingelogd=1 op te vragen zou ik al de geheime en gevoelige data krijgen, das een leuke exploitbare beveiligingslek dan hè :-) jij vind het waarschijnlijk minder leuk als je privé data op straat ligt, ik ook en daarom schrijf ik deze tutorial.

Als je je php.ini leest zie je het al:

; - register_globals = Off         [Security, Performance]
;     Global variables are no longer registered for input data (POST, GET, cookies,
;     environment and other server variables).  Instead of using $foo, you must use
;     you can use $_REQUEST["foo"] (includes any variable that arrives through the
;     request, namely, POST, GET and cookie variables), or use one of the specific
;     $_GET["foo"], $_POST["foo"], $_COOKIE["foo"] or $_FILES["foo"], depending
;     on where the input originates.  Also, you can look at the
;     import_request_variables() function.
;     Note that register_globals is going to be depracated (i.e., turned off by
;     default) in the next version of PHP, because it often leads to security bugs.
;     Read http://php.net/manual/en/security.registerglobals.php for further
Als je register_globals uit hebt staan moet je de variabele die je wilt krijgen van de client machine opvangen door $_REQUEST['gebruikersnaam'] te gebruiken (voor alle variabelen die via GET, POST en COOKIE binnenkomen), beter is om maar een enkele op te vangen (je laat je script toch meestal maar via één weg informatie versturen of niet?).

Een bredere uitleg over deze andere manier om client data binnen te halen, ook wel de super globals genoemd:
Bijna alle super globals beginnen met $_ om te voorkomen dat je een variabele overschrijft en er is meestal een $HTTP_XXX_XXX gelijke voor, maar deze vorm is verouderd en dus beter om niet te gebruiken omdat hij in nieuwere versies eruit kan worden gegooid. Alle super globals zijn arrays, je kunt dus informatie eruit opvragen doormiddel van $_XXX['variabele'] , nu een overzicht van een aantal super globals.

$GLOBALS : Dit is dus de enige uitzondering op de regel, er is geen $HTTP_XXX_XXX gelijke voor en begint niet met $_ , de variabele bevat alle variabelen die GLOBAL zijn.

$_SERVER : Variabelen die van de webserver komen, zoals een HTTP_REFERER en een REQUEST_URI, gelijke voor deze is de verouderde $HTTP_SERVER_VARS.

$_GET : Alle variabelen die via de GET methode zijn binnengekomen (GET is de normale/standaard methode om een pagina op te vragen), gelijk aan $HTTP_GET_VARS.

$_POST : Alle variabelen die via POST binnenkomen, dit wordt meestal gebruikt als er veel data moet worden doorgegeven of voor gevoelige data, gelijk aan $HTTP_POST_VARS.

$_COOKIE : Alle variabelen die in een client cookie zitten voor het betreffende domein, gelijk aan $HTTP_COOKIE_VARS.

$_FILES : Variabelen die van het posten van een file komen, de file data, mime type van de data en de filename van het bestand, gelijk aan $HTTP_POST_FILES.

$_ENV : Een functie die volgens mij een beetje gelijk is aan $_SERVER, je kan er in ieder geval gelijke data mee opvangen, het bereik is mogelijk groter want $_SERVER pakt alleen variabelen gegeven door de webserver en niet van andere programma's in het proces, gelijk aan $HTTP_ENV_VARS.

$_REQUEST : Alle variabelen van GET, POST en COOKIE bij elkaar, er is hiervoor geen $HTTP_XXX_XXX gelijke maar wel een verouderde functie (die standaard uit staat) voor: import_request_variables().

$_SESSION : Session variabelen op de server, gelijk aan $HTTP_SESSION_VARS

Veel succes met je nieuwe inlog en member systemen.
Lees ook de documentatie op php.net eens goed door.

Resources:



« Vorige tutorial : Functies Volgende tutorial : Debugging »

© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.016s