PHP formulærvalidering

Dette afsnit og det næste forklarer, hvordan man bruger PHP til at validere formulardata.

PHP formulærvalidering

Tips:Vær opmærksom på sikkerhed, når du håndterer PHP formulær!

Disse sider vil vise, hvordan man sikkert håndterer PHP formulær. Korrekt validering af HTML formulardata er vigtigt for at forhindre hackere og spam!

HTML formularen, som vi bruger senere, indeholder flere inputfelter: Obligatoriske og valgfrie tekstfelter, radioknapper samt indsendelsesknapper:

Formularen ovenfor bruger følgende valideringsregler:

Felt Valideringsregler
Navn Obligatorisk. Skal indeholde bogstaver og mellemrum.
E-mail Obligatorisk. Skal indeholde en gyldig e-mailadresse (inklusive @ og .).
Websted Valgfri. Hvis udfyldt, skal det indeholde en gyldig URL.
Kommentar Valgfri. Multilinje input felt (tekstboks).
Køn Obligatorisk. Vælg et element.

Lad os først se på formularens rene HTML-kode:

Tekstfelt

Navn, e-mail og websted er tekstfelt, kommentarfeltet er en tekstboks. HTML-koden er som følger:

Navn: <input type="text" name="name">
E-mail: <input type="text" name="email">
Websted: <input type="text" name="website">
Kommentar: <textarea name="comment" rows="5" cols="40"></textarea>

Radioknap

gender feltet er et radioknap, HTML-koden er som følger:

Køn:
<input type="radio" name="gender" value="female">Kvinde
<input type="radio" name="gender" value="male">Mand

Formularelementer

HTML-koden for formularen er som følger:

<form method="post" action="<?php echo htmlspecialchars(<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>);

Når denne formular indsendes, sendes formulardataene via method="post".

Hvad er $_SERVER["PHP_SELF"] variablen?

$_SERVER["PHP_SELF"] er en hyperglobal variabel, der returnerer filnavnet på den aktuelt udførte skript.

Derfor sender $_SERVER["PHP_SELF"] formulardataene til selve siden, ikke til en anden side. På denne måde kan brugeren få fejlmeddelelser på formularsiden.

Hvad er htmlspecialchars()-funktionen?

htmlspecialchars()-funktionen konverterer specialtegn til HTML-entiteter. Dette betyder, at HTML-tegn som < og > bliver erstattet med < og >. Dette forhindrer angribere i at udnytte HTML- eller JavaScript-kode (cross-site scripting-angreb) ved at injicere dem i formularen.

Vigtig advarsel om sikkerhed for PHP-formularer

$_SERVER["PHP_SELF"]-variablen kan udnyttes af hackere!

Hvis din side bruger PHP_SELF, kan brugeren indtaste en understregning og udføre cross-site scripting (XSS).

Tips:Cross-site scripting (XSS) er en type computersecuritysårbarhed, der ofte opdages i webapplikationer. XSS kan lade angribere indføre klientscripter i andre brugeres browservinduer.

Antag, at vi har en side ved navn "test_form.php" med følgende formular:

<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">

Nu, hvis brugeren går ind i en normal URL i adresselinjen: "http://www.example.com/test_form.php", vil ovenstående kode blive konverteret til:

<form method="post" action="test_form.php">

Indtil videre er alt normalt.

Men hvis brugeren indtaster følgende URL i adresselinjen:

http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

I dette tilfælde vil ovenstående kode blive konverteret til:

<form method="post" action="test_form.php"/><script>alert('hacked')</script>

Dette kode tilføjer et skript og en opfordring til kommando. Og når denne side indlæses, vil JavaScript-koden blive udført (brugeren vil se en opfordring til kommando). Dette er blot et simpelt og ufarligt eksempel på, hvordan PHP_SELF-variablen kan udnyttes.

Du bør være opmærksom på Skriptetikettet kan tilføje ethvert JavaScript-kode!Hackere kan redirigere brugeren til en fil på en anden server, hvor ondsindet kode kan ændre globale variabler eller sende formularen til en anden adresse for at gemme brugerdata, osv.

Hvordan undgår vi, at $_SERVER["PHP_SELF"] bliver udnyttet?

Ved at bruge htmlspecialchars() funktionen kan vi undgå, at $_SERVER["PHP_SELF"] bliver udnyttet

Formularkoden er som følger:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

htmlspecialchars() funktionen konverterer specialtegn til HTML-entiteter. Nu, hvis brugeren forsøger at udnytte PHP_SELF variablen, vil det føre til følgende output:

<form method="post" action="test_form.php/"><script>alert('hacked')</script>">

Utilgængelig, ingen skade!

Validering af formulardata med PHP

Det første, vi skal gøre, er at sende alle variabler gennem PHP's htmlspecialchars() funktion

Efter at have brugt htmlspecialchars() funktionen, hvis brugeren forsøger at indsende følgende indhold i et tekstfelt:

<script>location.href('http://www.hacked.com')</script>

- Koden vil ikke blive udført, fordi den vil blive gemt som escaped kode, sådan her:

<script>location.href('http://www.hacked.com')</script>

Nu er denne kode sikker at vise på siden eller i en e-mail

Når brugeren sender formularen, skal vi gøre to ting:

  1. (ved hjælp af PHP's trim() funktion) fjerner vi unødvendige tegn fra brugerens inputdata (overskydende mellemrum, tabulatorer, linjeskift)
  2. (ved hjælp af PHP's stripslashes() funktion) fjerner vi backslashes (\) fra brugerens inputdata

Næste trin er at oprette en kontrolfunktion (det er mere effektivt end at skrive kode gentagne gange)

Vi navngiver funktionen test_input()

Nu kan vi gennemgå hver $_POST-variabel med test_input() funktionen, scriptet ser sådan ud:

Eksempel

<?php
// Definer variabler og sæt dem til tom værdi
$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;
}
?>

Kør eksempel

Bemærk, at vi i begyndelsen af scriptet kontrollerede, om formularen blev indsendt med $_SERVER["REQUEST_METHOD"]. Hvis REQUEST_METHOD er POST, er formularen blevet indsendt - og den skal verificeres. Hvis den ikke er blevet indsendt, springes verifikationen over og en tom formular vises.

I det ovennævnte eksempel er alle inputfelter valgfri. Selvom brugeren ikke indtaster nogen data, fungerer scriptet normalt.

Næste skridt er at lave obligatoriske inputfelter og oprette fejlmeddelelser, der skal bruges, når det er nødvendigt.