We kunnen input van een gebruiker vragen via formulieren, een formulier bevat verschillende elementen waar de gebruiker gegevens kan invullen en deze dan kan terug sturen naar de server. Gegevens uit formulieren kunnen op twee manieren naar de server worden gestuurd:
- POST: de gegevens staan nu, net zoals bij cookies, in de headers
- GET: de gegevens staan nu als een querystring in de URL (test.php?name=Martijn)
8.1 HTML formulier
Een HTML formulier bevat een aantal velden (tekstvelden, ...) en een button om de gegevens te versturen. Een gewoon formulier met enkele velden ziet er zo uit:
HTML-code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="https://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Voorbeeld 1</title> </head> <body> <h1>Mijn formulier:</h1> <form action="verstuur_naar_hier.php" method="POST"> <div> <label for="name">Naam</label><br /> <input type="text" name="name" id="name" /> </div> <div> <label id="firstname">Voornaam</label> <input type="text" name="firstname" /> </div> <div> <label id="street">Straat</label> <input type="text" name="street" /> </div> <div> <input type="submit" value="verstuur" /> </div> </form> </body> </html>
- Radio buttons: <input type="radio" name="radio" value="kies mij" />
- Checkbox: <input type="checkbox" name="checkbox" value="vink aan" />
- Textarea: <textarea name="text">Tekst hier</textarea>
- ...
8.2 Afhandelen in PHP
Als de gebruiker het formulier in voorgaand voorbeeld invult en verstuurt, zullen de gegevens via de HTTP headers (method POST) naar het bestand verstuur_naar_hier.php verzonden worden. In dit bestand kunnen we met PHP de POST gegevens uitlezen. Alle gegevens staan in de superglobal $_POST. Als we formulieren of andere gegevens via GET (querystring) versturen staan deze in de superglobal $_GET. Beide werken op dezelfde manier en zijn ook overal beschikbaar.
De verstuurde waarden staan in de superglobals als een associatieve array, de key is telkens de name van het HTML element:
PHP-code:
<?php
// We gaan de gegevens afdrukken
echo 'De verstuurde gegevens zijn: <br />';
echo 'Naam: ' . $_POST[ 'name' ] . '<br />';
echo 'Voornaam: ' . $_POST[ 'firstname' ] . '<br />';
echo 'Straat: ' . $_POST[ 'street' ] . '<br />';
?>
een voorbeeld url: https://www.eendomeinnaam.be/?waarde1=hehe&waarde2=5
PHP-code:
<?php
echo $_GET['waarde1']; // zal als output geven: hehe
echo $_GET['waarde2']; // deze zal als output geven: 5
?>
Indien je van plan bent deze gegevens op een HTML pagina te plaatsen moet je ze eerst door htmlspecialchars() halen. Deze functie haalt alle HTML elementen (<, >,...) eruit en vervangt ze door hun html-entiteit zodat de pagina niet gebruikt kan worden voor injection of XSS attacks.
Er is 1 gouden regel: VERTROUW NOOIT GEGEVENS DIE DE GEBRUIKER STUURT.
Formulier inhoud en HTTP headers kunnen door de gebruiker makkelijk aangepast worden, ook gegevens die al door client gecontroleerd zijn (JavaScript) moeten op de server opnieuw gecontroleerd worden. Dit MOET altijd gebeuren. Een gebruiker kan deze formulieren opslaan en zelf aanpassen en zo alle beveiligingen omzeilen.
De manier waarop we met user input omgaan is zodanig belangrijk dat we dit behandelen in hoofdstuk 12 genaamd Veiligheid.
Geschreven door: Martijn Croonen.
Aanpassingen door: Aerts Kurt.