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:
Det finns uppenbara problem med ovanstående:
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
kommer att göra, båda, sanera och validera data. Vad är skillnaden mellan de två?
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.
filter_var
Använder sig av filter_var
är otroligt enkelt. Det är helt enkelt en PHP-funktion som tar två bitar av data:
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.
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)
";?>
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.
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.
";?>
Nu när uppgifterna har validerats kan du vara säker på att informationen som lämnas är precis vad du letar efter.
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:
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.
För det första steget, skapa helt enkelt ett formelement med 5 fält: den ovan angivna och en inmatningsknapp:
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']))))
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.
';
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.
';
Å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.
';
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. ''; ?>
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.