PHP-formulärvalidering

Detta avsnitt och nästa avsnitt förklarar hur man använder PHP för att validera formulardata.

PHP-formulärvalidering

Tips:Vänligen var uppmärksam på säkerheten när du hanterar PHP-formulär!

Dessa sidor kommer att visa hur man säkert hanterar PHP-formulär. Appropianat validering av HTML-formulärdata är viktigt för att förhindra hackare och spam!

HTML-formulär som vi kommer att använda senare innehåller flera typer av inmatningsfält: obligatoriska och valfria textfält, radiobuttons och submit-knappar:

Detta formulär använder följande valideringsregler:

Fält Valideringsregler
Namn Obligatorisk. Skall innehålla bokstäver och blanksteg.
E-post Obligatorisk. Skall innehålla en giltig e-postadress (innehåller @ och .).
Webbplats Valfritt. Om det fylls i, måste det innehålla en giltig URL.
Kommentar Valfritt. Flerradig inmatningsfält (textbok).
Gender Obligatorisk. Välj ett alternativ.

Först tittar vi på den rena HTML-koden för detta formulär:

Textfält

name, email och website är textinmatningsfält, comment-fältet är en textbok.

Namn: <input type="text" name="name">
E-post: <input type="text" name="email">
Webbplats: <input type="text" name="website">
Kommentar: <textarea name="comment" rows="5" cols="40"></textarea>

Radiobutton

gender-fältet är ett radiobutton, HTML-koden ser ut så här:

Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male

Formulärelement

HTML-koden för formuläret ser ut så här:

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

När detta formulär skickas, skickas formulardata via method="post".

Vad är $_SERVER["PHP_SELF"]-variabeln?

$_SERVER["PHP_SELF"] är en hyperglobal variabel som returnerar filnamnet på den aktuella skripten som körs.

Därför skickar $_SERVER["PHP_SELF"] formulardata till sidan själv, inte till en annan sida. På detta sätt kan användaren få felmeddelanden på formulärsidan.

Vad är funktionen htmlspecialchars()?

Funktionen htmlspecialchars() konverterar specialtecken till HTML-entiteter. Detta innebär att HTML-tecken som < och > kommer att ersättas med < och >. På detta sätt kan angripare förhindras från att använda HTML eller JavaScript-kod (cross-site scripting-attacker) för att utnyttja koden.

Viktiga tips om säkerhet för PHP-formulär

Variabeln $_SERVER["PHP_SELF"] kan utnyttjas av hackare!

Om din sida använder PHP_SELF, kan användaren lägga till understreckningar och köra cross-site scripting (XSS).

Tips:Cross-site scripting (XSS) är en typ av säkerhetslucka i datorer, som ofta förekommer i webbtillämpningar. XSS låter angripare lägga till klient-skript i andra användares webbsidor.

Anta att vi har en sida som heter "test_form.php" med följande formulär:

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

Nu, om användaren går till den vanliga URL:en i adressfältet: "http://www.example.com/test_form.php", kommer ovanstående kod att omvandlas till:

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

Till nu är allt som det bör vara.

Men om användaren skriver in följande URL i adressfältet:

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

I detta fall kommer ovanstående kod att omvandlas till:

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

Denna kod lägger till ett skript och ett kommandot för att visa en varning. Och när denna sida laddas, körs JavaScript-koden (användaren ser en varningsruta). Detta är bara ett enkelt och oskyldigt exempel på hur PHP_SELF-variabeln kan användas.

Du bör vara medveten om Inlåtet <script>-tag kan lägga till vilket JavaScript-kod som helst!Hackare kan omdirigera användaren till en fil på en annan server, där skadlig kod kan ändra globala variabler eller skicka formulär till andra adresser för att spara användardata, och så vidare.

Hur undviker vi att $_SERVER["PHP_SELF"] utnyttjas?

Genom att använda funktionen htmlspecialchars() kan vi undvika att $_SERVER["PHP_SELF"] utnyttjas.

Formulärcode är som följer:

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

Funktionen htmlspecialchars() konverterar specialtecken till HTML-entities. Nu, om användaren försöker utnyttja PHP_SELF-variabeln, kommer följande utdata att uppstå:

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

Oanvändbar, ingen skada!

Validera formulärdata med PHP

Det första vi måste göra är att skicka alla variabler genom PHP-funktionen htmlspecialchars().

Efter att vi har använt funktionen htmlspecialchars(), om användaren försöker skicka följande innehåll i ett textfält:

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

- Koden kommer inte att köras eftersom den kommer att sparas som escape-kod, liknande detta:

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

Nu är denna kod säker att visa på sidan eller i e-post.

När användaren lämnar in formuläret, måste vi göra två saker:

  1. (Genom att använda PHP-funktionen trim()) Ta bort onödiga tecken från användarens inmatade data (överskott av tomma tecken, tabulatorer, radbrytningar)
  2. (Genom att använda PHP-funktionen stripslashes()) Ta bort backstegstecknen (\) från användarens inmatade data

Nästa steg är att skapa en kontrollfunktion (detta är mer effektivt än att skriva kod om och om igen).

Vi döper funktionen till test_input().

Nu kan vi kontrollera varje $_POST-variabel med hjälp av funktionen test_input() på följande sätt:

Exempel

<?php
// Definiera variabler och sätt till tomma värden
$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 exempel

Observera att vi kontrollerar om formuläret har skickats med $_SERVER["REQUEST_METHOD"] i början av skriptet. Om REQUEST_METHOD är POST har formuläret skickats - och det bör valideras. Om det inte har skickats hoppas vi över valideringen och visar ett tomt formulär.

I det ovanstående exemplet är alla inmatningsfält valfria. Även om användaren inte har angett något data fungerar skriptet normalt.

Nästa steg är att skapa obligatoriska inmatningsfält och skapa felmeddelanden som behövs.