Smaklös validering php. Validering och datarensning med PHP. Registrera din egen valideringsregel

När du bygger webbapplikationer är det viktigt att ta säkerheten på allvar, speciellt när du ska hantera att hämta data från användare.

En allmän säkerhetsregel är att inte lita på någon, så du kan inte lita på att användarna alltid anger rätt värden i formulär. Till exempel, istället för att ange rätt e-postadress i fältet, kan användaren ange en felaktig adress, eller till och med vissa skadliga uppgifter.

När det kommer till att validera användardata kan det göras antingen på klientsidan (i webbläsaren) eller på serversidan.

Tidigare kunde validering på klientsidan endast göras med JavaScript. Men allt har förändrats (eller nästan förändrats), eftersom med hjälp av HTML5 kan validering göras i webbläsaren, utan att behöva skriva komplexa valideringsskript i JavaScript.

Formulärvalidering med HTML5

HTML5 ger en ganska robust mekanism baserad på följande taggattribut: typ, mönster och kräver. Med dessa nya attribut kan du ladda ner en del av datavalideringsfunktionerna till webbläsaren.

Låt oss titta på dessa attribut för att förstå hur de kan hjälpa till med formulärvalidering.

typ attribut

Detta attribut talar om vilket inmatningsfält som ska visas för databehandling, till exempel det välbekanta fältet som

Vissa inmatningsfält tillhandahåller redan standardvalideringsmetoder, utan att behöva skriva ytterligare kod. Den kontrollerar till exempel ett fält för att säkerställa att det angivna värdet matchar mallen för en giltig e-postadress. Om ett felaktigt tecken skrivs in i ett fält kan formuläret inte skickas in förrän värdet är rättat.

Testa att leka med e-postfältsvärdena i demon nedan.

Det finns även andra standardfälttyper, som , och för att validera nummer, webbadresser respektive telefonnummer.

Obs! Telefonnummerformaten varierar från land till land på grund av skillnader i antal siffror i telefonnummer och skillnader i format. Som ett resultat definierar specifikationen inte en algoritm för att kontrollera telefonnummer, så i skrivande stund stöds den här funktionen dåligt av webbläsare.

Lyckligtvis för oss kan validering av telefonnummer göras med hjälp av mönsterattributet, som tar ett reguljärt uttryck som ett argument, vilket vi ska titta på härnäst.

mönsterattribut

Mönsterattributet kommer sannolikt att få många frontend-utvecklare att hoppa av glädje. Det här attributet accepterar ett reguljärt uttryck (liknande JavaScript-formatet för reguljära uttryck) som kommer att användas för att kontrollera riktigheten av data som anges i fältet.

Reguljära uttryck är ett språk som används för att tolka och manipulera text. De används ofta för komplexa sök- och ersättningsoperationer, såväl som för att kontrollera att inmatade data är korrekta.

Idag ingår reguljära uttryck i de flesta populära programmeringsspråken, såväl som i många skriptspråk, redigerare, applikationer, databaser och kommandoradsverktyg.

Reguljära uttryck (RegEX) är ett kraftfullt, kortfattat och flexibelt verktyg för att matcha en textsträng, till exempel enskilda tecken, ord eller teckenmönster.

Genom att skicka ett reguljärt uttryck som värdet för mönsterattributet kan du ange vilka värden som är acceptabla för ett givet inmatningsfält, samt informera användaren om fel.

Låt oss titta på ett par exempel på att använda reguljära uttryck för att validera värdet på inmatningsfält.

Telefonnummer

Som tidigare nämnts stöds inte fälttypen tel helt av webbläsare på grund av inkonsekvenser i telefonnummerformat i olika länder.

Till exempel, i vissa länder är formatet för telefonnummer xxxx-xxx-xxxx, och själva telefonnumret blir ungefär så här: 0803-555-8205.

Det reguljära uttrycket som detta mönster matchar är: ^\d(4)-\d(3)-\d(4)$ . I kod kan detta skrivas så här:

Telefonnummer:

Alfanumeriska värden Attribut krävs

Detta är ett booleskt attribut som används för att indikera att värdet på ett givet fält måste fyllas i för att formuläret ska kunna skickas. När du lägger till detta attribut i ett fält kommer webbläsaren att kräva att användaren fyller i detta fält innan formuläret skickas.

Detta räddar oss från att implementera fältvalidering med JavaScript, vilket kan spara tid för utvecklare.

Till exempel: eller (för XHTML-kompatibilitet)

Alla demos du har sett ovan använder det obligatoriska attributet, så du kan prova det genom att försöka skicka in formuläret utan att fylla i några fält.

Slutsats

Webbläsarstöd för formulärvalidering är ganska bra, och för äldre webbläsare kan du använda polyfills.

Det är värt att notera att det är farligt att bara förlita sig på webbläsarsidans validering, eftersom dessa kontroller lätt kan kringgås av angripare eller botar.

Alla webbläsare stöder inte HTML5, och inte all data som skickas till ditt skript kommer från ditt formulär. Detta innebär att innan du slutligen accepterar data från användaren är det nödvändigt att kontrollera dess korrekthet på serversidan.

Det är mycket viktigt att få indata i ditt formulär validerade innan du tar in uppgifterna för inlämning av formuläret för vidare bearbetning. När det finns många fält i formuläret blir PHP-valideringsskriptet för komplext. Dessutom, eftersom du gör samma eller liknande validering för de flesta formulär som du gör, läggs bara för mycket dubbelarbete på formulärvalidering.

Om detta generiska PHP-formulärvalideringsskript

Detta generiska PHP-formulärvalideringsskript gör det mycket enkelt att lägga till valideringar till ditt formulär.

Vi skapar och associerar en uppsättning "valideringsdeskriptorer" till varje element i formuläret. Valideringsbeskrivningen är en sträng som anger vilken typ av validering som ska utföras. Till exempel betyder "req" krävs, "alfa" betyder att endast tillåta alfabetiska tecken och så vidare.

Varje fält i formuläret kan ha noll, en eller flera valideringar. Inmatningen ska till exempel inte vara tom, ska vara mindre än 25 tecken, ska vara alfanumerisk osv.

Du kan associera en uppsättning valideringsbeskrivningar för varje inmatningsfält i formuläret.

Ladda ner PHP-formulärvalideringsskriptet

Du kan ladda ner PHP-formulärets valideringsskript nedan:
Zip-filen innehåller formvalideringsskriptet formvalidator.php, dokumentation och användningsexempel.

Använder PHP-formulärvalideringsskriptet
  • Inkludera formvalidator.php i ditt formulärbearbetningsskript
  • require_once "formvalidator.php"
  • Skapa ett FormValidator-objekt och lägg till formulärvalideringsbeskrivningarna.
  • $validator = new FormValidator(); $validator->addValidation("Namn","req","Var vänlig fyll i Namn"); $validator->addValidation("E-post","e-post", "Indata för e-post bör vara ett giltigt e-postvärde"); $validator->addValidation("E-post","req","Fyll i e-post");

    Det första argumentet är namnet på inmatningsfältet i formuläret. Det andra argumentet är valideringsbeskrivningen som anger vilken typ av validering som krävs. Det tredje argumentet är felmeddelandet som ska visas om valideringen misslyckas.

  • Validera formuläret genom att anropa funktionen ValidateForm().
  • if(!$validator->ValidateForm()) ( echo "Validation Errors:"; $error_hash = $validator->GetErrors(); foreach($error_hash som $inpname => $inp_err) ( echo "

    $inpname: $inp_err

    \n"; ) ) Exempel

    Exemplet nedan kommer att göra idén tydligare

    Namn: E-post:

    Lägger till anpassad validering

    Om du vill lägga till en anpassad validering, som inte tillhandahålls av valideringsbeskrivningarna, kan du göra det. Här är stegen:

  • Skapa en klass för den anpassade valideringen och åsidosätt funktionen DoValidate().
  • class MyValidator utökar CustomValidator ( funktion DoValidate(&$formars,&$error_hash) ( if(stristr($formars["Comments"],"http://")) ( $error_hash["Comments"]="Inga webbadresser tillåtna i kommentarer"; return false; ) return true; ) )

  • Lägg till det anpassade valideringsobjektet
  • $validator = new FormValidator(); $validator->addValidation("Namn","req","Var vänlig fyll i Namn"); $validator->addValidation("E-post","e-post", "Indata för e-post bör vara ett giltigt e-postvärde"); $validator->addValidation("E-post","req","Fyll i e-post"); $custom_validator = new MyValidator(); $validator->AddCustomValidator($custom_validator);

    Den anpassade valideringsfunktionen kommer att anropas automatiskt efter andra valideringar.

    Tabell över valideringsbeskrivningar

    Här är listan över alla valideringsbeskrivningar:

    ValideringsbeskrivningAnvändande
    reqFältet ska inte vara tomt
    maxlen=???kontrollerar längden på inmatad data maximalt. Till exempel, om den högsta tillåtna storleken är 25, ange valideringsbeskrivningen som "maxlen=25"
    minlen=???kontrollerar längden på den angivna strängen till det minimum som krävs. exempel "minlen=5"
    alnumKontrollera informationen om den innehåller några andra tecken än alfabetiska eller numeriska tecken
    alnum_sTillåter endast alfabetiska, numeriska och blanksteg
    numKontrollera numeriska data
    alfaKontrollera alfabetiska data.
    alfa_sKontrollera alfabetisk data och tillåt mellanslag.
    e-postFältet är ett e-postfält och verifierar uppgifternas giltighet.
    lt=???
    mindre än=???
    Verifiera att data är mindre än värdet som skickats. Gäller endast för numeriska fält.
    exempel: om värdet ska vara mindre än 1000, ge en valideringsbeskrivning som "lt=1000"
    gt=???
    större än=???
    Verifiera att data är större än värdet som skickats. Gäller endast för numeriska fält.
    exempel: om värdet ska vara större än 10, ge en valideringsbeskrivning som "gt=10"
    regexp=???Kontrollera med ett reguljärt uttryck att värdet ska matcha det reguljära uttrycket.
    exempel: "regexp=^(1.20)$" tillåter upp till 20 alfabetiska tecken.
    välj inte=??Den här valideringsbeskrivningen är för valda indataobjekt (listor) Normalt kommer de valda listrutorna att ha ett objekt som säger "Välj en". Användaren bör välja ett annat alternativ än det här alternativet. Om värdet på det här alternativet är "Välj en" ska valideringsbeskrivningen vara "dontselect=Välj en"
    dontselectchkDenna valideringsbeskrivning är för kryssrutor. Användaren ska inte markera kryssrutan. Ange värdet på kryssrutan istället för ??
    Till exempel, dontselectchk=on
    bordeselchkDenna valideringsbeskrivning är för kryssrutor. Användaren ska markera den givna kryssrutan. Ange värdet på kryssrutan istället för ??
    Till exempel shouldselchk=on
    välj inte radioDenna valideringsbeskrivning är för radioknappar. Användaren ska inte välja den givna alternativknappen. Ange värdet på alternativknappen istället för ??
    Till exempel, dontselectradio=NO
    välj radioDenna valideringsbeskrivning är för radioknappar. Användaren ska välja den givna alternativknappen. Ange värdet på alternativknappen istället för ??
    Till exempel välj radio=ja
    selmin=??Välj minst n antal kryssrutor från en kryssrutegrupp.
    Till exempel: selmin=3
    ensamGör en radiogrupp obligatorisk. Användaren bör välja minst ett objekt från radiogruppen.
    eqelmnt=???jämför två element i formuläret och se till att värdena är desamma Till exempel "lösenord" och "bekräfta lösenord". Ersätt ??? med namnet på det andra inmatningselementet.
    Till exempel: eqelmnt=confirm_pwd

    Vi kommer att prata om validering av POST- eller GET-data, även om detta i princip också kan tillämpas på data som tas emot med andra metoder, såsom cookies. När du utvecklar en webbapplikation måste du skriva ett gränssnitt för att interagera med användare och naturligtvis skapa olika former för användare att skicka data till servern. det kan till exempel vara kommentarer. Jag tror att det är tydligt och uppenbart för alla att den mottagna informationen måste kontrolleras för att se om den motsvarar typen, storleken och specificerat intervall. Först och främst krävs detta för säkerheten för systemet, webbplatsen eller databasen, eftersom... Felaktigt överförd data eller en medvetet dåligt utformad begäran kan öppna åtkomst till en angripare.

    För det andra kan overifierade data, om de är felaktiga, orsaka instabil drift av skriptet, systemet eller hela servern. Därför måste all data kontrolleras och dubbelkontrolleras, kanske kommer någon att säga att det inte finns något behov av överdriven paranoia, men jag tror att det i denna fråga helt enkelt inte kan vara överdrivet.

    Lita inte på data som tas emot från användare, under några förevändningar, under några omständigheter. Det händer att vi helt enkelt är för lata för att skriva kod som kontrollerar mottagna data igen, eller så hoppas vi att de befintliga verifieringsmetoderna räcker, vilket gör att vi gör eftergifter till oss själva.

    En liten utvikning från ämnet:
    Att arbeta med projekt, utveckla och programmera hemsidor, skript och andra system tar upp nästan all min lediga tid (förutom arbetstid), med andra ord, jag gör det här arbetet så många timmar som möjligt om dagen. Då och då finns det ett behov av att testa något, för skojs skull eller bara för nyfikenheten. Som ett resultat blir webbplatser som gjorts i hast, med hjälp av hemgjorda motorer eller CMS av gamla versioner, liknande testlaboratorieråttor. Naturligtvis lider allt ovanstående av snett skriven kod, bristande datakontroll och vimlar helt enkelt av olika buggar. Faktiskt, i de flesta fall, under en timme av mina experiment på sådana webbplatser, lyckas jag hitta flera allvarliga sårbarheter, och de flesta av dem ligger i otillräcklig validering av mottagna data. På senare tid har detta ofta hittats i skript som behandlar POST-data som tas emot från JavaScript + Ajax.

    Tydligen tror programmerarna som skrev dessa skript med Ajax att eftersom alla förfrågningar sker i bakgrunden, utan användarens vetskap eller helt enkelt utan att ladda om sidan, behöver inte data kontrolleras särskilt.

    Som regel visar sig ganska många av dessa manus vara så fulla av hål att de utan större ansträngning lyckas göra ett större hål och svämma över sitt skal. naturligtvis enbart i syfte att experimentera och inget mer (administrationen av sådana webbplatser informeras alltid om befintliga sårbarheter).

    Jag tror att vikten av validering är tydlig för alla. Under en lång tid skrev jag samma kod varje gång, använde sedan mina egna dataverifieringsfunktioner, av vilka många var väldigt primitiva och som regel utspridda i olika delar av (inkluderade) filer. Snart började jag bekanta mig med PHP-ramverken Zend, CI, Kohana, som var och en implementerade sin egen klass för att validera data som jag lånat för mina projekt. Till slut bestämde jag mig för att skräddarsy en av CI-klasserna efter mina behov, men det visade sig att författaren till en av programmeringsbloggarna redan hade tagit hand om detta. Därefter delar jag med mig av hans verk, nämligen det modifierade CodeIgniter-biblioteket.

    Låt oss titta på följande kod:

    Visa kod PHP

    require_once "validator.class.php" ; $validator = new Validator() ; $validator -> set_rules ("namn" , "Ditt namn" , array ("required" => , "alpha" => ) ); $validator -> set_rules ("e-post", "Din e-post", array ("required" => "Fält %s krävs" , "valid_email" => ) ); if ($validator -> run () ) ( echo "Validering lyckades" ; ) else ( echo $validator -> get_string_errors () ; )

    Som du kan se från exemplet inkluderar vi klassfilen på första raden validator.calss.php till vårt manus. Därefter skapar vi en instans av klassen och sparar objektet till en variabel $validator.
    Använd sedan metoden $validator->set_rules($field, $label, $rules) ställ in fälten för validering.

    Denna metod tar tre parametrar:

  • $fält- namnet på valideringsfältet (värdet på namnattributet i taggen)
  • $label- namnet på valideringsfältet, kommer att infogas i felmeddelanden
  • $regler- en uppsättning valideringsregler, där valideringsregeln används som nyckel, och felmeddelandet för denna regel används som värde
  • När alla fält för validering är inställda startar vi valideraren med metoden $validator->run(). Om valideringen lyckades kommer denna metod att returnera värdet SANN, annars kommer det att återkomma om det finns några fel FALSK.

    Det finns tre sätt att ta emot felmeddelanden:

  • get_string_errors()- returnerar alla felmeddelanden som en sträng
  • get_array_errors()— returnerar alla meddelanden som en array, där fältnamnet används som nyckel, och felbeskrivningen för detta fält används som värde.
  • form_error($field)- returnerar ett felmeddelande för fältet som skickats som parametern $field
  • Som standard är felmeddelanden insvept i en tagg . För att ställa in din design, använd metoden set_error_delimiters($prefix, $suffix). Till exempel så här:

    Felmeddelanden kommer nu att visas som div med klass "fel"

    Som du kan se är allt väldigt enkelt.

    Visa kod PHP

    $validator -> set_error_delimiters ( " " , " " );

    För att ställa in valideringsregler kan du använda metoden set_rules($fields) passera en flerdimensionell associativ array. Låt oss titta på ett exempel:

    Visa kod PHP

    $rules = array ( array ( "field" => "name" , "label" => "Ditt namn" , "rules" => array ( "required" => "Fält %s krävs" , "alpha" = > "Fält %s får endast innehålla bokstäver" ), array ( "field" => "e-post" , "label" => "Din e-post", "rules" => array ( "required" => "Fält % s är required" , "valid_email" => "Fältet %s måste innehålla en giltig e-postadress" ) ) ) ; $validator -> set_rules ($rules) ;

    Som du kan se skrev jag ner samma valideringsregler som i det första exemplet, bara i form av en flerdimensionell associativ array. Du kan använda någon av de metoder som passar dig bäst i en given situation.

    Så, vilka valideringsregler stöder denna klass?

    Jag tog med till den här klassen de vanligaste valideringsreglerna som alla möter. Här är en komplett lista över dessa regler:

    nödvändigReturnerar FALSK om fältet är tomt
    heltalReturnerar FALSE om värdet inte är ett heltal
    flytaReturnerar FALSK om värdet inte är ett numeriskt värde
    valid_urlReturnerar FALSE om värdet inte är en giltig URL
    valid_emailReturnerar FALSE om värdet inte är en giltig e-postadress
    giltig_ipReturnerar FALSE om IP-adressen inte är giltig
    tändstickorReturnerar FALSE om elementet inte matchar värdet för ett annat fältelement
    alfaReturnerar FALSE om elementet innehåller mer än bara bokstäver
    valid_captchaReturnerar FALSE om värdet i sessionsfältet inte är lika med värdet i formulärfältet
    giltigt datumReturnerar FALSE om elementet innehåller ett ogiltigt datum

    De flesta av dessa regler använder filter, som blev tillgängliga i PHP 5.

    Om du vill kan du alltid utöka uppsättningen av regler för validering genom att lägga till de nödvändiga funktionerna i klassen Validator.

    För att få det bearbetade POST-datavärdet, använd följande metod:

    Visa kod PHP

    Vanligtvis anropas denna metod för att rensa formuläret vid framgångsrik bearbetning av formuläret.

    God kväll allihop (mer som natt – reds. anm.). Idag ska vi förbättra den lite. Låt oss först lära oss hur man gör formulärvalidering i PHP och gör vissa säkerhetsmanipulationer.

    Så titta på koden nedan och notera följande ändringar och följande anledningar till ändringarna. Jag markerade alla nya linjer med färg.

    Namnet på formulärfälten har ändrats. Du kanske frågar – varför i helvete behöver vi det här? Det är enkelt, jag ska svara dig. Så vitt jag vet, letar vissa spambots igenom webbplatser som letar efter formulär och fyller i dem baserat på namnen på dessa fält. I teorin, om de inte hittar en match, så går de hem, vilket är vad vi vill. Naturligtvis tycker jag inte att graden av detta skydd är särskilt bra, men det kommer inte att skada oss, och om skräpposten minskar med 1 bokstav så är det bra =).

    Kontrollera om e-postadressen är korrekt angiven. Linje 17 använder elseif-operatören, som kommer att kontrolleras om om ett positivt svar returneras till oss, det vill säga det stod att e-postadressen saknades alls, det vill säga att den inte angavs. Här använder vi preg_match-funktionen, som låter oss jämföra den angivna adressen med vanligt uttryck. Jag kanske kommer att skriva kort om reguljära uttryck senare, men för nu är det värt att veta att ett reguljärt uttryck skapar en sorts mall mot vilken vår sträng kontrolleras. Och om, i vårt fall, den angivna adressen inte matchar uttrycket, kommer ett fel att visas igen. Här är till exempel ytterligare ett par reguljära uttryck:
    |^[-а-яе\s\.,;:\?!]+$|i– detta reguljära uttryck låter dig bara använda det ryska alfabetet och vissa tecken som mellanslag, punkt, kommatecken, etc.
    #http://[-a-z0-9_.]+[-a-z0-9_:@&?=+,.!/~*’%$]*\.(html?|php)#i– och detta uttryck låter dig kontrollera rätt stavning av en adress på Internet.

    Därefter använder vi else-operatören, där all vår kod för att skicka ett brev redan har överförts. Du kan skapa verifieringsregler själv i vilken mängd som helst, lägg bara till nya om, till exempel för att kontrollera en e-postadress, så blir du nöjd.




    Kontaktpersonen:



    Kontakt e-post:



    Meddelande:






    Så här kan du validera dina PHP-formulär utan att behöva ta till något ovidkommande. Nästa gång i ett inlägg på ämnet formulär tror jag att validering av formulär i jQuery kommer att övervägas. Under tiden väntar jag på era kommentarer och önskemål. God natt och god morgon alla =).

    Detta och nästa kapitel visar hur man använder PHP för att validera formulärdata.

    PHP-formulärvalidering

    Tänk SÄKERHET när du bearbetar PHP-formulär!

    Dessa sidor visar hur man bearbetar PHP-formulär med säkerhet i åtanke. Korrekt validering av formulärdata är viktigt för att skydda ditt formulär från hackare och spammare!

    HTML-formuläret som vi kommer att arbeta med i dessa kapitel, innehåller olika inmatningsfält: obligatoriska och valfria textfält, alternativknappar och en skicka-knapp:

    Valideringsreglerna för formuläret ovan är följande:

    Fältvalideringsregler
    namn Nödvändig. + Får endast innehålla bokstäver och blanksteg
    E-post Nödvändig. + Måste innehålla en giltig e-postadress (med @ och .)
    Hemsida Frivillig. Om den finns måste den innehålla en giltig URL
    Kommentar Frivillig. Flerradigt inmatningsfält (textområde)
    Kön Nödvändig. Måste välja en

    Först kommer vi att titta på den vanliga HTML-koden för formuläret:

    Textfält

    Namn-, e-post- och webbplatsfälten är textinmatningselement och kommentarsfältet är ett textområde. HTML-koden ser ut så här:

    Namn:
    E-post:
    Hemsida:
    Kommentar:

    Radioknappar

    Könsfälten är radioknappar och HTML-koden ser ut så här:

    Kön:
    Kvinna
    Manlig
    Övrig

    Formelementet

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