Bibliotek: PHP Sikkerhet (GET, POST, COOKIE, SERVER)

Regulæruttrykk, objektorientering, samt problemstillinger omkring optimalisering og sikkerhet.

Bibliotek: PHP Sikkerhet (GET, POST, COOKIE, SERVER)

Innlegg DavidS » 22.07.2010 16:43

De siste ukene har jeg laget et bibliotek til PHP som fokuserer på input/output-sikkerhet. Biblioteket kan hente ut data fra GET, POST, COOKIE og SERVER og så håndtere disse. Du kan også spesifisere strings og andre datatyper til biblioteket, og håndtere disse på samme måte.

Struktur
  • Input - henter informasjon fra GPCS
  • Input_Item - håndterer dataene fra Input
  • Validation - valideringsklassen
  • Sanitation - manipulerer data

Biblioteket har jeg kalt PHP Security Wrapper (jeg er dårlig på navn).

Hjemmesiden inneholder kode-eksemplar på hvordan komme i gang, i tillegg til dokumentasjon.

Last ned
Last ned her (alltid siste versjon)


Eksempler


Helt enkelt - ingen sikkerhet
Henter ut verdien til "name" fra GET. Om ingenting er satt, skrives "Guest" ut.
Kode: Merk alt
// initiate wrapper class
$input = new Input;

echo 'Welcome, ', $input->get ('name')->value ('Guest');
 



Helt enkelt - litt filtrering
Henter ut verdien til "name" fra GET og sjekker om den er en string. Om ingenting er satt eller filtreringen feiler, skrives "Guest" ut.
Kode: Merk alt

echo 
'Welcome, ', $input->get ('name')->apply_filter (FILTER_VALIDATE_STRING)->value ('Guest');
 



Helt enkelt - litt validering
Henter ut verdien til "name" fra GET. Det printes bare ut noe når $name inneholder alfanumeriske tegn.
Kode: Merk alt


$name 
= $input->get ('name'); // Returns: Input_Item object

// Checks if $name contains alpha-numerical characters
if ($name->validate ('is_alnum')) {
     echo 'Hello, ', $name->value ();
}
 



Hente "age" fra et GET Request, og validere denne
Kode: Merk alt


if 
( ($age = $input->get ('age')) AND $age->apply_filter (FILTER_VALIDATE_INT)->is_valid() ) {
    // $age is now validated as integer

    if ($age->validate ('min_length', 16)) {
        // $age is at least 16

        echo 'You are: ', $age->value(), ' Years old.';
    }
}
 


Forklaring: Input::get, Input::post, Input::server, Input::cookie er metodene som henter ut informasjon, og returnerer et Input_Item objekt.
Argumentet til Input_Item::apply_filter() er en av disse typene.

Input_Item og Input inneholder bl.a. metodene validate() og sanitize (). Disse tar følgende parameter:
  1. Metode - hvilken metode som skal benyttes
Input::validate() og Input::sanitize() krever $data som andreparameter (dataen som skal behandles).

Det siste parameteret (2. argument for Input_Item, 3. argument for Input) er $options. Dette er ikke nødvendig, og brukes bare i tilfeller hvor det må spesifiseres et alternativ (se eksempelet ovenfor).

Koden overfor er den samme for GET, POST, COOKIE og SERVER.


Skrive ut data fra MySQL
Kode: Merk alt
$SQL = mysql_query ('SELECT foo FROM bar');
 
while 
($Data = mysql_fetch_object ($SQL)) {
    echo $input->sanitize ('xss_clean', $Data->content);
}
 


Siden Input_Item kun håndterer data fra GPCS, må vi bruke Input::validate og Input::sanitize når vi skal behandles strings.

Merk:
Validate-metoden (Input::validate og Input_Item::validate) kjører en metode i Validation-klassen.
Sanitize-metoden (Input::sanitize og Input_Item::sanitize) kjører en metode i Sanitation-klassen.


"Stand-alone" eksempel
Sanitation- og Validation-klassen er ikke avhengig av Input og Input_Item da de blir omtalt som "wrappere". Derfor kan disse brukes slik:
Kode: Merk alt
$sanitation = new Sanitation;
 
$SQL 
= mysql_query ('SELECT foo FROM bar');
 
while 
($Data = mysql_fetch_object ($SQL)) {
    echo $sanitation->xss_clean ($Data->content);
}
 

og ...
Kode: Merk alt
$validation = new Validation;
 
$string 
= 'John Doe%';

if ($validation->is_alnum ($string)) {
    // $string contains alpha-numerical characters
} else {
    echo $sanitation->alnum($string); // Prints: John Doe
}
}
 


Jeg er litt sliten for øyeblikket, så denne tråden kommer nok til å bli oppdatert fortløpende.


Jeg ønsker veldig gjerne tilbakemelding!
Sjekk ut hjemmesiden og dokumentasjonen, og last ned klassene og test ut!

Tilbakemeldinger ønskes varmt velkommen i denne tråden.

Jeg har skrevet endel funksjoner for Validation og Sanitation allerede (sjekk linkene), men ønsker gjerne respons på nye funksjoner jeg kan legge til.


Oppdateringer
23.07.2010 00:15 - Har endret litt på kodestrukturen, slik at du kan tilby så mange argument som overhode mulig med sanitize()- og validate()-metodene. Dette ble gjort etter en gjennomgang av ulike funksjoner, og jeg konkluderte med at det er praktisk å tilby mer enn ett tilleggsargument.

Kode: Merk alt

$input
->validate ('method_name'$data$option1$option2$option3 /* .... */);

$input->get ('some_key_from_get')->validate ('method_name'$option1$option2 /* ... */); 
Sist endret av DavidS den 22.07.2010 23:07, endret 4 ganger.
Utvikling: http://davidsteinsland.net | Blogg: http://blog.davidsteinsland.net | Din link her? 100 000 kr/året.
Brukerens avatar
DavidS
Seniormedlem
 
Innlegg: 3314
Registrert: 17.05.2006 17:08
Bosted: Bømlo

Re: Bibliotek: PHP Sikkerhet

Innlegg DavidS » 22.07.2010 16:52

Om du ønsker å bruke PHPs filtreringer, kan du gjøre det med apply_filter() og is_valid():
Kode: Merk alt

$email 
$input->get ('email')->apply_filter ('FILTER_VALIDATE_EMAIL');
if (
$email->is_valid()) {
    
// $email is now validated as an E-mail address per FILTER_VALIDATE_EMAIL


Input_Item::value() kjører også is_valid()-funksjonen, som betyr du kan gjøre slik istedenfor:
Kode: Merk alt

$email 
$input->get ('email')->apply_filter ('FILTER_VALIDATE_EMAIL');
echo 
$email->value ('Invalid E-mail address'); // Prints the valid E-mail address, or an error message if it is invalid
 


Men det er like greit å kun benytte seg av validate()-metoden, egentlig.
Utvikling: http://davidsteinsland.net | Blogg: http://blog.davidsteinsland.net | Din link her? 100 000 kr/året.
Brukerens avatar
DavidS
Seniormedlem
 
Innlegg: 3314
Registrert: 17.05.2006 17:08
Bosted: Bømlo

Re: Bibliotek: PHP Sikkerhet (GET, POST, COOKIE, SERVER)

Innlegg DavidS » 22.07.2010 23:08

Har gjort en liten oppdatering til kodene (se nederst i første innlegg).

Noen som har fått sjekket det ut?
Utvikling: http://davidsteinsland.net | Blogg: http://blog.davidsteinsland.net | Din link her? 100 000 kr/året.
Brukerens avatar
DavidS
Seniormedlem
 
Innlegg: 3314
Registrert: 17.05.2006 17:08
Bosted: Bømlo

Re: Bibliotek: PHP Sikkerhet (GET, POST, COOKIE, SERVER)

Innlegg Zolic » 24.07.2010 18:52

Virker jo veldig gjennomført, har dog ikke tid til å teste det om dagen... skal få gjort det, enn så lenge er første inntrykket; et stykke solid arbeid som ser låvende ut :)
Zolic
Medlem
 
Innlegg: 370
Registrert: 14.11.2005 13:56

Re: Bibliotek: PHP Sikkerhet (GET, POST, COOKIE, SERVER)

Innlegg DavidS » 24.07.2010 19:50

Takk for tilbakemelding! Jeg har brukt litt tid på å planlegge løsninger og patterns, og mener nå jeg har funnet en brukbar løsning. Jeg er litt misfornøyd med den siste oppdateringen (Se WrapperAbstract.php og Input_Item::validate/sanitize og Input::validate/sanitize).

Oppdaterte eksempler kan forresten sjekkes her:
http://trunk.davidsteinsland.net/php-cl ... php?source

Den filen kommer med hver versjon, og er/skal alltid være oppdatert til siste versjon.

Versjonsnummeret blir oppdatert her:
http://trunk.davidsteinsland.net/php-cl ... ersion.txt

PS: Jeg vet at jeg bruker Input::get() i alle eksemplene mine (stort sett), men det er bare fordi det er enklere å se resultatet enn f.eks med post() (da må man sette opp skjema, etc.). Prosedyrene er uansett helt lik.

Her er det et eksempel på behandle et skjema:
http://php.davidsteinsland.net/php-secu ... /code/tips (har ikke testet koden)
Utvikling: http://davidsteinsland.net | Blogg: http://blog.davidsteinsland.net | Din link her? 100 000 kr/året.
Brukerens avatar
DavidS
Seniormedlem
 
Innlegg: 3314
Registrert: 17.05.2006 17:08
Bosted: Bømlo


Gå til Avansert PHP

Hvem er i forumet

Brukere som leser i dette forumet: Ingen registrerte brukere og 1 gjest