Sanitize og validere data med PHP-filtre

Datavalidering er en integrert del av arbeidet med skjemaer. Ikke bare kan ugyldige innleverte data føre til sikkerhetsproblemer, men det kan også ødelegge nettsiden din. I dag tar vi en titt på hvordan du fjerner ulovlige tegn og validerer data ved å bruke "filter_var" -funksjonen.


Et eksempel kan ses nedenfor. En bruker har skrevet inn teksten "Jeg har ikke en" som sin hjemmeside. Hvis disse dataene skulle bli innført i en database og senere hentet som en lenke, vil lenken bli brutt.

De fleste har en tendens til å tenke på data validering som en utrolig kjedelig prosess hvor man enten:

  • Sammenligner dataene de vil validere mot hver mulig kombinasjon de kan tenke på.
  • Trenger å finne en gylden Regular Expression som passer til enhver mulig kombinasjon.
  • En kombinasjon av de to.

Det er åpenbare problemer med ovennevnte:

  • Det er helt tidkrevende.
  • Det er en veldig stor sjanse for feil.

Heldigvis, begynner med versjon 5.2, har PHP inkludert en flott funksjon som heter filter_var som fjerner smerten i datavalidering.

filter_var i aksjon

filter_var vil gjøre, begge, sanitize og validere data. Hva er forskjellen mellom de to?

  • Sanitizing fjerner ulovlig karakter fra dataene.
  • Validering vil avgjøre om dataene er i riktig form.

Merk: hvorfor vaske og ikke bare validere? Det er mulig at brukeren ved et uhell skrev inn en feil karakter, eller kanskje det var fra en dårlig kopi og lim inn. Ved å sanitere dataene tar du ansvaret for å jakte på feilen av brukeren.

Hvordan å bruke filter_var

Ved hjelp av filter_var er utrolig enkelt. Det er bare en PHP-funksjon som tar to deler av data:

  • Variabelen du vil sjekke
  • Type sjekke å bruke

For eksempel vil underkoden fjerne alle HTML-koder fra en streng:

$ string = "

Hei Verden!

"; $ new_string = filter_var ($ streng, FILTER_SANITIZE_STRING); // $ new_string er nå" Hei, Verden! "

Her er et annet eksempel - denne gangen vanskeligere. Underkoden vil sikre at verdien av variabelen er en gyldig IP-adresse:

$ ip = "127.0.0.1"; $ valid_ip = filter_var ($ ip, FILTER_VALIDATE_IP); // $ valid_ip er TRUE $ ip = "127.0.1.1.1.1"; $ valid_ip = filter_var ($ ip, FILTER_VALIDATE_IP); // $ valid_ip er FALSK

Det er så enkelt det er å bruke filter_var. For en komplett liste over alle reglene du kan sjekke imot, se slutten av denne opplæringen.

Sanitiseringseksempel

Nedenfor er et raskt eksempel på sanitizing-innspill fra to felt: et e-postfelt og et startfelt. Dette eksemplet fjerner alle tegn som ikke skal forekomme i begge typer data.


"; hvis (isset ($ _ POST ['hjemmeside'])) echo filter_var ($ _ POST ['hjemmeside'], FILTER_SANITIZE_URL); ekko"

";?>
Epostadresse:


Hjemmeside:


Ved å bruke FILTER_SANITIZE_EMAIL og FILTER_SANITIZE_URL konstanter definert av PHP, gjetning arbeidet med å vite hvilke tegn som er ulovlige er borte.

Valideringseksempel

Bare fordi dataene er sanitert, sikrer ikke at det er riktig formatert. I eksemplet nedenfor behøvde ikke dataene å bli sanitert, men det er åpenbart at brukerinngang ikke er en e-post eller en URL.

For å sikre at dataene er riktig formatert, må den bekreftes.


"; else echo" $ email er IKKE en gyldig e-postadresse.

"; hvis (iss_dr en gyldig nettadresse.

"; else echo" $ hjemmeside er IKKE en gyldig nettadresse.

";?>
Epostadresse:


Hjemmeside:


Nå som dataene har blitt validert, kan du være sikker på at informasjonen som sendes inn, er akkurat det du leter etter.

Setter det sammen: En e-post send skjema

Nå som data sanitering og validering er dekket, vil vi sette disse ferdighetene til bruk med en rask e-post innsending skjema. Dette vil på ingen måte være av produksjonskvalitet - for eksempel, ingen form skal kreve en hjemmeside - men det vil fungere perfekt for denne opplæringen. Skjemaet tar 4 opplysninger:

  • Navn
  • Epostadresse
  • Hjemmeside
  • Budskap

Vi vil sanitere og validere mot alle 4 dataene og kun sende epost hvis de er alle gyldige. Hvis noe er ugyldig, eller hvis noen felter er tomme, vil skjemaet bli presentert til brukeren sammen med en liste over elementer som skal repareres. Vi returnerer også de sanitiserte dataene til brukeren dersom de ikke er klar over at enkelte tegn er ulovlige.

Trinn 1 - Opprette skjemaet

For det første trinnet må du bare opprette et skjemaelement med 5 felt: listen ovenfor og en sende-knapp:

Navn:


Epostadresse:


Hjemmeside:


Budskap:

Trinn 2 - Bestem om skjemaet ble sendt inn

Du kan sjekke for å se om et skjema ble sendt ved å se om send-knappen var "satt". Legg følgende kode over skjemaet ditt:

hvis (isset ($ _ POST ['Send']))))

Trinn 3 - Validerer navn og meldingsfelt

Siden både navn og meldingsfelt blir sanitisert og validert det samme, gjør vi dem sammen. Først må du kontrollere om et felt er tomt ved å gjøre følgende:

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

Neste, sanitize dem med FILTER_SANITIZE_STRING konstant

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

Til slutt må du kontrollere at de to feltene fortsatt ikke er tomme. Dette er for å sikre at etter at du har fjernet alle ulovlige tegn, er du ikke igjen med et tomt felt:

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

Vi vil ikke gjøre noen validering på disse to feltene, bare fordi det ikke er absolutt mulig å validere mot et navn eller en vilkårlig melding.

Den endelige koden ser slik ut:

hvis ($ _POST ['name']! = "") $ _POST ['name'] = filter_var ($ _ POST ['navn'], FILTER_SANITIZE_STRING); hvis ($ _POST ['name'] == "") $ errors. = 'Vennligst skriv inn et gyldig navn.

'; else $ errors. = 'Vennligst skriv inn navnet ditt.
'; hvis ($ _POST ['message']! = "") $ _POST ['message'] = filter_var ($ _ POST ['message'], FILTER_SANITIZE_STRING); hvis ($ _POST ['message'] == "") $ errors. = 'Vennligst skriv inn en melding for å sende.
'; else $ errors. = 'Vennligst skriv inn en melding for å sende.
';

Trinn 4 - Bekreft e-postfeltet

Epostfeltet vil bli sanitisert og validert akkurat som det var tidligere i opplæringen.

Først må du kontrollere at det ikke er tomt:

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

Neste, sanitize det:

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

Endelig, valider det som en ekte e-postadresse:

hvis (! filter_var ($ email, FILTER_VALIDATE_EMAIL))

Den endelige koden ser slik ut:

hvis ($ _POST ['email']! = "") $ email = filter_var ($ _ POST ['email'], FILTER_SANITIZE_EMAIL); hvis (! filter_var ($ email, FILTER_VALIDATE_EMAIL)) $ errors. = "$ email er IKKE en gyldig e-postadresse.

"; else $ errors. = 'Vennligst skriv inn din e-postadresse.
';

Trinn 5 - Bekreft startsiden

Igjen vil hjemmesidenfeltet sanitiseres og valideres på samme måte som tidligere i opplæringen.

Først må du kontrollere at det ikke er tomt:

hvis ($ _POST ['hjemmeside']! = "")

Deretter rengjør det og fjern eventuelle ulovlige tegn:

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

Endelig, valider det for å sikre at det er en sann nettadresse:

hvis (! filter_var ($ hjemmeside, FILTER_VALIDATE_URL))

Den endelige koden ser slik ut:

hvis ($ _POST ['hjemmeside']! = "") $ hjemmeside = filter_var ($ _ POST ['hjemmeside'], FILTER_SANITIZE_URL); hvis (! filter_var ($ hjemmeside, FILTER_VALIDATE_URL)) $ errors. = "$ hjemmesiden er IKKE en gyldig nettadresse.

"; ellers $ errors. = 'Vennligst skriv inn startsiden din.
';

Trinn 6 - Sjekk etter feil og send meldingen

Nå som vi har gått gjennom alle felt, er det på tide å enten rapportere feilene eller sende meldingen. Start med å anta at det ikke var noen feil:

hvis (! $ feil) 

Bygg deretter e-postmeldingen:

$ mail_to = '[email protected]'; $ subject = 'Ny post fra skjemainnlevering'; $ message = 'From:'. $ _POST ['navn']. "\ N"; $ message. = 'Email:'. $ _POST ['email']. "\ N"; $ message. = 'Hjemmeside:'. $ _POST ['hjemmeside']. "\ N"; $ message. = "Melding: \ n". $ _POST ['melding']. "\ N \ n";

Og til slutt, send meldingen:

post ($ til, $ emne, $ melding);

Men hvis det skulle oppstå feil, rapportere dem og få brukeren til å prøve igjen:

ekko '
'. $ feil. '
';

Det gjennomførte prosjektet ser slik ut:


'; else $ errors. = 'Vennligst skriv inn navnet ditt.
'; hvis ($ _POST ['email']! = "") $ email = filter_var ($ _ POST ['email'], FILTER_SANITIZE_EMAIL); hvis (! filter_var ($ email, FILTER_VALIDATE_EMAIL)) $ errors. = "$ email er IKKE en gyldig e-postadresse.

"; else $ errors. = 'Vennligst skriv inn din e-postadresse.
'; hvis ($ _POST ['hjemmeside']! = "") $ hjemmeside = filter_var ($ _ POST ['hjemmeside'], FILTER_SANITIZE_URL); hvis (! filter_var ($ hjemmeside, FILTER_VALIDATE_URL)) $ errors. = "$ hjemmesiden er IKKE en gyldig nettadresse.

"; ellers $ errors. = 'Vennligst skriv inn startsiden din.
'; hvis ($ _POST ['message']! = "") $ _POST ['message'] = filter_var ($ _ POST ['message'], FILTER_SANITIZE_STRING); hvis ($ _POST ['message'] == "") $ errors. = 'Vennligst skriv inn en melding for å sende.
'; else $ errors. = 'Vennligst skriv inn en melding for å sende.
'; hvis (! $ feil) $ mail_to = '[email protected]'; $ subject = 'Ny post fra skjemainnlevering'; $ message = 'From:'. $ _POST ['navn']. "\ N"; $ message. = 'Email:'. $ _POST ['email']. "\ N"; $ message. = 'Hjemmeside:'. $ _POST ['hjemmeside']. "\ N"; $ message. = "Melding: \ n". $ _POST ['melding']. "\ N \ n"; post ($ til, $ emne, $ melding); ekko "Takk for e-posten din!

"; else echo '
'. $ feil. '
'; ?>
Navn:


Epostadresse:


Hjemmeside:


Budskap:

Sammendrag

Jeg håper å lese denne opplæringen ga deg en god introduksjon til PHPs nye datafiltreringsfunksjoner. Det er fortsatt mange flere funksjoner og regler som ikke var dekket, så hvis du er interessert i å lære mer, vennligst se delen Data filtrering i PHP manualen.

  • Abonner på NETTUTS RSS-feed for flere daglige webutviklinger og artikler.