PHP filter_var och filter_input


Inspiration ur boken ”PHP Object Oriented Solutions” av David Powers

Det finns sju funktioner som används för att validering av inmatning, men endast fyra som faktiskt gör något filtrering eller validering. Du styr vad som accepteras eller förkastas genom att en rad PHP konstanter som argument till funktionen. Det finns 50 konstanter förknippade med filterfunktioner, vilket gör dem mycket mångsidig, men samtidigt komplexa.

 

 

Filter funktioner

  • filter_has_var() Kontrollerar om en variabel av en viss inmatnings typ existerar
  • filter_id () Returnerar ID-nummer för ett specifierat filter
  • filter_input () Ta inmatning utanför skriptet och filtrera den
  • filter_input_array () Ta flera inmatningskällor utanför skriptet och filtrerar dem
  • filter_list () Returnerar en array med alla filter som stöds
  • filter_var_array () Ta flera variabler och filtrera dem
  • filter_var () Ta en variabel och filtrera den

Tre funktioner – filter_has_var(), filter_input(), och filter_input_array() – är utformad för att fungera med superglobal arrayer, till exempel $_POST och $_GET. Men istället för att använda superglobal variabeln, måste man hänvisa till arrayen med motsvarande filterkonstant.

 

Konstanter » superglobal

Dessa filter funktioner är utformad för att fungera med superglobal arrayer, till exempel $_POST och $_GET. Men istället för att använda superglobal variabler, måste du hänvisa till den med motsvarande filterkonstant.

De konstanter och deras motsvarigheter listas här nedanför:

  • INPUT_COOKIE     $_COOKIE variabler
  • INPUT_ENV           $_ENV variabler
  • INPUT_GET            $_GET variabler
  • INPUT_POST         $_POST variabler
  • INPUT_REQUEST  $_REQUEST variabler
  • INPUT_SERVER     $_SERVER variabler
  • INPUT_SESSION   $_SESSION variable

 

filter_input och filter_var

Två av filter-funktionerna används för validering av enskilda variabler: filter_input() och filter_var(). Skillnaden mellan dem är att filter_input() hanterar en variabel som har kommit från ett av superglobal array, till exempel $_POST; filter_var() hanterar en variabel som har kommit från någon annan källa, som till exempel en databas eller en include-fil.

 

Filter argument

filter_input funktionen tar fyra argument, nämligen:

  • $source: Detta indikerar superglobal array som innehåller variabeln som du vill filtrera. Du måste använda en av de konstanter som anges i tabell 4-2, till exempel, INPUT_POST.
  • $variableName: Detta är namnet på variabeln som du vill filtrera.
  • $filter: Det här är filtret som du vill använda. Du måste ange en av filterkonstanter . Alternativt kan du använda filter_id () med namnet på filtret. Om det här argumentet utelämnas, använder PHP standardfiltret.
  • $alternativ: Detta är en valfri array som innehåller eventuella tillval eller flaggor som du vill använda.

filter_var() tar inte den första av dessa argument ($source), men de övriga tre är desamma som för både filter_input(). och filter_var().
Eftersom båda funktionerna är väldigt lika varandra ska jag gå igenom båda under den här guiden, men låt oss börja med att experimentera med filter_var() genom att hårdkoda in vissa värden.

 

2 flaggor för alla filter

  • Flagga FILTER_REQUIRE_ARRAY

Detta avvisar alla värden som inte är en array. När denna flagga är satt innebär att filtret tillämpas på samtliga delar av arrayen. Det fungerar även på flerdimensionella arrayer, tillämpar filtret rekursivt till varje nivå.

  • Flagga FILTER_REQUIRE_SCALAR

Detta avvisar varje värde som inte skalär. Med andra ord måste värdet vara en av följande datatyper: Boolean, heltal, flyttal, resurs (till exempel en databas länk eller fil handtag), eller sträng.

 

Konstanter, Flaggor & Alternativ

Nu ska jag gå igenom konstanter, flaggor och alternativ som används av filter funktioner för validering av data.

Syntaxen ser ut så här:

 

Längst ner på sidan finns en textfält där du kan testa dom olika konstanterna med filter_var.

 

  • Filterkonstant FILTER_VALIDATE_BOOLEAN
  • Flagga FILTER_NULL_ON_FAILURE

När det används utan flagga, returnerar den true för ‘1’, ‘true’, ‘on’, och ”yes”; annars returners FALSE. Om FILTER_NULL_ON_FAILURE flaggan är satt, returnerar falskt endast för ‘0’, ‘falsk’, ‘av’, ”nej”, och en tom sträng; Returneras NULL för alla icke-booleska värden.

Exempel:

Resultatet:


  • Filterkonstant FILTER_VALIDATE_EMAIL

Kollar att ett värde matchar med email formatet.

Exempel:

Resultatet:


  • Filterkonstant FILTER_VALIDATE_FLOAT
  • Alternativ decimal
  • Flagga FILTER_FLAG_ALLOW_THOUSAND

Söker efter ett flyttal eller heltal; returnerar false för någon annan datatyp. Decimal alternativ tillåter användning av ett kommatecken som decimal. Inställning på flaggan accepterar siffror innehållande en tusentalsavgränsare (komma är standard, men punkt används när decimal är satt till ‘,’). Funktionens returnerade värde alltid fråntagen tusentalsavgränsare, med en punkt som decimaltecken.

Exempel:

Resultatet:


  • Filterkonstant FILTER_VALIDATE_INT
  • Alternativ min_range max_range
  • Flaggor FILTER_FLAG_ALLOW_OCTALFILTER_FLAG_ALLOW_HEX

Checks for an integer; returns false for any other data type. Specify the minimum and maximum acceptable values as an associative array using min_range and max_range (you can set just one or both together). Flags permit octal and hexadecimal numbers. Rejects numbers with a decimal point, even if the fraction is 0, for example, 10.0.

Exempel:

Resultatet:


  • Filterkonstant FILTER_VALIDATE_IP
  • Flaggor FILTER_FLAG_IPV4, FILTER_FLAG_IPV6, FILTER_FLAG_NO_PRIV_RANGE, FILTER_FLAG_NO_RES_RANGE

Kontrollerar att ett värde är en IP-adress. Flaggor låter dig ange endast IPv4 eller IPv6, eller inte från privata eller reserverade intervall.

Exempel:

Resultatet:


  • Filterkonstant FILTER_VALIDATE_REGEXP
  • Alternativ regexp

Validerar ett värde mot en Perl- kompatibelt reguljärt uttryck. Hela värdet returneras, inte bara den del som matchar det reguljära uttrycket.


  • Filterkonstant FILTER_VALIDATE_URL
  • Flaggor FILTER_FLAG_SCHEME_REQUIRED, FILTER_FLAG_HOST_REQUIRED, FILTER_FLAG_PATH_REQUIRED, FILTER_FLAG_QUERY_REQUIRED

Kontrollerar att ett värde överensstämmer med formatet på en webbadress, eventuellt med nödvändiga komponenter som anges med flaggor.

Exempel:

Resultatet:


  • Filterkonstant FILTER_SANITIZE_STRING
  • Flaggor FILTER_FLAG_NO_ENCODE_QUOTES, FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_ENCODE_LOW, FILTER_FLAG_ENCODE_HIGH, FILTER_FLAG_ENCODE_AMP

Tar bort alla taggar, inklusive HTML, PHP och XML. Flaggorna ange alternativ för att ta bort eller avkoda specialtecken med en ASCIIvärde mindre än 32 (LOW) eller större än 127 (HIGH), lämna citationstecken okodade och avkoda et-tecken (&).

Exempel:

Resultatet:


  • Filterkonstant FILTER_SANITIZE_STRIPPED

Detta är en alias av FILTER_SANITIZE_STRING som var precis innan den här.


  • Filterkonstant FILTER_SANITIZE_EMAIL

Tar bort alla tecken förutom bokstäver, nummer och dessa tecken:

Exempel på tecken som tas bort;

Kod-exempel:

Resultatet:


  • Filterkonstant FILTER_SANITIZE_URL

Tar bort alla tecken förutom bokstäver, nummer och

Exempel:

Resultatet:


  • Filterkonstant FILTER_SANITIZE_ENCODED
  • Flaggor FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_ENCODE_LOW, FILTER_FLAG_ENCODE_HIGH

URL-avkodar en sträng. Att ställa in flaggor tar valfritt bort eller kodar tecken med ASCII-värde på mindre än 32 (LOW) eller större än 127 (HIGH).

Exempel:

Resultatet:


  • Filterkonstant FILTER_SANITIZE_MAGIC_QUOTES

”Escapar” enkla och dubbla citationstecken, genom att sätta in ett bakstreck framför dem på samma sätt som de addslashes() funktion.


  • Filterkonstant FILTER_SANITIZE_NUMBER_FLOAT
  • Flaggor:
  1. FILTER_FLAG_ALLOW_FRACTION – Tillåter fraktions-avskiljare (som . )
  2. FILTER_FLAG_ALLOW_THOUSAND -Tillåter tusentals-avskiljare (som , )
  3. FILTER_FLAG_ALLOW_SCIENTIFIC -Tillåter vetenskaplig notation (som e och E)

Tar bort alla tecken utom siffror och plus och minustecken. Flaggorna valfritt tillåter en decimalbråk, tusentalsavgränsare, och vetenskaplig notation (med versaler eller gemener E). Decimalkommat och tusentalsavgränsare lämnas orörda. Om FILTER_FLAG_ALLOW_FRACTION inte är inställd, skall decimalkommat avlägsnas, men inte andelen, till exempel, 10,5 blir 105.

Exempel:

Resultatet:

Ett till exempel med flaggan FILTER_FLAG_ALLOW_FRACTION:

Resultatet:


  • Filterkonstant FILTER_SANITIZE_NUMBER_INT

Tar bort alla tecken utom siffror och plus och minustecken. Den decimal avlägsnas, om den finns, men inte andelen, till exempel, 10,0 blir 100.

Exempel:

Resultatet:


  • Filterkonstant FILTER_SANITIZE_SPECIAL_CHARS
  • Flaggor FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_ENCODE_HIGH

Omvandlas till HTML-entiteter enkla och dubbla citationstecken, <,>, &, och tecken med en ASCIIvärde mindre än 32. När Ställa in flaggor valfritt avlägsnar tecken med ASCIIvärde mindre än 32 (LOW) eller större än 127 (HIGH ), eller kodar tecken med ASCII värde större än 127.

Exempel:

Resultatet:

Om du kollar på källkoden för sidan, så ser det ut så här:


  • Filterkonstant FILTER_CALLBACK
  • Alternativ användar-definierad funktion eller metod

Anropar en användar-definierad function för att filtrera data.


  • Filterkonstant  FILTER_UNSAFE_RAW
  • Flaggor FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_ENCODE_LOW, FILTER_FLAG_ENCODE_HIGH, FILTER_FLAG_ENCODE_AMP

Gör ingenting.

Flaggorna anger alternativ för att ta bort eller koda specialtecken med en ASCIIvärde mindre än 32 (LOW) eller större än 127 (HIGH) och koda et-tecken (&).

Exempel:

Resultatet:

..och om man kollar på källkoden ser man det här:

FILTER_UNSAFE_RAW exempel med flaggan FILTER_FLAG_STRIP_HIGH

Resultatet:

FILTER_UNSAFE_RAW exempel med flaggan FILTER_FLAG_STRIP_LOW

Resultatet:


Här nedanför kan du testa dom olika filterkonstanterna med filter_input() metoden. Koden kommer från boken ”PHP Object Oriented Solutions” av David Powers:


filter_id

Du kan även använda filter_id istället för konstanterna så här:

…och du får fram en lista över namn du kan använda med filter_list() metoden:


Om vi tar en titt på filterkonstanten FILTER_SANITIZE_NUMBER_FLOAT med följande kod:

Detta kommer att ge resultatet:

Det här oväntade resultat får man eftersom sanerings filtret endast avlägsnar olagliga eller oönskade tecken. För att styra den mer exakt, måste man använda lämpliga flaggor och alternativ. Så, låt oss ta en titt på hur du lägger till flaggor och alternativ till ett filter.


Flaggor & alternativ

Det är här saker och ting börjar bli komplicerade. Formatet på den sista valfria argumentet till filter_input() och filter_var() beror på om vi vill använda flaggor, alternativ, eller både och. Dom tillgängliga alternativen och flaggorna har vi precis gått igenom. Syntaxen för att lägga till flaggor och alternativ ser likadan ut för både filter_input() och filter_var():

Man kan lägga till flera flaggor åt gången, som då separeras med vertikalstreck|. Så för att tillåta tusentals-avskiljare på förra exemplet gör man så här:


Alternativ

Alternativ måste vara en flerdimensionell associativ array med nyckel värde par, där arrayn i den översta nivån har nyckeln ”option”. Så ta t.ex. FILTER_VALIDATE_INT som accepterar alternativen min_range och max_range. För att acceptera heltal bara mellan 10 och 100 (inklusive), lägger man till dessa alternativ:

Alternativen är alltså den här arrayn:


Både Flaggor & Alternativ

För att lägga till både flaggor och alternativ måste flaggorna in i den multidimensionella arrayn. Så för att tillåta tusentals-avskiljare på förra exemplet gör man på det här sättet:

 

Att tänka på – Även om FILTER_VALIDATE_FLOAT accepterar siffror i europeisk stil med komma istället för punkt, när lämpligt alternativ och flagga är inställd, så blir värdet som returneras av filtret alltid med en punkt som decimal och den avlägsnar eventuella tusentalsavgränsare. Ett blanksteg accepteras inte som tusentalsavgränsare.


Flera variabler åt gången

För det mesta, behöver du filtreringen och valideringen att hantera flera variabler åt gången. För att undvika att behöva anropa filter_input() eller filter_var() funktionerna flera gånger finns motsvarande funktioner som kan bearbeta många variabler på samma gång: filter_input_array() och filter_var_array().

filter_input_array() tar följande argument:

  • $source: Detta indikerar vilken superglobal array som innehåller dom variabler man vill filtrera. M måste använda en av de konstanter som vi gick igenom i början.
  • $instructions: Detta är en valfri flerdimensionell array som anger hur variabler ska filtreras. Om det här argumentet utelämnas, används standardfiltret tillämpas (jag går igenom hur man ställer in standardfiltret lite senare i artikeln).

 

filter_var_array() tar följande argument:

  • $data: En array som innehåller de variabler man vill filtrera eller validera.
  • $instructions: Samma som för filter_input_array().

 

Sättet man skapar den flerdimensionella arrayn för det andra argumentet är mycket hur man ställer in flaggorna och alternativen för att filtrera enskilda variabler. På den översta nivån av arrayen bör det finnas ett element för var och en av de variabler som skall bearbetas. Det värde som tilldelas varje variabel ska antingen vara en filterkonstant eller en array som innehåller en kombination av följande: ”filter”, ”options” och ”flags”.

Här ser du exempel på alla varianter:

…och för att använda det här med filter_input_array() istället byter man bara ut den första parametern till en av superglobal konstanterna på det här sättet:

Som du ser blir detta väldigt krångligt och man råkar garanterat ut för en massa undantag (exeption). Nu kommer OOP till undsättning och man kan gömma den här komplexiteten bakom en klass.


Ställa in standard

Om du använder en typ av filter övervägande, kan du ange en standardfilter och även standardflaggor. Det finns tre ställen du kan göra detta: i php.ini; eller, om du använder en Apache-server, i Apaches konfigurationsfil httpd.conf, eller en .htaccess fil.

Konfigurations direktiv som behöver ändras är följande:
filter.default : Detta bör följas av en sträng med ett av namnen som genereras av filter_list() (se högre upp i artikeln).
filter.default_flags : Detta bör vara en av flaggkonstanterna. För att ställa in fler än en flagga, separera varje konstant med en enda vertikalstreck |. För att ställa in standardinställningarna i php.ini, tar man bort semikolonet från början av raden som innehåller den direktiv man vill använda, och lägger värdet efter likhetstecknet. Med följande direktiv ställer du in som standard att konvertera till HTML-entiteter, enkla och dubbla citattecken, större än, mindre än, och et-tecken &, medan standardflaggor bort alla tecken med ASCII värde på mindre än 32 eller större än 127:

För att ställa in värdena i httpd.conf eller en .htaccess fil, används php_value, följt av direktivet och dess värde som en mellanslags separerad lista såhär:

Okej, nu räcker det för den här gången. Vi fortsätter nästa gång med att bygga en valideringsklass. Tack för visat intresse och koda smart 😉

Lämna en kommentar

E-postadressen publiceras inte. Obligatoriska fält är märkta *