PHP- vorm validering
Hierdie en die volgende hoofstukke wys hoe om PHP te gebruik om vormdata te valideer.
PHP-vorm validering
Dink SEKURITEIT wanneer jy PHP-vorms verwerk!
Hierdie bladsye sal wys hoe om PHP-vorms te verwerk met sekuriteit in gedagte. Behoorlike bekragtiging van vormdata is belangrik om u vorm teen kuberkrakers en strooiposverslinders te beskerm!
Die HTML-vorm waaraan ons in hierdie hoofstukke gaan werk, bevat verskeie invoervelde: vereiste en opsionele teksvelde, radioknoppies en 'n indien-knoppie:
Die valideringsreëls vir die vorm hierbo is soos volg:
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 |
Eerstens sal ons kyk na die gewone HTML-kode vir die vorm:
Teksvelde
Die naam-, e-pos- en webwerfvelde is teksinvoerelemente, en die kommentaarveld is 'n teksarea. Die HTML-kode lyk soos volg:
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 knoppies
Die geslagsvelde is radioknoppies en die HTML-kode lyk soos volg:
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
Die vormelement
Die HTML-kode van die vorm lyk soos volg:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Wanneer die vorm ingedien word, word die vormdata met method="post" gestuur.
Wat is die $_SERVER["PHP_SELF"] veranderlike?
Die $_SERVER["PHP_SELF"] is 'n super globale veranderlike wat die lêernaam van die skrip wat tans uitvoer, terugstuur.
Dus, die $_SERVER["PHP_SELF"] stuur die ingediende vormdata na die bladsy self, in plaas daarvan om na 'n ander bladsy te spring. Op hierdie manier sal die gebruiker foutboodskappe op dieselfde bladsy as die vorm kry.
Wat is die htmlspecialchars() funksie?
Die htmlspecialchars()-funksie skakel spesiale karakters om na HTML-entiteite. Dit beteken dat dit HTML-karakters soos < en > sal vervang met < en >. Dit verhoed dat aanvallers die kode ontgin deur HTML- of Javascript-kode (Cross-site Scripting-aanvalle) in vorms in te spuit.
Groot nota oor PHP-vormsekuriteit
Die $_SERVER["PHP_SELF"] veranderlike kan deur kuberkrakers gebruik word!
As PHP_SELF in jou bladsy gebruik word, kan 'n gebruiker 'n skuinsstreep (/) invoer en dan 'n paar Cross Site Scripting (XSS) opdragte om uit te voer.
Cross-site scripting (XSS) is 'n tipe rekenaarsekuriteitskwesbaarheid wat tipies in webtoepassings voorkom. XSS stel aanvallers in staat om kliënt-kant skrip in te spuit in webblaaie wat deur ander gebruikers bekyk word.
Gestel ons het die volgende vorm in 'n bladsy met die naam "test_form.php":
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
Nou, as 'n gebruiker die normale URL in die adresbalk invoer soos "http://www.example.com/test_form.php", sal die bogenoemde kode vertaal word na:
<form method="post" action="test_form.php">
So ver so goed.
Neem egter in ag dat 'n gebruiker die volgende URL in die adresbalk invoer:
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
In hierdie geval sal die bogenoemde kode vertaal word na:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
Hierdie kode voeg 'n skripmerker en 'n waarskuwingsbevel by. En wanneer die bladsy laai, sal die JavaScript-kode uitgevoer word (die gebruiker sal 'n waarskuwingskassie sien). Dit is net 'n eenvoudige en onskadelike voorbeeld hoe die PHP_SELF veranderlike uitgebuit kan word.
Wees bewus daarvan dat enige JavaScript-kode binne die <script>-merker bygevoeg kan word! 'n Hacker kan die gebruiker na 'n lêer op 'n ander bediener herlei, en daardie lêer kan kwaadwillige kode bevat wat die globale veranderlikes kan verander of die vorm na 'n ander adres kan indien om die gebruikerdata te stoor, byvoorbeeld.
Hoe om $_SERVER["PHP_SELF"]-uitbuitings te vermy?
$_SERVER["PHP_SELF"]-uitbuitings kan vermy word deur die htmlspecialchars()-funksie te gebruik.
Die vormkode moet soos volg lyk:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Die htmlspecialchars()-funksie skakel spesiale karakters om na HTML-entiteite. As die gebruiker nou probeer om die PHP_SELF-veranderlike te ontgin, sal dit die volgende uitvoer tot gevolg hê:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
Die uitbuitingspoging misluk, en geen skade word gedoen nie!
Valideer vormdata met PHP
Die eerste ding wat ons sal doen, is om alle veranderlikes deur PHP se htmlspecialchars() funksie deur te gee.
Wanneer ons die htmlspecialchars() funksie gebruik; dan as 'n gebruiker probeer om die volgende in 'n teksveld in te dien:
<script>location.href('http://www.hacked.com')</script>
- dit sal nie uitgevoer word nie, want dit sou gestoor word as HTML-ontsnapte kode, soos volg:
<script>location.href('http://www.hacked.com')</script>
Die kode is nou veilig om op 'n bladsy of binne 'n e-pos vertoon te word.
Ons sal ook nog twee dinge doen wanneer die gebruiker die vorm indien:
- Stroop onnodige karakters (ekstra spasie, oortjie, nuwe reël) van die gebruikerinvoerdata (met die PHP trim()-funksie)
- Verwyder backslashes (\) van die gebruikerinvoerdata (met die PHP stripslashes() funksie)
Die volgende stap is om 'n funksie te skep wat al die kontrole vir ons sal doen (wat baie geriefliker is as om dieselfde kode oor en oor te skryf).
Ons sal die funksie test_input() noem.
Nou kan ons elke $_POST veranderlike nagaan met die test_input() funksie, en die script lyk soos volg:
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;
}
?>
Let daarop dat ons aan die begin van die skrif kontroleer of die vorm ingedien is deur $_SERVER["REQUEST_METHOD"] te gebruik. As die REQUEST_METHOD POST is, dan is die vorm ingedien - en dit behoort bekragtig te word. As dit nie ingedien is nie, slaan die validering oor en vertoon 'n leë vorm.
In die voorbeeld hierbo is alle invoervelde egter opsioneel. Die skrip werk goed, selfs al voer die gebruiker geen data in nie.
Die volgende stap is om invoervelde vereis te maak en foutboodskappe te skep indien nodig.