En viktig del av PHP-utviklingspraksis er alltid å huske på at sikkerhet ikke er noe du bare kan kjøpe av hyllen på din lokale, praktiske butikk. Sikre sikkerheten til webapplikasjonene dine er en prosess, som over tid må evalueres, overvåkes og herdes kontinuerlig..
Selv om bruk av filtre og validering av data er en del av sikkerhetsprosessen, bør en webutvikler være klar over at Randomization, Obfuscation og Cryptography i PHP kan gjøre en forskjell i sikkerheten til webapplikasjoner. Denne opplæringen vil veilede deg gjennom noen enkle teknikker ved å skape og bruke tilfeldige eller unike verdier i webapplikasjonene dine, ta en titt og bruke noen generelle obfuscationsteknikker, og se nærmere på vitenskapen om kryptologi, og det er bruk innen PHP.
Dictionary.com definerer randomisering som:
"-verb: å bestille eller velge på en tilfeldig måte, som i en prøve eller et eksperiment, spesielt for å redusere forstyrrelser og forstyrrelser forårsaket av irrelevante variabler, gjør tilfeldig."
Tilfeldig tallgenerering er bestemt på flere måter, men beregningsgeneratorer mangler "ekte" tilfeldighet som sett i natur eller elektronisk støy (den fuzzy, screeching, svart og hvite kanalen på TV). Disse beregne verdiene betraktes som pseudo-tilfeldig.
PHP gir oss et par forskjellige måter å lage tilfeldige verdier på. La oss se på noen av de mer populære funksjonene.
De to funksjonene rand ()
og mt_rand ()
er sannsynligvis de mest brukte funksjonene til å generere et sett av tilfeldige tall i PHP. Funksjonen rand ()
; er en eldre generator, og faller ut av bruk på grunn av mt_rand ()
; som er raskere, mer pålitelig og kan håndtere en høyere maksimal heltallverdi på noen plattformer. Funksjonen str_shuffle ()
gjør akkurat det du forventer det til, det blander en streng som er passert til den.
"; skriv ut mt_rand (0, 20); // Utfører et tilfeldig heltall mellom 0 og 20 ekko"
"; // Eksempler på rand () bruk print rand (); // standard echo"
"; print rand (0, 25); // Utfører et tilfeldig heltall mellom 0 og 25 ekko"
"; // Eksempel på str_shuffle bruk $ string = 'abcefghijklmnopqrstuvwxyz'; skriv ut str_shuffle ($ streng); // shuffles $ string?>
De rand ()
og mt_rand ()
Funksjoner begge aksepterer to parametere hvor $ min
er det laveste heltallet til å begynne med, og $ max
å være det største heltallet til slutt med. Funksjonen str_shuffle
tar en parameter, en streng, som utfører en blandet mutasjon av strengen. Det virker det samme som om du skulle kaste et kort kort.
Samtidig som mt_rand ();
vil spytte ut et tilfeldig heltall, og str_shuffle
vil blande en streng opp, en funksjon som er mye brukt til å lage tilfeldige unike verdier er uniqid ()
. Dette genererer en forhåndsdefinert unik identifikator basert på gjeldende tid i mikrosekunder (via php.net). Bruk av denne funksjonen er nyttig for å lage sessionstokener og til og med skjemataster som vist i Sikre skjemaer med skjemttaster.
"; skriv ut uniqid (" NETTUTS ", SANT); // Legge til et ekstra prefiks og sette mer_entropi til TRUE?>
Funksjonen uniqid ()
aksepterer to parametere den første legger til et prefiks for resultatene mens den andre, hvis den er satt til SANT, vil legge til ekstra entropi til slutten av den returnerte verdien.
Det finnes et gazillioneksempler på nettet som genererer tilfeldige passord, alle gjør en fin jobb på den. "Men hvorfor," spør du "vil jeg trenge å generere et tilfeldig passord?" Vel svaret er ganske enkelt, så du trenger ikke å stole på sluttbrukeren for å gi seg et mindre enn sikkert passord når du går. Å generere tilfeldige passord er svært nyttig i brukerregistreringer, eller når en bruker gjør en forespørsel fordi de har glemt passordet sitt. Å gjøre dette sikrer et sterkt passord i begynnelsen av en brukeropplevelse på nettstedet ditt, eller kan kutte ned kodelinjer når en bruker trenger å få tilgang igjen.
La oss se på noen eksempler: Eksempel 1
Dette eksempelet blander en streng med str_shuffle
og vil returnere en streng innenfor et tellet område. Så hvis du ønsket å generere et 8 tegn passord, så ville du passere 8 til funksjonen randompassword, eller randompassword (8) fra kildekoden din.
Eksempel 2
Til sammenligning tar eksempel en en statisk streng og blander den opp og returnerer den, eksempel 2 legger til i mer dynamisk smak (mmm smakfull). I eksempel to er strengen som blir blandet ikke lenger statisk, men endres med hver generasjon. Selv om det første eksemplet er sikkert tilstrekkelig i de fleste tilfeller for å generere et sterkt passord, tillater det andre eksempelet oss å sikre at strenglengden og tegnene vil endres ved bruk, reduserer sjansen for en duplisering.
Håndheve bruk av sterke passord i et webprogram vil avskrekke brukere fra å besøke eller registrere seg for et nettsted. Det er ofte en avtale mellom å få trafikken du ønsker, og sikre sikkerheten til søknaden. Jeg foreslår at brukerne dine kan lage sine egne passord ved påmelding, eller la dem velge mellom de to.
Salting passord er en effektiv måte å øke sikkerheten til brukerkontoene dine, selv om en angriper får tilgang til databasen din, hvis den er gjort riktig. Det kan hevdes at en angriper med tilgang til saltet fortsatt kan få legitimasjonene dine. Selv om dette er sant, vil bruk av noen randomiseringsteknikker til lagring av passord gjøre denne prosessen ekstremt vanskelig, spesielt hvis lagringen av brukerinformasjon og innhold er delt inn i separate databaser.
Igjen faller dette under "ikke-tillit fra sluttbrukeren til å gi seg selv enkel sikkerhet" mål. Brukere bruker generelt passord som er enkle å huske, og bruker selv de samme passordene på flere nettsteder (jeg vet, rett !?). Lett å huske passord er vanligvis ord som finnes i en ordbok og andre typer verdier (for eksempel 12345, QWERTY). Som utviklere scoffer vi ofte på denne praksisen, men vi kan ikke nekte at det er akkurat slik ting er.
For at en webapplikasjon skal kunne bruke et salt i et passord, må søknaden lagre det et eller annet sted. Det anbefales ikke å bruke det samme saltet over en hel database med passord, men for å generere et unikt salt per bruker. Å generere ett salt for en hel database reduserer faktisk sikkerheten til webapplikasjonen på en måte at hvis en angriper klarer å knekke det, er hele ordningen brutt, eller hvis den går tapt, gjør databasen ubrukelig. Å lage et fullverdig medlemsregistreringssystem med alle klokkene og fløyter er ikke omfattet av denne opplæringen, men vi skal lage et enkelt system for å bruke et eksempel. La oss se på å generere et salt og bruke noen randomiseringsteknikker:
Her er SQL-tabellen som vi skal bruke.
CREATE TABLE IF NOT EXISTS 'brukere' ('usr_id' int (11) IKKE NULL AUTO_INCREMENT, 'usr_name' varchar (24) IKKE NULL, 'usr_pass' varchar (32) IKKE NULL, 'usr_email' varchar (255) IKKE NULL, 'usr_salt' varchar (255) IKKE NULL, PRIMARY KEY ('usr_id')) ENGINE = MyISAM DEFAULT CHARSET = latin1;
Suksess'; annet echo 'Failure
'; ?>
La oss gå over PHP-koden. For å holde ting enkelt, inkludere vi vår database config fil. Neste PHP sjekker for å se om skjema HTML har blitt sendt inn ved å sjekke om $ _POST
variablene er ikke tomme. Hvis de ikke er tomme, fortsetter manuset for å unnslippe de utgitte skjemadataene fra brukeren, og forbereder den til å bli satt inn i databasen. Vi genererer deretter et enkelt salt ved hjelp av uniqid ()
og mt_rand ()
og lagre den i variabelen $ salt_gen
. For å saltet vårt passord kombinerer vi $ passordet, deretter saltet. Neste trinn, one way hashing de kombinerte variablene med md5.
"Men vent! Du har også lagt til brukerens e-post på forsiden av passordet og saltkombinationen!" Jepp! Jeg gjorde dette fordi hvis en angriper får tilgang til databasen på en eller annen måte, og saltet, er den eneste måten angriperen skal vite sikkert at e-postadressen brukes i hakking av passordet, hvis de har tilgang til kildekoden. Hvor tilfeldig og unik er en e-postadresse?
På toppen av resten av PHP-koden av legger vi inn våre variabler i databasetabellen innenfor deres respektive felt, og gir brukeren noen tilbakemelding om suksess eller fiasko. Nå på resten av registreringsfilen, HTML
Her oppretter vi et enkelt HTML-skjema som vil samle et brukernavn, en e-post og et passord fra en bruker. Ikke noe fancy her.
Så vi har nå et enkelt registreringsskjema, som legger inn en bruker i databasen sammen med sitt saltede passord. La oss lage en innloggingsside som krever at vi henter informasjon fra databasen og godkjenner brukeren. Først PHP:
Yippie, vi er autentisert!'; annet echo 'Å nei, vi er ikke godkjent!
'; annet echo 'Å nei, vi er ikke i databasen!
'; ?>
I utgangspunktet hva vi gjør i login.php filen tar de innmeldte skjema variablene, tar tak i tabellraden knyttet til brukernavnet og gjenoppbygger passordet fra elementene i databasen den ble opprettet med (email, pass, salt) og rehashing dem . Vi sjekker deretter databasen på nytt for brukernavnet OG den rehashed passordverdien for å finne en kamp, og sender brukeren til suksess eller fiasko. Endelig her er HTML:
En enkel, men likevel kompleks definisjon av obfuscation er (bruk versjonen i kilden hvis du ønsker å kjøre koden):
Som du kan se, er denne koden ikke ment å skille. Det er ingen forskjellige variable navn, det er ingen kommentarer, ingen mellomrom, ingen innrykk, ingen forskjellig rekkefølge, og alt er i en linje. Selv om vi ikke kan skille koden, vet våre maskiner fortsatt hva det er. Det fungerer. Denne ene linjen med kaos simpelthen ekkos "Obfusjon er en teknikk som brukes til å komplisere koden på en slik måte at jeg ikke forstår det." Ja, jeg vet om feilene.
Obfuscation har fordeler og ulemper. Det er meningen å disuade en person fra å finne ut hvilken kode som gjøres på et øyeblikk, eller for en periode. Dette er et pluss mot personer med lite eller ingen kjennskap til programmeringsspråket. Imidlertid kan noen som har en grunnleggende forståelse av PHP, spre den ovennevnte koden og finne ut hva det gjør, det kan bare ta litt tid. Dette er en av feilene i obfuscation, det er ikke en form for kryptering, det er bare et forsøk på å være kryptisk. Obfuscation legger også normalt til filstørrelse. Mye av tiden, vil du oppleve forvirret kode i propriatary og ondsinnet programvare.
Dette er et vanlig spørsmål. Det er primært to måter å forvirre koden din. Først kan du gjøre det for hånd. Å skrive forkrosset kode tar lang tid. Eksemplet som ble brukt i denne artikkelen tok en stund å skrive på grunn av de samme grunnene du bruker forvirring i utgangspunktet (mangel på struktur, rekkefølge osv. ...), dette resulterte selv i noen menialfeil som jeg ikke engang ville jakte på og fikse det. Den andre måten du kan forvirre koden på, er å kjøpe programvare som gjør det for deg. Å bruke et program for å forvirre kode er trivielt, og selvfølgelig koster det mye penger. Noen programvare som hevder å forvirre koden din, krypterer og / eller koder det på en slik måte at den bygger på et håndtrykk for å fungere. Ofte finner du programvare hvis leverandør ikke engang garanterer at koden din vil fungere når den er ferdig. Selv i eksemplet brukte jeg en enkel Base64
funksjon for å kode konstruksjonen av skriptutgangen.
Det avhenger virkelig av planen din. Spesielt hvis du ønsker å selge PHP-scriptet ditt (eller programvare), må du lisensiere det. Dette kommer til å være en av forsvarslinjene for å hindre programvaren til å bestemme publikum for å gjøre hva de vil. Et godt eksempel på lisensiering kan ses på Envato Marketplace Wiki. Men du vil kanskje forvirre noen, eller all din kode, uansett grunn. Men på grunn av obfuscations-negativer, hvis du virkelig bekymret sikkerheten til kildekoden din, kan det være verdt å lete etter kryptering i stedet.
Wikipedia.com definerer kryptografi som:
"praksis og studier av å skjule informasjon."
Kryptografi er en stor avtale, er du klar over det eller ikke. I nesten alle webapplikasjoner som for tiden er distribuert, er det noen tilstedeværelse av kryptering som benyttes (dvs. postklienter og nettsteder). Som utviklere trenger vi å være informert og klar over de praktiske bruken av kryptografi i vår programvare. PHP gir oss noen svært grunnleggende og praktiske funksjoner vi kan bruke til å kryptere data. I denne delen vil jeg hovedsakelig gå over enveis hashing-algoritmer, selv om jeg vil berøre lett på symmetrisk nøkkelbasert kryptering. Det er mye mer (dvs. Steganography, Asymmetric-Key for å nevne et par).
Mye av tiden vi bruker enveis hashing som en måte å sikkert lagre passord og sjekke data integritet av filer. Mens vi gjør dette, for å godkjenne medlemmer av en webapplikasjon, har vi skrevet brukerne passord, og samsvarer det med brukerne lagrede hash. Den samme teknikken gjelder for å kontrollere filens integritet.
SHA-1, 2 og 3
SHA-familien av hashalgoritmer er for tiden den mest populære, betydelig SHA-1. Selv om SHA-1-algoritmen kan ha svakhet, er den fortsatt i stor bruk.
"; ekko $ hash2."
"; / / Vil utdata: 42d2f15c3f92d28d7d58776e5d81b800f662cc6c?>
I PHP kreves SHA-2 i en annen henseende, og krever PHP 5 større enn eller lik 5.1.2. SHA-2 er overlegen til SHA-1 og kan kalles med forskjellige bitstørrelser.
"; ekko $ hash_sha384."
"; ekko $ hash_sha512."
? "; / * Utganger repspectively: SHA256: 09074adc0d70e15b88494643e29c2836e1ab94a21989691dec594cb0bd742ebc SHA384: 8535470750df54a78701d4bfe0451f9799057a5bc101944a32480d2436e8b95440bce3bcab3f9ce107b0b92d9595ae32 SHA512: c2e6dce873a71800b862791e56b480b976bb26cd3136c02da510c3905caa49b7b9e9260549976e1e741cc93e4569a611f2030d3b7104c6c6c2ff9e6c9bf0946a * />
Hashfunksjonen kalles av hash (algoritme, streng); I de nyeste PHP-versjonene kan hash () -funksjonen brukes til å ringe til en engangs-hashalgoritme PHP-støtte (dvs. md5, sha-1, haval, spøkelse). Hvis du vil se en liste over alle registrerte hashingalgoritmer, kan du bruke:
= 5.1.2 print_r (hash_algos ()); ?>
SHA-3 utvikles fortsatt og vurderes for standardisering. En konkurranse om å finne en god kandidat til å fungere som den nye sikre hashalgoritmen ble lansert av Nasjonalt institutt for standarder og teknologi, og oppføringer for konkurransen ble tidsbegrenset 31. oktober 2008. En ganske populær oppføring med navnet Skein, har en tilgjengelig PHP-modul Du kan laste ned (selv om du må kompilere det selv). Skein er utviklet av noen store navn som finnes i sikkerhetsbransjen som Bruce Schneier, Niels Ferguson og Stefan Lucks for å nevne noen. Den offisielle Skeins nettside finnes her.
Symmetrisk-Nøkkelkrypteringsmetoder er hvor sikkerheten til kryptering hovedsakelig ligger innenfor en nøkkel, som deles mellom to punkter, hvor dataene er kryptert og hvor dataene dekrypteres. Et veldig godt eksempel på hvordan dette kan fungere ble gitt av Christian Beikovs "Opprett en Crypter klasse med PHP" opplæring.
I hovedsak er HMAC som en blanding mellom enveis hashing og nøkkelbasert kryptering. HMAC-sikkerhet er avhengig av nøkkelstørrelsen som brukes, og styrken av hashfunksjonen er beregnet med. Du kan noe sammenligne denne metoden for å salte passord.
";?>
Vel, hva en reise! Randomizing verdier, generering tilfeldige passord, salting, lagring og autentisering av brukere, obfuscation, krypto ... virker som mye å ta inn. Men verdt det! Det er viktig å vite hva slags sikkerhet du skal implementere i dine webprogrammer, og hvordan du skal beskytte den. Enda mer er det viktig å holde en smart holdning til disse implementasjonene, og ikke tenk at sikkerheten bare implementeres av noen få metoder, men av en kombinasjon av dem, med et strekk kreativitet.