Sanitize och validera data med PHP-filter

Datavalidering är en integrerad del av arbetet med formulär. Inte bara kan ogiltiga inlämnade data leda till säkerhetsproblem, men det kan också bryta din webbsida. Idag tar vi en titt på hur man tar bort olagliga tecken och validerar data med hjälp av funktionen "filter_var".


Ett exempel kan ses nedan. En användare har skrivit in texten "Jag har inte en" som sin hemsida. Om denna data skulle skrivas in i en databas och sedan senare hämtas som en länk, skulle länken brytas.

De flesta människor tenderar att tänka på data validering som en oerhört tråkig process där man antingen:

  • Jämför de data de vill validera mot varje möjlig kombination som de kan tänka sig.
  • Försöker hitta en gyllene Regular Expression som matchar alla möjliga kombinationer.
  • En kombination av de två.

Det finns uppenbara problem med ovanstående:

  • Det är helt tidskrävande.
  • Det finns en mycket hög risk för fel.

Lyckligtvis, med början i version 5.2 har PHP inkluderat en bra funktion som heter filter_var som tar bort smärtan av data validering.

filter_var i aktion

filter_var kommer att göra, båda, sanera och validera data. Vad är skillnaden mellan de två?

  • Sanitizing tar bort eventuella olagliga tecken från data.
  • Valideringen avgör om data är i korrekt form.

Notera: varför sanitize och inte bara validera? Det är möjligt att användaren av misstag skrev in en fel karaktär eller kanske det var från en dålig kopia och klistra in. Genom att sanera uppgifterna tar du ansvaret för att jaga efter misstaget bort från användaren.

Hur man använder filter_var

Använder sig av filter_var är otroligt enkelt. Det är helt enkelt en PHP-funktion som tar två bitar av data:

  • Variabeln du vill kontrollera
  • Typ av kontroll att använda

Till exempel kommer underkoden att ta bort alla HTML-taggar från en sträng:

$ string = "

Hej världen!

"; $ new_string = filter_var ($ string, FILTER_SANITIZE_STRING); // $ new_string är nu" Hej, Värld! "

Här är ett annat exempel - den här gången svårare. Nedanstående kod kommer att se till att värdet på variabeln är en giltig IP-adress:

$ ip = "127.0.0.1"; $ valid_ip = filter_var ($ ip, FILTER_VALIDATE_IP); // $ valid_ip är TRUE $ ip = "127.0.1.1.1.1"; $ valid_ip = filter_var ($ ip, FILTER_VALIDATE_IP); // $ valid_ip är FALSE

Så enkelt är det att använda filter_var. För en fullständig lista över alla regler du kan kontrollera mot, se slutet på denna handledning.

Sanitiserande exempel

Nedan är ett snabbt exempel på sanitizing-inmatning från två fält: ett e-postfält och ett hemsidafält. I det här exemplet tas bort alla tecken som inte ska förekomma i någon typ av data.


"; om (isset ($ _ POST ['hemsida'])) echo filter_var ($ _ POST ['hemsida'], FILTER_SANITIZE_URL)

";?>
E-postadress:


Hemsida:


Genom att använda FILTER_SANITIZE_EMAIL och FILTER_SANITIZE_URL konstanter definierade av PHP, gissningsarbetet med att veta vilka tecken som är olagliga är borta.

Valideringsexempel

Bara för att dataen är sanitiserad garanterar inte att den är korrekt formaterad. I exemplet nedan behövde data inte saneras, men det är uppenbart att användarinmatningen inte är ett e-postmeddelande eller en URL.

För att säkerställa att data formateras korrekt måste den valideras.


"; annars echo" $ email är INTE en giltig e-postadress.

"; om (isset ($ _ POST ['hemsida'])) $ hemsida = filter_var ($ _ POST ['hemsida'], FILTER_SANITIZE_URL) en giltig webbadress.

"; annars echo" $ hemsida är INTE en giltig webbadress.

";?>
E-postadress:


Hemsida:


Nu när uppgifterna har validerats kan du vara säker på att informationen som lämnas är precis vad du letar efter.

Att sätta allt ihop: En e-postformulär

Nu när sanitets- och validering av data har blivit täckt, lägger vi till dessa färdigheter med ett snabbt formulär för inlämning av e-post. Det kommer inte att vara av produktionskvalitet - till exempel, ingen form skulle kräva en hemsida - men det fungerar perfekt för denna handledning. Blanketten tar 4 delar av informationen:

  • namn
  • E-postadress
  • Hemsida
  • Meddelande

Vi kommer att sanera och validera mot alla 4 data och bara skicka e-post om de är alla giltiga. Om något är ogiltigt, eller om några fält är tomma, visas formuläret för användaren tillsammans med en lista över objekt som ska åtgärdas. Vi skickar också saniterade data till användaren om de inte vet om vissa tecken är olagliga.

Steg 1 - Skapa formuläret

För det första steget, skapa helt enkelt ett formelement med 5 fält: den ovan angivna och en inmatningsknapp:

Namn:


E-postadress:


Hemsida:


Meddelande:

Steg 2 - Bestäm om formuläret skickades in

Du kan kontrollera om en formulär skickades genom att se om inlämningsknappen var "inställd". Placera följande kod ovanför din blankett:

om (isset ($ _ POST ['Submit']))))

Steg 3 - Validera namn- och meddelandefältet

Eftersom både namn- och meddelandefälten kommer att saneras och valideras samma, gör vi dem tillsammans. Kontrollera först om fältet är tomt genom att göra följande:

om ($ _POST ['name'] == "") om ($ _POST ['message'] == "")

Sanitera sedan dem med FILTER_SANITIZE_STRING konstant

$ _POST ['name'] = filter_var ($ _ POST ['name'], FILTER_SANITIZE_STRING); $ _POST ['message'] = filter_var ($ _ POST ['message'], FILTER_SANITIZE_STRING);

Slutligen kontrollera att de två fälten fortfarande inte är tomma. Det här är för att säkerställa att efter att ha tagit bort alla olagliga tecken lämnas inte ett tomt fält:

om ($ _POST ['name'] == "") om ($ _POST ['message'] == "")

Vi kommer inte göra någon validering på dessa två fält helt enkelt för att det inte finns något absolut sätt att validera mot ett namn eller godtyckligt meddelande.

Den slutliga koden ser ut så här:

om ($ _POST ['name']! = "") $ _POST ['name'] = filter_var ($ _ POST ['name'], FILTER_SANITIZE_STRING); om ($ _POST ['name'] == "") $ errors. = 'Var god ange ett giltigt namn.

'; else $ errors. = 'Vänligen ange ditt namn.
'; om ($ _POST ['message']! = "") $ _POST ['message'] = filter_var ($ _ POST ['message'], FILTER_SANITIZE_STRING); om ($ _POST ['message'] == "") $ errors. = 'Vänligen ange ett meddelande att skicka.
'; else $ errors. = 'Vänligen ange ett meddelande att skicka.
';

Steg 4 - Bekräfta e-postfältet

E-postfältet kommer att saneras och valideras precis som tidigare i handledningen.

Kontrollera först att det inte är tomt:

om ($ _POST ['email']! = "")

Sanitera sedan det:

$ email = filter_var ($ _ POST ['email'], FILTER_SANITIZE_EMAIL);

Slutligen, validera det som en riktig e-postadress:

om (! filter_var ($ email, FILTER_VALIDATE_EMAIL))

Den slutliga koden ser ut så här:

om ($ _POST ['email']! = "") $ email = filter_var ($ _ POST ['email'], FILTER_SANITIZE_EMAIL); om (! filter_var ($ email, FILTER_VALIDATE_EMAIL)) $ errors. = "$ email är INTE en giltig e-postadress.

"; else $ errors. = 'Vänligen ange din e-postadress.
';

Steg 5 - Validera startsidans fält

Återigen kommer hemmafältet att saneras och valideras på samma sätt som tidigare i handledningen.

Kontrollera först att det inte är tomt:

om ($ _POST ['hemsida']! = "")

Sanitera sedan och ta bort eventuella olagliga tecken:

$ homepage = filter_var ($ _ POST ['hemsida'], FILTER_SANITIZE_URL)

Slutligen, validera det för att se till att det är en riktig webbadress:

om (! filter_var ($ hemsida, FILTER_VALIDATE_URL))

Den slutliga koden ser ut så här:

om ($ _POST ['homepage']! = "") $ homepage = filter_var ($ _ POST ['hemsida'], FILTER_SANITIZE_URL); om (! filter_var ($ hemsida, FILTER_VALIDATE_URL)) $ errors. = "$ hemsida är INTE en giltig webbadress.

"; else $ errors. = 'Vänligen ange din hemsida.
';

Steg 6 - Kontrollera fel och skicka meddelandet

Nu när vi har gått igenom alla fält är det dags att antingen rapportera fel eller skicka meddelandet. Börja med att anta att det inte fanns några fel:

om (! $ fel) 

Skapa sedan e-postmeddelandet:

$ mail_to = '[email protected]'; $ subject = 'Ny post från formulärinsändning'; $ message = 'From:'. $ _POST ['namn']. "\ N"; $ message. = 'Email:'. $ _POST ['email']. "\ N"; $ message. = 'Hemsida:'. $ _POST ['hemsida']. "\ N"; $ message. = "Meddelande: \ n". $ _POST ['meddelande']. "\ N \ n";

Och slutligen, skicka meddelandet:

post ($ till, $ ämne, $ meddelande);

Men om det fanns några fel rapporterar du dem och har användaren försök igen:

eko "
'. $ fel. '
';

Det färdiga projektet ser så här ut:


'; else $ errors. = 'Vänligen ange ditt namn.
'; om ($ _POST ['email']! = "") $ email = filter_var ($ _ POST ['email'], FILTER_SANITIZE_EMAIL); om (! filter_var ($ email, FILTER_VALIDATE_EMAIL)) $ errors. = "$ email är INTE en giltig e-postadress.

"; else $ errors. = 'Vänligen ange din e-postadress.
'; om ($ _POST ['hemsida']! = "") $ hemsida = filter_var ($ _ POST ['hemsida'], FILTER_SANITIZE_URL); om (! filter_var ($ hemsida, FILTER_VALIDATE_URL)) $ errors. = "$ hemsida är INTE en giltig webbadress.

"; else $ errors. = 'Vänligen ange din hemsida.
'; om ($ _POST ['message']! = "") $ _POST ['message'] = filter_var ($ _ POST ['message'], FILTER_SANITIZE_STRING); om ($ _POST ['message'] == "") $ errors. = 'Vänligen ange ett meddelande att skicka.
'; else $ errors. = 'Vänligen ange ett meddelande att skicka.
'; om (! $ fel) $ mail_to = '[email protected]'; $ subject = 'Ny post från formulärinsändning'; $ message = 'From:'. $ _POST ['namn']. "\ N"; $ message. = 'Email:'. $ _POST ['email']. "\ N"; $ message. = 'Hemsida:'. $ _POST ['hemsida']. "\ N"; $ message. = "Meddelande: \ n". $ _POST ['meddelande']. "\ N \ n"; post ($ till, $ ämne, $ meddelande); echo "Tack för din email!

"; annars echo '
'. $ fel. '
'; ?>
Namn:


E-postadress:


Hemsida:


Meddelande:

Sammanfattning

Jag hoppas att läsa den här handledningen gav dig en bra introduktion till PHP: s nya datafiltreringsfunktioner. Det finns fortfarande många fler funktioner och regler som inte omfattas, så om du är intresserad av att lära dig mer, se avsnittet Datafiltrering i PHP-manualen.

  • Prenumerera på NETTUTS RSS-flödet för fler dagliga webbutvecklingstoppar och artiklar.