PHP er et av de mest populære programmeringsspråket på nettet. Noen ganger kan et funksjonsvennlig språk hjelpe programmereren for mye, og sikkerhetshull kan krype inn, og skape veier i utviklingsbanen. I denne opplæringen vil vi ta en titt på 5 tips for å hjelpe deg med å unngå noen vanlige PHP-sikkerhetsfall og utviklingsløk.
Under utviklingsprosessen er applikasjonsfeilrapportering din
bestevenn. Feilrapporter kan hjelpe deg med å finne stavefeil i din
variabler, oppdage feil funksjonsbruk og mye mer. Men en gang
Nettstedet går i live samme rapportering som var alliert under
utvikling kan bli forræder og fortelle brukerne mye mer om din
nettsted enn du kanskje vil at de skal vite (programvaren du kjører, din mappe
struktur, etc).
Når nettstedet ditt fortsetter, bør du sørge for å skjule all feil
rapportering. Dette kan gjøres ved å påkalle følgende enkle funksjon
øverst på søknadsfilen din.
error_reporting (0);
Hvis noe går galt, vil du fortsatt ha og trenger å vite om
den. Derfor bør du alltid være sikker på å logge feilene dine til en
beskyttet fil. Dette kan gjøres med PHP-funksjonen set_error_handler.
Fra sine tidligste dager har PHPs designere alltid inkludert noen
funksjoner for å gjøre utviklingen enklere. Eller så tenkte de! Noen av disse
nyttige funksjoner kan få utilsiktede konsekvenser. Jeg kaller disse "dårlige"
funksjoner "fordi de har tillatt data validering mareritt og
opprettet en bane for feil for å finne veien inn i skript. En av
De første tingene du bør gjøre når utviklingsprosessen begynner er
deaktiver visse av disse funksjonene.
Merk: Avhengig av verten din, kan disse eller ikke være slått av for
du. Hvis du utvikler på din egen datamaskin eller annen lignende lokal
miljø, vil de sannsynligvis ikke bli slått av. Noen av disse funksjonene
har også blitt fjernet i den kommende PHP6, men er allestedsnærværende i PHP4
applikasjoner og blir bare utdatert i PHP5-applikasjoner.
Registrer Globals (register_globals)
Kort sagt, register_globals var ment å hjelpe rask søknad
utvikling. Ta for eksempel denne nettadressen,
http: //yoursite.tld/index.php? var = 1, som inkluderer en spørringsstreng. De
register_globals-setningen tillater oss å få tilgang til verdien med $ var
i stedet for $ _GET ['var'] automatisk. Dette kan hende nyttig for deg,
men dessverre har alle variabler i koden nå denne egenskapen, og
vi kan nå enkelt komme inn i PHP-applikasjoner som ikke beskytter mot
denne utilsiktede konsekvensen. Følgende kodestykke er bare en
vanlig eksempel du vil se i PHP-skript:
Hvis (! tomt ($ _POST ['brukernavn']) && $ _POST ['brukernavn'] == 'test' &&! tomt ($ _POST ['passord']) && $ _POST ['passord'] == "test123 ") $ access = true;
Hvis programmet kjører med register_globals ON, kan en bruker
bare plasser tilgang = 1 i en spørringsstreng, og vil da ha tilgang til
uansett hvilket skript som kjører.
Dessverre kan vi ikke deaktivere register_globals fra skriptet
side (bruker ini_set, som vi normalt kan), men vi kan bruke en
.htaccess-filer for å gjøre dette. Noen verter lar deg også få en php.ini
fil på serveren.
Deaktiverer med .htaccess
php_flag register_globals 0
Deaktiverer med php.ini
register_globals = Av
Merk: Hvis du bruker en egendefinert php.ini-fil som ikke er aktuell for
hele serveren, må du inkludere disse erklæringene i hver undermappe
som har PHP.
Magic Quotes (magic_quotes_gpc, magic_quotes_runtime, magic_quotes_sybase)
Magic Quotes var en funksjon ment å lagre programmører problemer med
ved hjelp av addslashes () og andre lignende sikkerhetsfunksjoner i deres kode.
Det er minst tre problemer forbundet med magiske sitater. En
Problem med denne hjelpsomme funksjonen er hvis begge magiske sitater og
addslashes () brukes. Hvis dette er tilfelle, så slutter du med
Flere skråstreker legges til, noe som forårsaker feil. Det andre problemet er hvis
du antar at magiske sitater er slått på, og det er faktisk
ikke. Deretter går all inngang ukontrollert. Det tredje problemet er det magiske
Sitater unngår bare enkle og doble anførselstegn, men hvis du bruker en
databasemotoren, er det også mange databasespesifikke tegn som
må også bli rømt. Det anbefales at du deaktiverer dette
funksjon og bruk riktig variabel validering i stedet (se nedenfor).
Dessverre kan vi heller ikke deaktivere magiske sitater fra skriptet
side ved hjelp av ini_set. Som med register_globals, kan vi bruke .htaccess eller
php.ini-filer for å gjøre dette.
Deaktiverer med .htaccess
php_flag magic_quotes_gpc 0 php_flag magic_quotes_runtime 0
Deaktiverer med php.ini
magic_quotes_gpc = Av magic_quotes_runtime = Av magic_quotes_sybase = Av
Merk: Hvis du bruker en egendefinert php.ini-fil som ikke er aktuell for
hele serveren, må du inkludere disse erklæringene i hver undermappe
som har PHP.
I tillegg til å unnslippe tegn, er det en annen god måte å beskytte
input er å validere det. Med mange programmer, er du faktisk allerede
vet hva slags data du forventer på input. Så den enkleste måten
Å beskytte deg mot angrep er å sørge for at brukerne bare kan
skriv inn de aktuelle dataene.
For eksempel, si at vi lager et program som viser brukere
bursdager og lar brukerne legge til sine egne. Vi vil være ute etter
godta en måned som et tall mellom 1-12, en dag mellom 1-31 og et år
i formatet på ÅÅÅÅ.
Å ha denne typen logikk i søknaden din er enkel og vanlig
uttrykk (regex) er den perfekte måten å håndtere input validering.
Ta følgende eksempel:
hvis ! preg_match ("/ ^ [0-9] 1,2 $ /", $ _GET ['måned'])) // handle error hvis (! preg_match ("/ ^ [0-9] 1,2 $ / ", $ _GET ['dag'])) // handle error hvis (! Preg_match (" / ^ [0-9] 4 $ / ", $ _GET ['år' ])) // håndtere feil
I dette eksemplet sjekket vi ganske enkelt (i de to første om setningene)
for heltall [0-9] med en lengde på en eller to 1,2 og vi gjorde det
samme i den tredje if-setningen, men kontrollert for en streng lengde på 4
tegn 4.
I alle tilfeller, hvis dataene ikke samsvarer med det formatet vi ønsker, vi
returnere en slags feil. Denne typen validering går svært lite
rom for enhver type SQL-angrep.
Regex uttrykk som de ovenfor kan være litt vanskelig å
forstå først, men å forklare dem er utenfor rammen av dette
artikkel. Php manualen har noen ekstra ressurser for å hjelpe deg med validering. PEAR-databasen har også noen pakker som Validate-pakken for å hjelpe med e-post, datoer og URLS.
Nedenfor er et eksempel på det ovennevnte skriptet i handling ved hjelp av 200 som innspill for en måned, abc for dagen og bare 09 for året.
En webapplikasjon aksepterer vanligvis innspill fra brukere og viser den
på en måte. Dette kan selvsagt være i mange forskjellige former
inkludert kommentarer, tråder eller blogginnlegg som er i form av HTML
kode. Når du godtar input, kan HTML være en farlig ting,
fordi det gjør det mulig for JavaScript å bli utført på utilsiktede måter.
Hvis det enda hullet er åpent, kan JavasScript utføres og informasjonskapsler
kan bli kapret. Denne informasjonen om informasjonskapsler kan da brukes til å feire en ekte
konto og gi ulovlig bruker tilgang til nettstedets data.
Det er noen måter du kan beskytte deg mot fra slike angrep. En
måten er å forby HTML helt, for da er det ikke mulig
måte å tillate JavaScript å utføre. Men hvis du gjør dette da
formatering er også ugyldig, noe som ikke alltid er et alternativ for forumet
og bloggprogramvare.
Hvis du vil at HTML hovedsakelig er deaktivert, men likevel vil tillate enkelt
formatering, kan du tillate bare noen få utvalgte HTML-koder (uten
attributter) som eller . Eller alternativt,
du kan tillate et populært sett med tagger kalt "BBCode" eller "BB-tagger"
vanligvis sett på forum i formatet av [b] test [/ b]. Dette kan være en
Perfekt måte å tillate noen formatering tilpasning mens du tillater det
noe farlig. Du kan implementere BBCode ved hjelp av eksisterende
pakker som HTML_BBCodeParser eller skriv din egen BBCode-implementering med vanlige uttrykk og en rekke preg_replace-setninger.
Sist, men ikke minst, er et av de mest kjente sikkerhetsangrepene
på nettet: SQL-injeksjon. SQL-injeksjonsangrep oppstår når data går
unchecked, og programmet unnslipper ikke tegn som brukes i SQL
strenger som enkelt anførselstegn (') eller dobbel anførselstegn (").
Hvis disse tegnene ikke blir filtrert ut, kan brukere utnytte systemet ved å gjøre spørringer alltid sanne og dermed tillate dem å lure påloggingssystemer.
Heldigvis tilbyr PHP noen verktøy for å beskytte databasen din
input. Når du er koblet til en sql-server, kan du bruke disse
Fungerer med et enkelt anrop, og variablene dine skal være trygge å bruke
i spørringer. De fleste av de store databasesystemene som tilbys med PHP inkluderer
disse beskyttelsesfunksjonene.
MySQLi lar deg gjøre dette på en av to måter. Enten med funksjonen mysqli_real_escape_string når den er koblet til en server:
$ brukernavn = mysqli_real_escape_string ($ GET ['brukernavn']); mysql_query ("SELECT * FROM tbl_members WHERE brukernavn = '". $ brukernavn. "'");
Eller med forberedte uttalelser.
Forberedte utsagn er en metode for å separere SQL-logikk fra dataene som sendes til den. Funksjonene som brukes i MySQLi-biblioteket, filtrerer vårt innspill for oss når vi binder variabler til den forberedte setningen. Dette kan brukes som så (når det er koblet til en server):
$ id = $ _GET ['id']; $ statement = $ connection-> prepare ("VELG * FRA tbl_members hvor id =?"); $ statement-> bind_param ("i", $ id); $ Statement-> utføre ();
En ting å merke seg når du bruker forberedte setninger er "jeg" i bind_param. jeg står for heltal, men du kan bruke s for streng, d for dobbel og b for blokkering avhengig av hvilke data vi passerer.
Selv om dette vil beskytte deg i de fleste tilfeller, bør du
Vær fortsatt oppmerksom på riktig data validering som nevnt tidligere.
Denne korte opplæringen kan bare skrape overflaten av websikkerhet.
Til slutt er det opp til utviklere å sikre at applikasjonene de
bygge er trygt ved å utdanne seg om farene ved nettet og
de vanligste typer sårbarheter og angrep. Hvis du vil
Les mer om sikkerhetsproblemer i PHP, det er en seksjon om sikkerhet i php manualen som er viet til dem.
Hva er dine tips?