PHP- formuliervalidatie
Dit en de volgende hoofdstukken laten zien hoe u PHP kunt gebruiken om formuliergegevens te valideren.
PHP-formuliervalidatie
Denk aan VEILIGHEID bij het verwerken van PHP-formulieren!
Deze pagina's laten zien hoe u PHP-formulieren verwerkt met het oog op veiligheid. Een goede validatie van formuliergegevens is belangrijk om uw formulier te beschermen tegen hackers en spammers!
Het HTML-formulier waar we in deze hoofdstukken aan gaan werken, bevat verschillende invoervelden: verplichte en optionele tekstvelden, keuzerondjes en een verzendknop:
De validatieregels voor het bovenstaande formulier zijn als volgt:
Field | Validation Rules |
---|---|
Name | Required. + Must only contain letters and whitespace |
Required. + Must contain a valid email address (with @ and .) | |
Website | Optional. If present, it must contain a valid URL |
Comment | Optional. Multi-line input field (textarea) |
Gender | Required. Must select one |
Eerst zullen we kijken naar de eenvoudige HTML-code voor het formulier:
Tekstvelden
De naam-, e-mail- en websitevelden zijn tekstinvoerelementen en het commentaarveld is een tekstgebied. De HTML-code ziet er als volgt uit:
Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="40"></textarea>
Radio knoppen
De geslachtsvelden zijn keuzerondjes en de HTML-code ziet er als volgt uit:
Gender:
<input type="radio" name="gender"
value="female">Female
<input type="radio" name="gender" value="male">Male
<input type="radio" name="gender" value="other">Other
Het formulierelement
De HTML-code van het formulier ziet er als volgt uit:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Wanneer het formulier is verzonden, worden de formuliergegevens verzonden met method="post".
Wat is de $_SERVER["PHP_SELF"] variabele?
De $_SERVER["PHP_SELF"] is een super globale variabele die de bestandsnaam van het momenteel uitgevoerde script retourneert.
Dus de $_SERVER["PHP_SELF"] stuurt de ingediende formuliergegevens naar de pagina zelf, in plaats van naar een andere pagina te springen. Op deze manier krijgt de gebruiker foutmeldingen op dezelfde pagina als het formulier.
Wat is de functie htmlspecialchars()?
De functie htmlspecialchars() converteert speciale tekens naar HTML-entiteiten. Dit betekent dat het HTML-tekens zoals < en > zal vervangen door < en >. Dit voorkomt dat aanvallers de code misbruiken door HTML- of Javascript-code (Cross-site Scripting-aanvallen) in formulieren te injecteren.
Grote opmerking over PHP-formulierbeveiliging
De variabele $_SERVER["PHP_SELF"] kan door hackers worden gebruikt!
Als PHP_SELF op uw pagina wordt gebruikt, kan een gebruiker een schuine streep (/) invoeren en vervolgens enkele Cross Site Scripting (XSS)-opdrachten uitvoeren.
Cross-site scripting (XSS) is een type kwetsbaarheid in de computerbeveiliging die doorgaans wordt aangetroffen in webtoepassingen. XSS stelt aanvallers in staat scripts aan de clientzijde te injecteren in webpagina's die door andere gebruikers worden bekeken.
Stel dat we het volgende formulier hebben op een pagina met de naam "test_form.php":
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
Als een gebruiker nu de normale URL in de adresbalk invoert, zoals "http://www.example.com/test_form.php", wordt de bovenstaande code vertaald naar:
<form method="post" action="test_form.php">
Tot nu toe, zo goed.
Houd er echter rekening mee dat een gebruiker de volgende URL in de adresbalk invoert:
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
In dit geval wordt de bovenstaande code vertaald naar:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
Deze code voegt een scripttag en een waarschuwingsopdracht toe. En wanneer de pagina wordt geladen, wordt de JavaScript-code uitgevoerd (de gebruiker ziet een waarschuwingsvenster). Dit is slechts een eenvoudig en onschuldig voorbeeld van hoe de variabele PHP_SELF kan worden misbruikt.
Houd er rekening mee dat elke JavaScript-code kan worden toegevoegd in de <script>-tag! Een hacker kan de gebruiker omleiden naar een bestand op een andere server, en dat bestand kan kwaadaardige code bevatten die de globale variabelen kan wijzigen of het formulier naar een ander adres kan verzenden om bijvoorbeeld de gebruikersgegevens op te slaan.
Hoe $_SERVER["PHP_SELF"] exploits te vermijden?
$_SERVER["PHP_SELF"] exploits kunnen worden vermeden door de functie htmlspecialchars() te gebruiken.
De formuliercode zou er als volgt uit moeten zien:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
De functie htmlspecialchars() converteert speciale tekens naar HTML-entiteiten. Als de gebruiker nu probeert de PHP_SELF-variabele te misbruiken, resulteert dit in de volgende uitvoer:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
De exploitpoging mislukt en er wordt geen schade aangericht!
Formuliergegevens valideren met PHP
Het eerste dat we zullen doen, is alle variabelen doorgeven via de functie htmlspecialchars() van PHP.
Als we de functie htmlspecialchars() gebruiken; als een gebruiker het volgende in een tekstveld probeert in te voeren:
<script>locatie.href('http://www.hacked.com')</script>
- dit zou niet worden uitgevoerd, omdat het als HTML-escape-code zou worden opgeslagen, zoals dit:
<script>location.href('http://www.hacked.com')</script>
De code kan nu veilig op een pagina of in een e-mail worden weergegeven.
We zullen ook nog twee dingen doen wanneer de gebruiker het formulier indient:
- Verwijder onnodige tekens (extra spatie, tab, nieuwe regel) uit de invoergegevens van de gebruiker (met de PHP-functie trim())
- Verwijder backslashes (\) uit de gebruikersinvoergegevens (met de PHP stripslashes() functie)
De volgende stap is om een functie te maken die alle controles voor ons doet (wat veel handiger is dan dezelfde code steeds opnieuw te schrijven).
We zullen de functie test_input() noemen.
Nu kunnen we elke $_POST-variabele controleren met de functie test_input(), en het script ziet er als volgt uit:
Voorbeeld
<?php
// define variables and set to empty values
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = test_input($_POST["name"]);
$email = test_input($_POST["email"]);
$website = test_input($_POST["website"]);
$comment = test_input($_POST["comment"]);
$gender = test_input($_POST["gender"]);
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
Merk op dat we aan het begin van het script controleren of het formulier is ingediend met $_SERVER["REQUEST_METHOD"]. Als de REQUEST_METHOD POST is, is het formulier verzonden en moet het worden gevalideerd. Als het niet is ingediend, slaat u de validatie over en geeft u een leeg formulier weer.
In het bovenstaande voorbeeld zijn echter alle invoervelden optioneel. Het script werkt prima, zelfs als de gebruiker geen gegevens invoert.
De volgende stap is om invoervelden verplicht te maken en zo nodig foutmeldingen te maken.