Tijd voor een wat moeilijker formulier. Het eerste voorbeeld is puur ter illustratie hoe het werkt. In de praktijk moet je altijd stil staan bij hackers en welke mogelijkheden zij hebben je site overhoop te gooien. Dit betekent dat je altijd input vanuit formulieren moet wantrouwen. Alleen dan kun je verder met de ingegeven data. Daar zijn talloze mogelijkheden voor te vinden. Je zoektocht naar de juiste validatie start alvast hier op de site.
Wij maken altijd graag een functie waarmee je de input kunt valideren. Dat betekent dat je moet weten hoe een functie werkt. De functie die je kunt starten om zelf een validatie te maken kan er als volgt uitzien:
function test_inputform($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
Testen van de input in je formulier
Met deze functie kun je zelf de data in je formulier testen op hackers. Hoe je dat kan doen?
if(isset($_POST['submit'])){
$naam = test_inputform($_POST['naam']);
$email = test_inputform($_POST['email']);
}
Door de functie te gebruiken zoals je ook al PHP functies gebruikt, kun je de input testen. De test_inputform( ) roept jouw eigen functie op en voert uit wat jij hebt gezegd dat er moet gebeuren. Daarmee zorg je ervoor dat de data geschoond wordt van witruimtes met de trim( ) functie, dat stripslashes( ) de verkeerde slashes verwijdert en dat htmlspecialchars( ) de teksten met html code omzet naar tekst waardoor deze code niets meer kan doen. Door dit nu in 1 functie te zetten, hoef je niet meer overal drie keer dezelfde code neer te zetten. Handig toch?
Validatie invoer
Wat je nu nog niet hebt gedaan, is testen van wat de gebruiker van je formulier invult ook correct is. Is bijvoorbeeld een nummer ook een nummer? Of een mailadres een mailadres? Daarvoor kun je nog allerlei tests doen voordat je de data verder zet in je code. Nogmaals, ook hier zijn legio oplossingen te bedenken. De meest basale oplossing dragen wij alvast aan om je een start te geven voor je eigen project.
- Wil je testen of een invoer ook daadwerkelijk een getal is? Gebruik dan filter_var($var, FILTER_VALIDATE_INT) als test. Daarmee kun je zien of de invoer daadwerkelijk een getal is of iets anders.
- Wil je testen of een invoer een email adres is? Gebruik dan filter_var($var, FILTER_VALIDATE_EMAIL) als test. Daarmee kun je zien of de invoer voldoet aan de eisen die worden gesteld aan een email adres.
De functie filter_var( ) geeft true of false terug als waarde. Dit is van belang om je vervolg in te zetten na de test. Is de uitkomst False, dan moet de code afbreken en de gebruiker van de site moet terug naar het formulier of iets anders waar er geen kwaad kan plaatsvinden. Is de uitkomst True dan mag de code doorgaan met wat je had bedacht op die plaats. Bijvoorbeeld een nieuwe bezoeker moet een geldig mail adres ingeven in de database, dan moet je dat eerst testen. Is er een adres ingegeven dat voldoet aan de normen van een mailadres, dan plaats je deze in je database. Anders stuur je de bezoeker terug naar het formulier.
Let op: het zegt niet of het een daadwerkelijk bestaand mailadres is! Maak deze denkfout niet. Het test alleen of de vorm juist is. Wil je zeker weten dat de gebruiker een bestaand mailadres ingeeft, dan zul je een code moeten bedenken waarin de gebruiker de mail moet bevestigen via de mailbox. Dat is de enige manier om zeker te zijn of het een echt bestaand mailadres is!
Hoe kan je dit uitwerken in je code?
// test email adres
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
if($email === false) {
// handel de code af met de foutmelding
header('location: index.php');
}
// test id via GET methode op getal
if (!filter_var($_GET['id'], FILTER_VALIDATE_INT)) {
header('location: index.php');
}
Nogmaals, er bestaan talloze manieren om de foutmeldingen te verwerken. Bovenstaande voorbeelden zijn voorbeelden hoe je op verschillende manieren zelf de input van gegevens kunt testen. De tweede test is in basis dezelfde code als de eerste, alleen vraagt veel minder tekst. Welke manier jij prettig vindt, moet je vooral zelf ontdekken.
Sanitize functies
Aan het begin van dit artikel heb je zelf een functie geschreven om input van je gebruikers op te schonen zodat er geen gevaarlijke dingen op je site kunnen gebeuren. PHP heeft zelf ook een aantal functies waarmee dit al gebeurt. Deze hoef je zelf niet meer te schrijven. De volgende kunnen nuttig zijn in de praktijk van het bouwen van je web projecten.
$email = $_POST['email'];
$sanitized = filter_var($email, FILTER_SANITIZE_EMAIL);
if(filter_var($sanitized, FILTER_VALIDATE_EMAIL) !== false) {
echo "Geldig mail adres";
}
Nieuw in dit stuk code is de tweede helft in de filter_var( ) waarin FILTER_SANITIZE_EMAIL staat. Deze functie zorgt er automatisch voor dat bijzondere codes in de invoer van je gebruiker geneutraliseerd worden. Daarmee voorkom je dat je web project aangevallen wordt door hackers. Dus naast validatie functies heb je ook sanitize functies waar je verder mee aan de slag kunt gaan.