Principsvar
Qimen skrev:
Varje gång jag sätter mig ned och börjar på ett nytt projekt kommer jag alltid fram till samma sak. Jag behöver en funktion som jag kan köra all data igenom (som ska till eller från databasen).
Faktum är att du behöver en massa saker, beroende på ambitionsgrad.
(Alla svar i dett inlägg bygger på artiklar och böcker av Ilia Ashanetsky och Chris Schifflett, samt PHP Security Consortium.)
Vill du validera teckenkodningen (området 128-159 är otillåtet i ISO, flera områden är otillåtna för UTF-8)?
Vill du validera värden? Max- och minimimilängd på strängar? MySQL - om du använder det - klipper normalt bara bort överskjutande tecken. Är det ett önskvärt beteende? (Själv sätter jag alltid MySQL att vägra INSERT eller UPDATE om strängar är för långa eller heltal för höga)
Vilken HTML vill du tillåta användaren skicka - om någon? Det skiljer sig från variabel till variabel för mig.
Qimen skrev:
Samtidigt vill jag ha det lagrat på ett smart sätt, vill ju inte fylla dbn med en massa htmlkoder.
Bra tänkt. man bör ha sin data lagrad i så enkel form som möjligt. Nästa gång kanske den skall inkluderas i en PDF?
Qimen skrev:
Det jag tänkt på som kan vara bra att ta en titt på är:
- Om det är en array?
Kan behöva behandlas rekursivt.
Qimen skrev:
- Om det är post/get-data?
Också innehållet i $_COOKIE och många värden i $_SERVER och $_ENV skall behandlas som potentiella risker.
Qimen skrev:
- Om magic quotes är på eller ej?
Om på: Tag bort dem direkt, innan all annan bearbetning sker. Men lägg inte på någon annan "eskejpning" innan den behövs.
Qimen skrev:
- Om det är det blandade tecken eller endast nummer?
Varje värde bör prövas för sig.
Qimen skrev:
- Om datan är på väg in till dbn eller på väg ut från dbn?
Om databasen står till 100% under din kontroll kan du behandla utdata som säker - men den skall i rätt ögonblick naturligtvis ändå "eskejpas", t.ex. med htmlspecialchars. Försvar på djupet. Om du inte vet att databasen är orörd, hantera dess innehåll - med omdöme - som användarindata.
Qimen skrev:
- Om det finns farliga tecken som bör säkras med t.ex. addslashes?
Addslashes är den sämsta metoden. Den missar många tecken som erfarna hackers kan tänkas skicka. Prepared statements - eller i värsta fall mysql_real_escape_string.
Qimen skrev:
- Om det finns landsspecifika tecken som bör kodas om (åäö)?
Teckenkodningen fixar åäö, japanska och kyrilliska. Du använder väl inte US-ASCII?
Qimen skrev:
Som ni ser finns det en hel del man bör tänka på. Det jag har kört fast på är hur jag ska lagra specifika tecken som åäö, vill samtidigt inte låsa funktionen till endast svenska. Att köra htmlspecialchars på allt känns som lite overkill, lär öka upp storleken på dbn. Kanske räcker det med att köra htmlspecialchars? Eller är det bättre om jag kör addslashes (alt. mysql_real_escape_string) och skapar en egen liten tabell med tecken som kan vara bra att koda om?
Du skall välja funktion efter omständighet. Det är skillnad på att stoppa SQL-injektion och XSS.
Qimen skrev:
Det hela leder till en annan intressant fråga. Bör man ur säkerhetens syn koda om ovanliga tecken som t.ex. åäö eller är det lugnt att lagra dem som det är? :)
Koda aldrig om tecken som inte kan vara skadliga - och lagra inte din data kodad, utan i råformat. Escape output inte input.
Prepared statements - i värsta fall mysql_real_escape_string om du måste använda gammal kod - sker alltså precis innan man kör sin fråga. htmlspecialchars körs precis innan man ekar ut sin utdata till en webbläsare. escapeshellcmd och escapeshellarg körs precis innan exec eller passthru och liknande. Indata skall filtreras, inte "eskejpas". Utdata skall "eskejpas".