Inleiding
In dit artikel ga ik een en ander uitleggen met betrekking tot het afhandelen van allerlei soorten user-input. Het niveau wat de programmeur nodig heeft ligt hier een stukje hoger dan in het artikel van Redox. Weliswaar dat iedere programmeur moet opletten met user-input. Het afhandelen van input is zeer belangrijk om te voorkomen dat je gehacked wordt met alle nare gevolgen van dien, of simpelweg dingen gebeuren die niet de bedoeling zijn. Een bezoeker kan zelfs onbewust al dingen 'kapot' maken zonder dat hij/zij weet wat er aan de hand is. Daarom is het erg belangrijk dat je controleert wat binnenkomt, en als dat fout is, een goede foutmelding geeft.
Waarom is het nodig formulieren te controleren?
Formulieren kunnen in 2 methoden worden verzonden: GET of POST. De eerste levert een URL op met iets in de richting van pagina.php?var1=inhoud1&var2=inhoud2 . Deze is in de browser van de bezoeker erg gemakkelijk te vervalsen door simpelweg een andere tekst te typen dan de bedoeling is. Echter in de afhandeling gebruik ik voor zowel GET als POST eenzelfde methode. Immers kunnen POST variabelen ook vervalst worden. Men kan namelijk het input formulier dupliceren en op een eigen host zetten. Indien er dan gezorgd wordt dat de action-URL van het formulier uitkomt op de pagina waar jij normaalgesproken dingen afhandelt, dan kan de inhoud dus compleet anders zijn. Vertrouw dus ook nooit op dingen zoals maxlength : een instelling waarmee je de maximale lengte van een formulier instelt. Buiten dat de inhoud fout zou zijn, is het ook nog eens een risico dat de verstuurde formulier inhoud een zogenaamde SQL injection uitvoert op jouw site. Dit komt erop neer dat de bezoeker de SQL query zo aanpast dat deze iets anders doet dan waar deze voor bedoeld was.
Voorbeeld
Er is een formulierveld dat de naam heeft 'gebruikersnaam'. Jij wilt niet hebben dat deze langer is dan 12 tekens, maar moet wél minimaal 4 tekens bevatten. Dit formulier wordt via POST verzonden, maar om het even duidelijk te maken zetten we de post variabele in de variabele $gebruikersnaam. Ook willen we beveiligen tegen HTML tekens, en een SQL injection. Verder worden witte ruimtes aan de voor- of achterkant eruit gefilterd
$gebruikersnaam = $_POST[gebruikersnaam]; // de POST variabele
$gebruikersnaam = mysql_real_escape_string($gebruikersnaam); // SQL-proof
$gebruikersnaam = htmlentities($gebruikersnaam); // HTML uitschakelen
$gebruikersnaam = trim($gebruikersnaam); // witte ruimtes wegfilteren
// beginnen met het controleren
If(empty($gebruikersnaam)){
Echo 'Vul een gebruikersnaam in!';
}elseif(strlen($gebruikersnaam) < '4'){
Echo 'Je gebruikersnaam dient minstens 4 tekens lang te zijn!';
}elseif(strlen($gebruikersnaam) > '12'){
Echo 'Je gebruikersnaam mag niet langer dan 12 tekens zijn!';
}else{
// OK!
Echo "De gebruikersnaam (".$gebruikersnaam.") is OK, en veilig!";
}
Functies: empty (kijkt of een variabele leeg is, of de waarde 0 heeft), strlen (geeft de lengte van de variabele door), mysql_real_escape_string (maakt een url SQL-proof), trim (haalt witte ruimtes aan de voor- en achterkant weg van een variabele) en htmlentities (zorgt ervoor dat de html wel zichtbaar is als html, maar niet als html wordt uitgevoerd).
Voorbeeld
Het is natuurlijk ook mogelijk dat een variabele alleen mag voorkomen in een array die jij hebt gemaakt. Dus jij geeft b.v. 3 waarden in: appel, peer, banaan. De bezoeker kan daaruit kiezen, maar als de bezoeker iets anders kies moet er een foutmelding komen.
$soort = $_POST[soort]; // de POST variabele
$keuzes = array('appel', 'peer', 'banaan'); // de keuzes
if(!in_array($soort, $keuzes)){
echo 'De keuze die gemaakt is is ongeldig!';
}else{
// OK!
Echo 'De keuze is geldig!';
}
Functies: array (maakt een gegevens blokje aan met daarin jouw keuzes (in dit voorbeeld dan)) en in_array (kijkt of een waarde in de array voorkomt).
Een paar andere voorbeelden van afhandeling
Natuurlijk heb je ook simpele manieren van afhandelen, zo is het zeer simpel te controleren wat het type variabele is. Enkele voorbeelden:
- Moet de variabele numeriek zijn? Controleer dit met de functie: is_numeric
- Moet de variabele een array zijn? Controleer dit met de functie: is_array
- Moet de variabele een string zijn? Controleer dit met e functie: is_string
Wat moet je allemaal controleren
De variabelen die aan te passen voor een gebruiker zijn als volgt:
- Post : $_POST[naam] (de kans is groot)
- Get : $_GET[naam] (de kans is zeer groot)
- Cookie : $_COOKIE[naam] (de kans is groot)
- Sessies: $_SESSION[naam] (de kans is klein, maar bestaat)
- Server: $_SERVER[naam] (de kans is klein, maar bestaat)
Sommigen zeggen ook dat het mogelijk is om een sessie ($_SESSION[naam]) te hijacken. Hieronder wordt verstaan dat jij de sessie van iemand anders steelt. Dit is in mijn ogen echter niet een vorm van input handeling, maar meer een vorm van de sessies aan een IP binden (meer daarover in de link onderaan dit artikel). Ook zijn variabelen zoals HTTP_REFERER aan te passen met bepaalde tools, dus zorg altijd dat je de input veilig maakt met mysql_real_escape_string alvorens het in de database te plaatsen of te gebruiken in een query. Indien je wilt voorkomen dat html tot uiting komt kun je gebruik maken van htmlentities (laat de html staan, maar verandert de characters zo dat het niet wordt uitgevoerd door de browser) of strip_tags (haalt de html uit de variabele).
Zo zijn er nog een hele hoop functies meer in PHP om dit te bekijken, deze staan grotendeels onder de categorie variabelen: (Log in om link te zien!)
Zoals jullie zien is dit slechts een introductie met de functies die je nodig zult hebben, ik raad je aan op zijn minst even dit artikel door te lezen en ook even een blik te werpen op de hackers guide van phpfreakz welke een stuk dieper ingaat op SQL injections, UBB hacks en andere mogelijke hack-methoden: (Log in om link te zien!)
Tips zijn welkom, het is mijn eerste artikel, en ik sta niet bekend om 's werelds beste uitleg