Validerat, validerat... och validerat! Jämföra datavaliderare i PHP. Validatorklass för POST-datavalidering Hänsynslös validering php

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 kommer att visa 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ält Valideringsregler
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:

">

När formuläret skickas skickas formulärdata med method="post".

Vad är variabeln $_SERVER["PHP_SELF"]?

$_SERVER["PHP_SELF"] är en superglobal variabel som returnerar filnamnet för det skript som körs för närvarande.

Så, $_SERVER["PHP_SELF"] skickar inskickade formulärdata till själva sidan, istället för att hoppa till en annan sida. På så sätt kommer användaren att få felmeddelanden på samma sida som formuläret.

Vad är htmlspecialchars()-funktionen?

Funktionen htmlspecialchars() konverterar specialtecken till HTML-enheter. Detta innebär att det kommer att ersätta HTML-tecken som< and >med< and >. Detta förhindrar angripare från att utnyttja koden genom att injicera HTML- eller Javascript-kod (Cross-site Scripting-attacker) i formulär.

Stor anmärkning om PHP Form Security

Variabeln $_SERVER["PHP_SELF"] kan användas av hackare!

Om PHP_SELF används på din sida kan en användare ange ett snedstreck (/) och sedan några Cross Site Scripting-kommandon (XSS) att köra.

Cross-site scripting (XSS) är en typ av datorsäkerhetssårbarhet som vanligtvis finns i webbapplikationer. XSS gör det möjligt för angripare att injicera skript på klientsidan på webbsidor som visas av andra användare.

Anta att vi har följande form på en sida som heter "test_form.php":

">

Om en användare nu anger den normala webbadressen i adressfältet som "http://www.example.com/test_form.php", kommer ovanstående kod att översättas till:

Än så länge är allt bra.

Tänk dock på att en användare anger följande URL i adressfältet:

http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert("hacked")%3C/script%3E

I det här fallet kommer ovanstående kod att översättas till:

Den här koden lägger till en skripttagg och ett varningskommando. Och när sidan laddas kommer JavaScript-koden att köras (användaren kommer att se en varningsruta). Detta är bara ett enkelt och ofarligt exempel på hur variabeln PHP_SELF kan utnyttjas.

Var medveten om det valfri JavaScript-kod kan läggas till i ">

Exploateringsförsöket misslyckas och ingen skada är skedd!

Validera formulärdata med PHP

Det första vi kommer att göra är att skicka alla variabler genom PHPs htmlspecialchars() funktion.

När vi använder funktionen htmlspecialchars(); sedan om en användare försöker skicka in följande i ett textfält:

Detta skulle inte köras, eftersom det skulle sparas som HTML-kodad kod, så här:

Koden är nu säker att visas på en sida eller i ett e-postmeddelande.

Vi kommer också att göra ytterligare två saker när användaren skickar in formuläret:

  1. Ta bort onödiga tecken (extra blanksteg, tab, nyrad) från användarens indata (med PHP trim()-funktionen)
  2. Ta bort snedstreck (\) från användarens indata (med PHP stripslashes()-funktionen)

Nästa steg är att skapa en funktion som gör all kontroll åt oss (vilket är mycket bekvämare än att skriva samma kod om och om igen).

Vi kommer att namnge funktionen test_input().

Nu kan vi kontrollera varje $_POST-variabel med funktionen test_input() och skriptet ser ut så här:

exempel

// definiera variabler och ställ in på tomma värden
$name = $email = $gender = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") (
$namn = test_input($_POST["namn"]);
$email = test_input($_POST["e-post"]);
$website = test_input($_POST["webbplats"]);
$comment = test_input($_POST["kommentar"]);
$gender = test_input($_POST["kön"]);
}

function test_input($data) (
$data = trim($data);
$data = stripsslashes($data);
$data = htmlspecialchars($data);
returnera $data;
}
?>

kör exempel »

Observera att i början av skriptet kontrollerar vi om formuläret har skickats med $_SERVER["REQUEST_METHOD"]. Om REQUEST_METHOD är POST, har formuläret skickats - och det bör valideras. Om det inte har skickats, hoppa över valideringen och visa ett tomt formulär.

Men i exemplet ovan är alla inmatningsfält valfria. Skriptet fungerar bra även om användaren inte anger någon data.

Nästa steg är att göra inmatningsfält obligatoriska och skapa felmeddelanden om det behövs.


I förra artikeln lovade jag att skriva en jämförelse av mitt eget bibliotek med andra tillgängliga lösningar, så idag ska vi titta på validering med Aura.Filter , Respect Validation , Sirius Validation och Valitron .


Låt oss föreställa oss att vi har någon form av public service under utveckling, som går ut på att registrera användare för full tillgång till alla funktioner. Registreringsformuläret kommer därför att innehålla följande fält:

  1. namn. Måste innehålla exakt två ord, där det första är användarens förnamn och det andra är efternamnet.
  2. logga in. Om ett värde godkänns måste det endast innehålla latinska bokstäver, bindestreck och understreck.
  3. e-post. Måste innehålla en giltig e-postadress.
  4. Lösenord. Måste vara installerat och inte längre än 64 tecken.
  5. gick med på. En typisk kryssruta som användaren måste markera för att bekräfta sitt samtycke till användarvillkoren.

Så vi har fem fält som användaren måste fylla i för att registrera sig i vår imaginära tjänst. Låt oss föreställa oss att vi fick helt ogiltig data som indata:


$data = [ "name" => "Albert", // Bör vara två ord "login" => "@lbert", // "Förbjudet" tecken @ "email" => "något fel", // Detta bör vara e-post "lösenord" =>

Aura.Filter

Validering med Aura.Filter börjar med en filterfabrik. Vi måste skapa ett så kallat "ämnesfilter", eftersom vi kommer att validera en array, inte ett individuellt värde.

Att definiera reglerna

använd Aura\Filter\FilterFactory; $filter = (ny FilterFactory)->newSubjectFilter(); $filter->validate("namn") ->isNotBlank() ->is("two_words") ->setMessage("Namnet måste vara två ord."); $filter->validate("login") ->isBlankOr("alnum") ->setMessage("Om du anger en inloggning måste den endast innehålla latinska tecken."); $filter->validate("email") ->isNotBlank() ->is("email") ->setMessage("Ange en giltig e-postadress."); $filter->validate("lösenord") ->isNotBlank() ->is("strlenMax", 64) ->setMessage("Ange ett lösenord."); $filter->validate("accorded") ->is("callback", function($subject, $field) ( return $subject->($field) === true; ))->setMessage("Du behöver godkänner användarvillkoren.");

Som du kan se är beskrivningen av reglerna ganska enkel. Aura.Filter tillhandahåller en hel uppsättning användbara regler direkt, och några av dem användes i exemplet ovan:

  1. isNotBlank-metoden. Anger att fältet inte kan vara null.
  2. alnum. Denna regel tillåter endast latinska bokstäver.
  3. e-post. Och så tydligt :)
  4. strlenMax. Anger att fältet inte får överskrida längden som anges av det andra argumentet för metoden is.
  5. ring tillbaka. Denna typ av regel liknar stängningar från Kontrolio. Det låter dig definiera en regel som en stängning. Till denna stängning skickar Aura.Filter "ämne", vår samling av data från formuläret och ett fält, i det här fallet överens .

Du kanske har märkt att jag inte specificerade two_words-regeln. Naturligtvis finns det ingen sådan regel i Aura.Filter, så vi måste skapa den. Som dokumentationen säger görs detta med en separat klass för regeln:


/** * Regeln som validerar användarnamnet. * Användarnamnet består av två ord: förnamn och efternamn, åtskilda med ett mellanslag. */ class UserNameRule ( /** * Validerar användarnamnet. * * @param objekt|array $subject * @param string $field * @param int $max * * @return bool */ public function __invoke($subject, $field , $max = null) ( $value = $subject->($field); if (! is_scalar($value)) ( return false; ) return (bool) preg_match("/^+\s+$/u", $värde); ) )

Det andra steget är att låta filterfabriken veta om vår nya regel. Det görs genom att skicka det första argumentet som en rad regler till filterfabriken:


Nästa steg är att meddela Aura.Filter att vi har skapat en ny regel och vill använda den. Detta görs genom att skicka en rad regler till det första fabriksargumentet:


använd Aura\Filter\FilterFactory; $rules = [ "two_words" => funktion() (retur ny UserNameRule; ) ]; $filter = (ny FilterFactory($rules))->newSubjectFilter();

Nu kan vår two_words-regel användas precis som vilken annan regel som helst från standardfördelningen.

Respons

Som ni minns är indata som vi validerar helt ogiltigt, eftersom varje fält innehåller ett felaktigt värde eller inte alls innehåller det. Därför antas det att vi som ett resultat av validering kommer att få fel och motsvarande meddelanden om dem.


Vi validerar med Aura.Filter enligt följande:


$valid = $filter->apply($data); if (! $valid) ( $failures = $filter->getFailures(); $messages = $failures->getMessages(); )

$meddelanden en array skrivs, så vi behöver två kapslade foreach för att visa meddelanden:


    $errors) (foreach ($errors som $error) ( printf("", $error); ) ) ?>

Respektera validering

Det andra biblioteket jag använde i jämförelse är en relativt populär lösning som heter Respect Validation. Eftersom folk litar på henne tror jag att det finns något att se där.


För experimentets renhet kommer vi att använda samma datauppsättning som definierades i början när vi jämför bibliotek:


använd Respect\Validation\Validator som v; $data = [ "name" => "Albert", // Bör vara två ord "login" => "@lbert", // "Förbjudet" tecken @ "email" => "något fel", // Detta bör be an e-mail "password" => "" // Inget lösenord alls // "godkänd" finns inte i arrayen eftersom användaren inte har markerat rutan ];

Att definiera reglerna

Precis som med Aura.Filter behöver vi vår egen valideringsregel för användarnamnet, så låt oss börja med det:


namnutrymme MyNamespace; använd Respect\Validation\Rules\AbstractRule; class UserNameRule utökar AbstractRule ( public function validate($input) (retur (bool) preg_match("/^+\s+$/u", $input); ) )

API:et för externa regler är nästan identiskt med Aura.Filter, bara metoden bekräfta() istället för magi __åberopa(). Det verkade för mig, detta API, mer enkelt och begripligt. Tja, det är närmare Kontrolio :)


Jag hittade inget omnämnande av detta i dokumentationen, men utöver själva regeln är det nödvändigt att skapa en egen typ av undantag för den. Undantagsklassens namn måste bestå av regelklassens namn och en postfix Undantag.


använd Respect\Validation\Exceptions\NestedValidationException; class UserNameRuleException utökar NestedValidationException ( // )

Äntligen kan vi validera våra uppgifter. Först skickar vi vår nya regel till valideraren så att den känner till den, så att vi kan använda den i framtiden. I Respect Validation görs detta genom att anropa metoden med() med överföringen av namnutrymmet där de icke-standardiserade reglerna finns.


v::with("MyNamespace\\");

Nu alla icke-standardiserade regler som finns i namnutrymmet mitt namnutrymme, kommer att "identifieras" av valideraren. Nästa steg är att beskriva de regler som krävs och utföra validering.


v::attribute("namn", v::användarnamnRule()) ->attribut("login", v::alnum("-_")) ->attribut("email", v::email()) ->attribute("lösenord", v::notEmpty()->stringType()->length(null, 64)) ->attribute("överenskommen", v::trueVal()) ->assert((objekt) $data);

Lägg märke till hur vi tillämpar vår regel på attributet namn. Här har namnet på regelklassen omvandlats till namnet på valideringsmetoden. Resten av reglerna är i allmänhet intuitiva.


Separat är det värt att nämna varför vi tar med arrayen $data till föremålet. Faktum är att Respect Validation tar objekt som indata, inte arrayer. Detta bör beaktas när du utvecklar med detta bibliotek.

Respons

Till skillnad från Aura.Filter ger Respect-validatorn ett undantag när valideringen misslyckas. Och detta undantag innehåller valideringsfelmeddelanden. Därför bör exemplet som just visas skrivas så här:


försök ( v::with("RespectValidationExample\\"); v::attribute("name", v::userNameRule()) ->attribute("login", v::alnum("-_")) - >attribut("email", v::email()) ->attribute("lösenord", v::notEmpty()->stringType()->length(null, 64)) ->attribut("överenskommen", v::trueVal()) ->assert((object) $data); ) catch (NestedValidationException $ex) ( $messages = $ex->getMessages(); )

Använder sig av getMessages(), kommer vi att få en platt uppsättning av alla meddelanden som valideraren samlade in under valideringsprocessen. Genom att dumpa en array får vi något sånt här:


array(5) ( => string(29) “Datavalidering misslyckades för %s” => string(60) “inloggning får endast innehålla bokstäver (a-z), siffror (0–9) och “-_”” => sträng (25) “e-post måste vara giltig e-post” => sträng(26) “lösenord får inte vara tomt” => sträng(32) “Attributet överenskommet måste finnas” )

Du kan ändra meddelandena till dina egna. Jag kanske missförstod det här biblioteket på något sätt, men den här processen verkade inte så uppenbar för mig: du måste använda metoden findMessages() på ett hanterat undantag där du definierar meddelanden inte för attribut utan för regler.


$ex->findMessages([ "userNameRule" => "Användarnamn måste vara två ord.", "alnum" => "Vi gillar inte ditt användarnamn.", "email" => "Du vill uppenbarligen inte ge oss din e-post.", "notEmpty" => "Var är ditt lösenord?", "agreed" => "Tyvärr att du inte håller med." ]);

Jag vet inte vad felet är, men det finns ett par saker som jag fortfarande inte förstår. Detta är vad vi får genom att definiera reglerna på ovanstående sätt:


array(5) ( => string(40) “Användarnamn måste vara två ord.” => string(31) “Vi gillar inte ditt användarnamn.” => string(25) “e-post måste vara giltig e-postadress” => string(5) "Var är ditt lösenord?" => string(9) "Tyvärr att du inte håller med." )

Som du kan se användes inte meddelandet för e-postfältet, det vanliga fanns kvar. Men budskapet bakom index 4 är det motsatta! Och detta trots att jag inte använde namnet på regeln, utan namnet på fältet. Om jag använde namnet på regeln (trueVal), skulle mitt meddelande försvinna någonstans. Kommentarer från erfarna användare av detta bibliotek är mycket välkomna.

Sirius-validering

Ok, låt oss gå vidare till nästa bibliotek och se hur det hanterar liknande uppgifter.

Att definiera reglerna

Återigen måste vi definiera en regel för användarnamnet. Vi skriver det ungefär så här:


class UserNameRule utökar AbstractRule ( // Felmeddelanden const MESSAGE = "Användarnamnet måste vara två ord."; const LABELED_MESSAGE = "(etikett) måste vara två ord."; public function validate($value, $valueIdentifier = null ) (retur (bool) preg_match("/^+\s+$/u", $värde); ) )

Var uppmärksam på skillnaden i tillvägagångssätt i jämförelse med de bibliotek som redan övervägts. Vi definierar två typer av meddelanden i konstanter istället för att använda egenskaper, metoder eller regelargument.


Låt oss nu beskriva valideringslogiken:


$validator = ny validator; $validator ->add("namn", "required | MyApp\Validation\Rule\UserNameRule") ->add("login", "required | alphanumhyphen", null, "Inloggning kan endast innehålla latinska bokstäver, bindestreck och understreck. ") ->add("e-post", "required | email", null, "Ange en giltig e-post.") ->add("lösenord", "required | maxlength(64)", null, "Ditt lösenord, sir.") ->add("godkänner", "krävs | lika(true)", null, "Varför höll du inte med?");

Som du kan se är uppsättningen regler ganska enkel och läsbar. För beskrivningar använder vi namn separerade med horisontella streck. Detta tillvägagångssätt liknar det som används av Laravel och Kontrolio.


Fjärde metoden argument Lägg till() beskriver valideringsfelmeddelandet som Sirius använder om valideringen misslyckas. Varför lade vi inte till ett meddelande för vår nya regel UserNameRule?


$validator->add("namn", "required | MyApp\Validation\Rule\UserNameRule")

Detta beror på att meddelandena redan är beskrivna i klasskonstanterna:


class UserNameRule utökar AbstractRule ( // Felmeddelanden const MESSAGE = "Användarnamn måste vara två ord."; ...

Ett annat alternativ är att använda metoden addMessage() för själva valideraren:


$validator->addMessage("e-post", "Vänligen ange en giltig e-post.");

Observera att anpassade regler identifieras med det fullständiga namnet på deras klass, medan du i Kontrolio kan ställa in ett alias/alias.

Respons

För att utföra validering anropar vi valideringsmetoden bekräfta(), skickar data till den:


$data = [ "name" => "Albert", // Bör vara två ord "login" => "@lbert", // "Förbjudet" tecken @ "email" => "något fel", // Detta bör be an e-mail "password" => "" // Inget lösenord alls // "godkänd" finns inte i arrayen eftersom användaren inte har markerat rutan ]; $validator->validate($data);

Till skillnad från Respect kommer Sirius inte att göra ett undantag, det kommer helt enkelt tillbaka falsk. Valideringsfelmeddelanden kan tas emot via valideringsmetoden getMessages(). Den returnerar fel grupperade efter attribut, så vi behöver två för varje loop för att iterera igenom felen:


foreach ($validator->getMessages() som $attribute => $messages) (foreach ($messages som $message) ( echo $message->getTemplate() . "\n"; ) )

Här är $message ett klassobjekt Sirius\Validation\ErrorMessage, som har en metod getTemplate(), som returnerar själva budskapet vi behöver.

Valitron

Att definiera reglerna

Den första skillnaden är att du inte behöver skapa en separat klass för att lägga till en ny regel. Du kan helt enkelt använda en stängning som ger ett booleskt resultat.


Det finns en statisk metod för att lägga till anpassade regler till Valitron addRule(), där de två första argumenten krävs och det tredje är valfritt. Jag gillade den här metoden, för här anges regelidentifieraren, logiken och felmeddelandet på ett ställe samtidigt.


använd Valitron\Validator; Validator::addRule("two_words", function($field, $value) (return (bool) preg_match("/^+\s+$/u", $value); ), "Användarnamn måste vara exakt två ord .");

Den andra skillnaden är hur reglerna tillämpas på attributen. I alla tidigare fall har vi sett att ett attribut så att säga är en primär sak.


Valitron gick åt andra hållet och satte valideringsreglerna i första hand. När du beskriver reglerna, applicerar du typ attribut på dessa regler, och inte vice versa.


$validator = new Validator($data); $validator ->rule("två_ord", "namn")->etikett("") ->regel("required", [ "namn", "login", "e-post", "lösenord", "överenskommen" ] ) ->rule("slug", "login") ->rule("e-post", "e-post") ->rule("accepterad", "överenskommen");

Som du kan se från exemplet, i metoden regel() vi skriver först namnet på regeln, och först därefter anger vi de attribut som måste matcha denna regel. Ett mer explicit exempel är den obligatoriska regeln, som visar hur attribut "tillhör" regeln.


Valitron (som de andra lösningarna vi har tittat på) tillhandahåller standardfelmeddelanden. Om du bara använder dem kommer du att se att varje meddelande börjar med namnet på motsvarande attribut.


Valitron ersätter attributnamn i meddelandetexten även när icke-standardiserade felmeddelanden används. Det är därför vi använde metoden label() med en tom sträng för att ta bort attributnamnet.


$validator->rule("två_ord", "namn")->etikett("")

Respons

När det gäller validering är Valitron-bibliotekets API praktiskt taget inte annorlunda än vad vi redan har sett i artikeln. För att utföra validering anropar vi valideringsmetoden bekräfta():


$validator->validate();

Valideringsfelmeddelanden kan erhållas med metoden getErrors():


$validator->errors();

Meddelandena här är grupperade efter attribut på exakt samma sätt som i Sirius Validation, förutom att det inte finns någon separat klass för meddelandet, och vi får en vanlig flerdimensionell array.


foreach ($validator->errors() som $attribute => $messages) (foreach ($messages som $message) ( echo $message . "\n"; ) )

kontrollera

Och slutligen, det sista biblioteket för idag är min egen utveckling som heter Kontrolio .

Att definiera reglerna

Återigen, för femte gången kommer vi att skapa en valideringsregel för användarnamnet. Allt är relativt enkelt och standard:


namnutrymme MyProject\Validation\Rules; använd Kontrolio\Rules\AbstractRule; class TwoWords utökar Kontrolio\Rules\AbstractRule ( public function isValid($input = null) (retur (bool) preg_match("/^+\s+$/u", $input); ) )

Nu skapar vi en fabrik och registrerar regeln i den med metoden förlänga():


namnutrymme MyProject; använd Control\Factory; använd MyProject\Validation\Rules\TwoWords; $factory = Kontrolio\Factory::getInstance()->extend();

Efter att ha registrerat regeln kan vi använda den, inklusive genom namn - two_words . Låt oss skapa en validator:


$data = [ "name" => "Albert", // Bör vara två ord "login" => "@lbert", // "Förbjudet" tecken @ "email" => "något fel", // Detta bör be an e-mail "password" => "" // Inget lösenord alls // "godkänd" finns inte i arrayen eftersom användaren inte har markerat rutan ]; $rules = [ "name" => "två_ord", "login" => "ibland|alphadash", "email" => "e-post", "lösenord" => "längd:1,64", "överenskommen" = > "accepterat"]; $messages = [ "name" => "Ditt användarnamn måste vara två ord.", "login" => "Vi gillar inte din inloggning.", "email" => "Du vill uppenbarligen inte ge oss din e-post .", "password" => "Så var är ditt lösenord?", "agreed" => "Tyvärr att du inte håller med." ]; $validator = $factory->make($data, $rules, $messages);

Vi har beskrivit reglerna med en syntax som liknar den som används i Laravel, även om vi kunde ha använt en mer utförlig version:


$rules = [ "name" => new TwoWords, "login" => , "email" => ny e-post, "password" => new Length(1, 64), "accepted" => new Accepted ];

Respons

Validering startas med samma metod bekräfta():


$validator->validate();

Nu kan vi få felmeddelanden med en av metoderna getErrors() eller getErrorsList(). Den första metoden tillåter mer komplexa felutdata, medan den andra returnerar en platt array. Använder sig av getErrors() vi kan skicka meddelanden så här:


    $meddelanden): ?>

A med getErrorsList() du kan göra en enklare lista med meddelanden:


getErrorsList(); ?>

Resultat

I den här artikeln visade jag exempel på hur du använder följande bibliotek:

  1. Aura.Filter
  2. Respektera validering
  3. Sirius-validering
  4. Valitron
  5. kontrollera

"Exempel från den verkliga världen" kan tyckas för enkelt. Jag måste hålla med, eftersom vissa funktioner i biblioteken faktiskt utelämnades i artikeln. Om du är intresserad kan du i princip själv studera deras egenskaper.


Vart och ett av biblioteken erbjuder sina egna marker, har sina egna mörka sidor, så jag tror att det är en smaksak och uppgift – att välja rätt.


Tack för att du läser. Gör rätt val.

Taggar:

  • datavalidering
  • php
  • cykling
Lägg till taggar

Godkväll allihop (snarare 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 det gör vi vissa skyddsmanipulationer.

Så titta på koden nedan och notera följande ändringar och följande anledningar till ändringarna. Jag har markerat alla nya rader.

    Ändrade namnet på formulärfälten. Du frågar - varför i helvete behöver vi det här? Och allt är enkelt, jag kommer att svara dig. Så vitt jag vet, strövar vissa spambots på webbplatser och letar efter formulär och fyller i dem baserat på namnen på dessa fält. I teorin, om de inte hittar en matchning, så går de hem, vilket är vad vi behöver. Naturligtvis, graden av detta skydd, jag tror inte att det är särskilt bra, men det kommer inte att minska från oss, och om skräpposten minskar med 1 e-post, kommer det redan att vara bra =).

    Söker efter korrekt e-postadress. Linje 17 använder sig av elseif-operatören, som kommer att kontrolleras om om vi har fått ett positivt svar, det vill säga det står att mailadressen inte är tillgänglig alls, det vill säga att den inte angavs. Här använder vi funktionen preg_match, som låter dig jämföra den angivna adressen med vanligt uttryck. Om reguljära uttryck kanske jag kommer att skriva kort senare, men för nu är det värt att veta att ett reguljärt uttryck skapar ett visst mönster som vår sträng kontrolleras mot. Och om, i vårt fall, den angivna adressen inte matchar uttrycket, kommer ett fel att visas igen. Till exempel, här är ett par reguljära uttryck:
    |^[-a-ne\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 stavningen av adressen på Internet.

Därefter används else-satsen, där all vår kod för att skicka brevet redan har överförts. Du kan skapa valfritt antal valideringsregler själv, lägg bara till nya elseifs, till exempel för att kontrollera en e-postadress, så blir du nöjd.

$mailto=" [e-postskyddad]";
$charset = "windows-1251";
$subject = "Meddelandenamn";
$content = "text/html";
$status="
";
if (!empty($_POST))
{
$name = htmlspecialchars(stripslashes($_POST["imko"]));
$message = htmlspecialchars(stripslashes($_POST["tikstik" ]));
$mail = htmlspecialchars(stripslashes($_POST["posta"]));

if (tom ($_POST["posta" ]))
{
$status = "Du skrev inte in din e-post!";
}
elseif (!preg_match( "/^[e-postskyddad]+\.(2,6)$/i", $mail))
{
$status = "Du har angett en ogiltig e-post!";
}
annan
{
$headers = "MIME-version: 1.0\r\n";
$headers .= "Content-Type: ".$content." charset=".$charset."\r\n";
$headers .= "Från: \"".$name ."\"<".$mail .">\r\n";
$headers .= "Hemlig kopia: [e-postskyddad]\r\n";
$headers .= "X-Mailer: E-post från min supersajt \r\n";
$sendmessage = "

Kontakt e-post:".$mail."


Meddelande:".$meddelande."


";
if (mail($mailto,$subject,$sendmessage,$headers))
{
unset($namn , $mail , $meddelande );
$status = "Ditt meddelande har skickats!";
}
annan
{
$status = "Av tekniska skäl skickades inte meddelandet. Försök igen, och om det inte fungerar, kontakta utvecklarna";
}
}
}
?>

















Så här kan du validera dina formulär i PHP utan att behöva ta till något annat. Nästa inlägg om ämnet formulär tror jag kommer att betraktas som formulärvalidering i jQuery. Under tiden ser jag fram emot dina kommentarer och förslag. God natt och god morgon alla =).

POST-metoden. Och utvecklarens första uppgift är validering beställnings- data som tas emot med POST-metoden. Som regel reduceras denna validering till:
  1. kontrollera att alla obligatoriska fält är ifyllda
  2. kontrollera om e-postadressen eller URL-adressen är korrekt
  3. kontrollera att resten av uppgifterna är korrekta(endast siffror eller bokstäver kan anges i inmatningsfältet, eller båda, eller kontrollera att inloggningen är unik i databasen, etc.)
  4. filtrera data från skadlig kod

Som regel upprepas alla dessa kontroller och du måste skriva nästan samma kod för att validera POST-data, vilket leder till duplicering av php-kod.

För att undvika detta skrev jag en enkel klass för POST-datavalidering i PHP. Den här klassen är väldigt enkel och lätt att använda och du kan använda den i dina skript. Denna klass kallas Validator.

Jag måste genast säga att min klass liknar ett bibliotek Form_validation i kodantändare , bara lite ändrad. Därför, om du är bekant med det här biblioteket, kommer det inte att vara svårt för dig att förstå min POST-datavalideringsklass.

Det jag gillade med Form_validation-biblioteket var lättheten att ställa in fält för validering och själva valideringen. Detta var utgångspunkten för mig när jag utvecklade min egen valideringsklass.

Låt oss ta en titt på ett litet exempel på hur du använder den här klassen.

Require_once "validator.php"; $validator = new Validator(); $validator->set_rules("namn","Ditt namn",array("required" => "Fält %s krävs ","alpha" => "Fält %s får endast innehålla bokstäver ")); $validator->set_rules("email","Din e-post",array("required" => "Fält %s krävs ","valid_email" => "Fält %s måste innehålla en giltig e-postadress ")); if($validator->run())( echo "Validering lyckades"; ) else( echo $validator->get_string_errors(); )

Först inkluderar vi klassfilen validator.php till vårt manus. Skapa sedan en instans av klassen och spara objektet i en variabel $validator .
Använd sedan metoden $validator->set_rules($field, $label, $rules) ställ in fält för validering.

Denna metod tar tre parametrar:

  1. $fält — Namnet på valideringsfältet (värdet på namnattributet i taggen )
  2. $-etikett — valideringsfältets namn, kommer att ersättas i felmeddelanden
  3. $regler är en uppsättning valideringsregler, vars nyckel är valideringsregeln och värdet är felmeddelandet för denna regel

Efter att alla fält för validering är inställda kör vi valideraren med metoden $validator->run() . Om valideringen lyckades kommer denna metod att returnera värdet SANN , annars kommer , om det finns åtminstone några fel , tillbaka FALSK .

Det finns tre metoder för att få felmeddelanden:

  1. get_string_errors() - returnerar alla felmeddelanden som en sträng
  2. get_array_errors() - returnerar alla meddelanden som en array, där nyckeln är namnet på fältet och värdet är beskrivningen av felet för detta fält.
  3. 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 sätta din egen design, använd metoden set_error_delimiters($prefix, $suffix) . Till exempel så här:

$validator->set_error_delimiters("

","
");

Nu kommer felmeddelanden att packas in div med klass "fel"

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

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:

$rules = array(array("field" => "namn", "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 krävs ", "valid_email" => "Fältet %s måste innehålla en giltig e-postadress "))); $validator->set_rules($rules);

Som du kan se har jag skrivit samma valideringsregler som i det första exemplet, bara som 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 mig in i den här klassen mest allmänning valideringsregler som alla möter. Här är en komplett lista över dessa regler:

nödvändig Returnerar FALSK om fältet är tomt
heltal Returnerar FALSE om värdet inte är ett heltal
flyta Returnerar FALSE om värdet inte är numeriskt
valid_url Returnerar FALSE om värdet inte är en giltig URL
valid_email Returnerar FALSE om värdet inte är en giltig e-postadress
giltig_ip Returnerar FALSE om IP-adressen inte är giltig
tändstickor Returnerar FALSE om elementet inte matchar värdet för ett annat fältelement
alfa Returnerar FALSE om elementet innehåller mer än bara bokstäver
valid_captcha Returnerar FALSE om värdet är i session fält inte lika med formulärfältets värde
giltigt datum Returnerar FALSE om elementet innehåller ett ogiltigt datum

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

Reg.ru: domäner och hosting

Den största registratorn och värdleverantören i Ryssland.

Över 2 miljoner domännamn i tjänst.

Marknadsföring, mail för domän, lösningar för företag.

Mer än 700 tusen kunder runt om i världen har redan gjort sitt val.

* För muspekaren för att pausa rullningen.

Tillbaka framåt

Validering och datarensning med PHP

Datasäkerhet är en mycket viktig punkt som ofta underskattas av både utvecklare och kunder. Sedan PHP 5.2.0 har datarensning och validering (kontroll mot vissa kriterier) blivit lättare med införandet av datafiltrering. Idag ska vi titta på hur man filtrerar, hur man använder filter och skapar några anpassade funktioner.

Introduktion

Jag har alltid känt att det är lätt att skriva PHP-kod, och det är ännu lättare att skriva dålig PHP-kod. Många open source-projekt som WordPress, Drupal, Magento har bidragit till den utbredda användningen av PHP inom webbutvecklingsområdet. Dessutom är det webbapplikationer som Facebook osv. Med en så bred användning av PHP (dynamiska webbplatser, bloggplattformar, innehållshanteringssystem, användning i e-handelsapplikationer etc.) är sannolikheten att stöta på "smutsig" information och osäkra system mycket hög. Den här handledningen kommer att visa dig några datarensnings- och valideringsmetoder med PHP. Vi kommer att fokusera på flera typer av input och hur man använder PHP-filter och användardefinierade funktioner.

Varför rensa och kolla?

I den här guiden kommer vi att fokusera på information som kommer direkt från användare, såväl som från andra externa källor. Det betyder att vi inte har någon kontroll över den information vi får. Allt vi kan göra är att kontrollera vad som kommer att göras med denna mottagna information. Nästan alla typer av hot kommer från information som överförs av användare eller annan tredje part.

Bland de viktigaste:

- XSS (Cross-Site Scripting - Cross-Site Scripting)

Detta är en kodinjektionsmetod, när ett skript injiceras på sidan på den attackerade webbplatsen från en helt annan webbplats på en annan server. Denna sårbarhet anses vara en av de mest utbredda i nätverket.

- SQL-injektion

Nästa populära sårbarhet är en annan form av kodinjektion som tillåter olika typer av skadligt beteende, inklusive obehörig åtkomst till information, modifiering av information i en databas eller annan störning av en webbapplikations normala funktion. Denna attack utförs genom att injicera en godtycklig SQL-kod i frågan, utformad för att interagera med databasen.

- CSRF/XSRF (Cross-Site Request Forgery)

Denna sårbarhet är mindre vanlig än de tidigare. Vanligtvis uppstår sådana sårbarheter när man arbetar med sessioner och cookies, och mer sällan - med dåligt kontrollerade och rensade data. CSRF kan användas för att göra förfrågningar till webbplatsen utan användarens vetskap. Ett känt sätt att implementera denna attack är att använda ett felaktigt attribut src vid bilden, vilket leder till exekvering av något manus, och inte till visning av bilden.

- Felaktig information

Felaktig information i sig är ingen "sårbarhet". Sådan information leder dock i många fall till en rad problem för både webbplatsägaren och databasadministratören. Ofta leder information som är felaktig i strukturen till funktionsfel, särskilt om webbplatsen är implementerad på amatörnivå, inte enligt standarder, samt till fel i driften av automatiserade system som förväntar sig att tydligt strukturerad data i ett visst format ska vara bearbetas.


Översättning av dialogen till bilden:

Hej, det är från din sons skola du är orolig. Vi har ett problem med datorer här.

Åh gud, slog han sönder något?

Är din sons namn verkligen Robert"); DROP TABLE-studenter;?

Åh ja vi kallar honom Lilla Bobby bord

Du förstår, vi har tappat alla rekord på årets elever. Jag hoppas att du är nöjd.

Och jag hoppas att du lär dig hur du kontrollerar informationen i databasen.

För våra syften kommer vi bara att fokusera på att använda informationssäkerhetstekniker på serversidan, så låt oss se hur termerna "sanering" och "validering" definieras i relation till PHP. Låt oss ta en titt på PHP-manualen:

"Validering används för att kontrollera om informationen som kontrolleras uppfyller vissa krav. Med FILTER_VALIDATE_EMAIL avgör vi till exempel om informationen är en giltig (dvs korrekt i strukturen) e-postadress, men ändrar inte denna data.

Rengöring innebär å andra sidan en möjlig förändring av informationen som kontrolleras, till exempel borttagning av oönskade tecken. Låt oss säga att användningen av FILTER_SANITIZE_EMAIL tar bort tecken som inte ska finnas i en e-postadress. De där. i det här fallet finns det ingen verifiering av adressens riktighet (d.v.s. validering), men medvetet olämpliga tecken raderas - inget mer."

I grund och botten, om du föreställer dig din sida som en nattklubb som alla vill gå till, handlar validering om att kontrollera om gästen finns på inbjudningslistan, sanering fungerar som en studsare som inte släpper in oönskade element i klubben. Mer eller mindre så här.

Vilka filter har jag?

Alla PHP-installationer kan inte vara identiska. Även om filter introducerades i PHP 5.2.0, har inte alla installationer samma uppsättning filter. I de flesta fall kommer alla filter vi ska prata om redan att inkluderas med PHP installerat på din server, men för att ge dig lite mer information om filter så tittar vi på vad som finns tillgängligt på din server. Källkodsfil bifogas getfilters.php, som, när den väl har installerats och körts på servern, visar en lista över alla dina filter (som informationsfilter tillgängliga via funktionen filter_var, och streaming tillgänglig via stream_filter_append)

eko"

Datafilter

\n \n \n"; eko " \n"; eko " \n"; foreach(filter_list() som $id => $filter) ( echo " \n"; ) echo "
Filter-IDFilternamn
$filter".filter_id($filter)."
\n";

Vi får först en array som innehåller en lista över alla tillgängliga filter som använder funktionen filter_list, varefter vi går igenom arrayen och visar filternamnet och dess ID.

Hur kan jag använda filtret?

PHP-filter för validering och sanering aktiveras genom att skicka en funktion filter_var minst två parametrar. Som ett exempel, låt oss tillämpa ett tydligt filter på ett heltal:

$value = "(!LANG:123abc456def"; echo filter_var($value, FILTER_SANITIZE_NUMBER_INT); !}

I det här exemplet har vi en variabel värde, som vi överför till funktionen filter_var från tillägget PHP Filters med filtret FILTER_SANITIZE_NUMBER_INT. Som ett resultat kommer vi att få:

Rensningsfiltret för heltal tar bort alla icke-heltalstecken, vilket ger oss ett "rent" heltal. I källorna kan du prova olika ingångar, och ett antal vanliga filter kommer att tillämpas på dem. I arkivet finns olika strängar som du själv kan använda som testmaterial.

Vad gör de olika filtren?

Listan nedan är inte uttömmande, men den innehåller de flesta filter som följer med en standard PHP 5.2.0+ installation.

FILTER_VALIDATE_BOOLEAN: Kontrollerar om den givna informationen är en boolesk SANT eller FALSK. Om det godkända värdet inte är av typen Boolean returneras FALSE. Skriptet nedan kommer att mata ut TRUE för variabelexemplet värde1 värde02:

$value01 = TRUE; if(filter_var($value01,FILTER_VALIDATE_BOOLEAN)) ( echo "TRUE"; ) else ( echo "FALSE"; ) echo "

" $value02 = FALSE; if(filter_var($value02,FILTER_VALIDATE_BOOLEAN)) ( echo "TRUE"; ) else ( echo "FALSE"; )

FILTER_VALIDATE_EMAIL: Kontrollerar om den skickade informationen är en giltig e-postadress vad gäller strukturen. Den kontrollerar inte om denna adress faktiskt finns, utan endast adressens giltighet, d.v.s. riktigheten av dess struktur. Skriptet nedan kommer att mata ut TRUE för variabelexemplet värde01 och FALSE för variabelexemplet värde02(eftersom den obligatoriska delen med @-tecknet saknas):

$value01 = " [e-postskyddad]"; if(filter_var($value01,FILTER_VALIDATE_EMAIL)) ( echo "TRUE"; ) else ( echo "FALSE"; ) echo "

" $value02 = "nettuts"; if(filter_var($value02,FILTER_VALIDATE_EMAIL)) ( echo "TRUE"; ) else ( echo "FALSE"; )

FILTER_VALIDATE_FLOAT: Kontrollerar om det godkända värdet är ett flyttal. Skriptet nedan kommer att mata ut TRUE för variabelexemplet värde01 och FALSE för variabelexemplet värde02(eftersom split "," är inte tillåtet i flöten):

$value01 = "1.234"; if(filter_var($value01,FILTER_VALIDATE_FLOAT)) ( echo "TRUE"; ) else ( echo "FALSE"; ) echo "

" $value02 = "1,234"; if(filter_var($value02,FILTER_VALIDATE_FLOAT)) (eko "TRUE"; ) else (eko "FALSE";)

FILTER_VALIDATE_INT: Kontrollerar om det godkända värdet är ett heltal. Skriptet nedan kommer att mata ut TRUE för variabelexemplet värde01 och FALSE för variabelexemplet värde02(decimaltal är inte heltal):

$value01 = "123456"; if(filter_var($value01,FILTER_VALIDATE_INT)) ( echo "TRUE"; ) else ( echo "FALSE"; ) echo "

" $value02 = "123.456"; if(filter_var($value02,FILTER_VALIDATE_INT)) (eko "TRUE"; ) else (eko "FALSE";)

FILTER_VALIDATE_IP: Kontrollerar om det godkända värdet är en giltig IP-adress. Den kontrollerar inte om det finns ett svar från denna adress, utan bara att det skickade värdet, genom sin struktur, är en IP-adress. Skriptet nedan kommer att mata ut TRUE för variabelexemplet värde01 och FALSE för variabelexemplet värde02:

$value01 = "192.168.0.1"; if(filter_var($value01,FILTER_VALIDATE_IP)) ( echo "TRUE"; ) else ( echo "FALSE"; ) echo "

" $value02 = "1.2.3.4.5.6.7.8.9"; if(filter_var($value02,FILTER_VALIDATE_IP)) ( echo "TRUE"; ) else ( echo "FALSE"; )

FILTER_VALIDATE_URL: Kontrollerar om det godkända värdet är en giltig URL. Det gör den inte, den kontrollerar inte att resursen är tillgänglig, bara att strukturen för URL:en följs. Skriptet nedan kommer att mata ut TRUE för variabelexemplet värde01 och FALSE för variabelexemplet värde02:

$value01 = "http://net.tutsplus.com"; if(filter_var($value01,FILTER_VALIDATE_URL)) ( echo "TRUE"; ) else ( echo "FALSE"; ) echo "

" $value02 = "nettuts"; if(filter_var($value02,FILTER_VALIDATE_URL)) ( echo "TRUE"; ) else ( echo "FALSE"; )

FILTER_SANITIZE_STRING: Som standard tar detta filter bort all felaktig eller otillåten information på en rad. Till exempel kommer det att ta bort alla HTML-taggar som eller"; echo filter_var($värde, FILTER_SANITIZE_STRING);

Detta skript tar bort taggarna och returnerar följande:

Alert("PROBLEM HÄR");

FILTER_SANITIZE_ENCODED: Många programmerare använder funktionen urlencode(). Detta filter utför i huvudsak samma funktioner. Till exempel kommer följande exempel att koda alla specialtecken och mellanslag i inmatningssträngen:

$value = "(!LANG:"; echo filter_var($value, FILTER_SANITIZE_ENCODED); !}

Skriptet kommer att koda skiljetecken, mellanslag, parenteser och returnerar följande:

%3Cscript%3Ealert%28%27TROUBLE%20HERE%27%29%3B%3C%2Fscript%3E

FILTER_SANITIZE_SPECIAL_CHARS: Detta standardfilter gör HTML-kodning av specialtecken som citattecken, et-tecken och parenteser. Eftersom demosidan inte explicit kan visa detta (eftersom de HTML-kodade specialtecknen kommer att tolkas av webbläsaren och visas), kan du se detta om du tittar på källkoden:

$value = "(!LANG:"; echo filter_var($value, FILTER_SANITIZE_SPECIAL_CHARS); !}

Specialtecken kommer att konverteras till sina HTML-enheter:

FILTER_SANITIZE_EMAIL: Detta filter gör precis vad var och en av dem trodde. Den tar bort tecken från adressen som inte ska finnas i adressen (runda och hakparenteser, kolon, etc.) Låt oss säga att du av misstag lagt till hakparenteser runt en bokstav till din adress (fråga inte hur, sätt på fantasin :) )

$value = "(!LANG:t(e) [e-postskyddad]"; echo filter_var($värde, FILTER_SANITIZE_EMAIL);

Fästarna kommer att tas bort och du får din rena och vackra e-post vid utgången:

[e-postskyddad]

Detta är ett utmärkt filter att använda på e-postformulär, särskilt när det är ihopkopplat med FILTER_VALIDATE_EMAIL för att minska användarfel och förhindra XSS-attacker.

FILTER_SANITIZE_URL: Detta filter liknar det föregående. Den tar bort alla tecken som inte är tillåtna i URL:en. Låt oss till exempel säga att adressen av misstag innehåller ett "®"-tecken. Återigen, hur han kom dit är ett fullständigt mysterium.

$value = "(!LANG:http://net.tuts®plus.com"; echo filter_var($value, FILTER_SANITIZE_URL); !}

Därför tar vi bort det onödiga "®"-tecknet och får en normal adress:

http://net.tutsplus.com

FILTER_SANITIZE_NUMBER_INT: Det här filtret liknar FILTER_VALIDATE_INT, men istället för att bara kontrollera om ett tal är ett heltal, tar det också bort allt som inte är ett heltal. Bra grej, speciellt mot irriterande spambots och bedragare som försöker lägga in något nonsens i fältet:

$value01 = "123abc456def"; echo filter_var($värde01, FILTER_SANITIZE_NUMBER_INT); eko"
"; $value02 = "1.2.3.4.5.6.7.8.9"; echo filter_var($value02, FILTER_SANITIZE_NUMBER_INT);

123456 123456789

FILTER_SANITIZE_NUMBER_FLOAT: Liknar FILTER_VALIDATE_INT. På samma sätt låter det dig uppnå en liknande effekt:

$value01 = "123abc456def"; echo filter_var($värde01, FILTER_SANITIZE_NUMBER_FLOAT); eko"
"; $value02 = "1.2.3.4.5.6.7.8.9"; echo filter_var($value02, FILTER_SANITIZE_NUMBER_FLOAT);

Båda uppsättningarna tecken konverteras och resultatet är följande bild:

123456 123456789

$value = "1.23"; echo filter_var($värde, FILTER_SANITIZE_NUMBER_FLOAT);

Punkten kommer att tas bort och värdet returneras:

En av huvudorsakerna till att filtren FILTER_SANITIZE_NUMBER_FLOAT och FILTER_SANITIZE_INT är åtskilda är möjligheten att använda den speciella flaggan FILTER_FLAG_ALLOW_FRACTION, som kommer som den tredje parametern som skickas till funktionen filter_var:

$value = "1.23"; echo filter_var($värde, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);

Alternativ, flaggor och kontrollarrayer - Mine Gott!

Flaggan som användes i det föregående exemplet är bara ett sätt att få mer finkornig kontroll över vilka typer av data som ska rensas upp, definitioner av avgränsare, hur arrayer behandlas av filter och mer. Du kan lära dig mer om flaggorna och funktioner som används i samband med applicering av filter Se PHP-manualen för Filter - php.net/manual/en/book.filter.php .

Andra metoder för rengöring av information med PHP

Vi kommer nu att titta på några viktiga datarensningstekniker för att förhindra en attack på din applikation. De är särskilt relevanta för de applikationer som fortfarande fungerar på PHP4, som de dök upp med sin release.

htmlspecialchars: denna PHP-funktion kommer att konvertera 5 specialtecken till motsvarande HTML-entiteter.

Omvandlingen är föremål för:

& (ampersand)
" (dubbla citattecken) när flaggan ENT_NOQUOTES inte är inställd
' (enkla citattecken) endast när flaggan ENT_QUOTES är inställd
< (меньше, чем)
> (större än)

Denna funktion används på samma sätt som alla andra i PHP:

echo htmlspecialchars("$string");

htmlentities: Som en funktion htmlspecialchars denna funktion konverterar specialtecken till deras HTML-enheter. Den enda skillnaden är att i det här fallet konverteras alla specialtecken som kan konverteras. Detta är en ganska vanlig metod för att fördunkla e-postadresser från skräppostrobotar, eftersom inte alla är konfigurerade för att läsa html-enheter:

echo htmlentities("$string");

mysql_real_escape_string: Detta är en MySQL-funktion som hjälper till att skydda mot SQL-injektionsattacker. Det anses vara god praxis (och faktiskt en nödvändighet) att skicka all information som skickas till SQL-frågan genom denna funktion. Den undkommer alla farliga specialtecken som kan orsaka problem och orsaka lilla Bobby Tables kommer att förstöra en annan tabell i skolans databas.

$query = "SELECT * FROM table WHERE value="(!LANG:.mysql_real_escape_string("$string")." LIMIT 1,1"; $runQuery = mysql_query($query); !}

Anpassade funktioner

För många är det kanske inte tillräckligt med inbyggda funktioner och filter. Det kan ofta krävas strängare och snävare validering eller rening. För att uppnå önskat resultat skriver många funktioner för datavalidering själva. Ett exempel skulle vara att söka i databasen efter värden av en viss typ, så här:

Funktion checkZipCode($value) ($zipcheck = "VÄLJ ANTAL(*) FRÅN `databas`.`zipcodes` WHERE value="".filter_var(mysql_real_escape_string($value),FILTER_SANITIZE_NUMBER_INT)."""; $count = mysql_query( $zipcheck); if($count==1) (retur TRUE; ) else (retur FALSE; ) )

Andra användardefinierade funktioner kanske inte är direkt relaterade till databasen, utan förbereder snarare information innan den infogas i databasen:

Funktion cleanString($string) ( $detagged = strip_tags($string); if(get_magic_quotes_gpc()) ( $stripped = stripslashes($detagged); $escaped = mysql_real_escape_string($stripped); ) else ( $escaped = mysql_real_escape_escape_string avtaggad); ) returnera $escaped; )

Möjligheterna är nästan oändliga, speciellt när man använder reguljära uttryck. Men i de flesta fall kan användningen av filter redan lösa de nödvändiga uppgifterna.

Gillade materialet och vill tacka?
Dela bara med dina vänner och kollegor!


Dela med sig