Wku

Hur man skriver säkra programvara för webben

Webbapplikation säkerhet är avgörande. Säkerhetsluckor i webbapplikationer du skriver kan resultera i att din webbplats är oläsligt, vilket är bara väldigt pinsamt. Det kan resultera i användarens information blir stulen, vilket är irriterande och kan landa dig i juridiska varmt vatten i din jurisdiktion. Eller det kan resultera i att din värd används för spam, distribuerade överbelastningsattacker, eller sprider skadlig programvara, som alla gör Internet en sämre plats för alla andra. Några enkla steg och rätt tänkesätt, kan minska risken för att detta händer på grund av de program du har skrivit.

Steg

Hur man skriver säkra programvara för webben. Undvik SQL injektioner.
Hur man skriver säkra programvara för webben. Undvik SQL injektioner.
  1. 1
    Undvik SQL injektioner. SQL injektioner är kanske det vanligaste sättet på vilket web programvara äventyras idag. Exemplet från Wikipedia följer. Betrakta följande rad i pseudokod.

    Detta fungerar bra om "a_variable" kan vara betrodda. Men om det är ett användarvänligt medföljande variabel, kan en angripare tillhandahålla detta:

    Vilket skulle resultera i denna fråga som körs:

    Vilket naturligtvis är en fruktansvärd sak att ha. Lösningen är att sanera eventuella användarlevererad variabler, religiöst. PHP har mysql_real_escape_string funktion för MySQL. Andra Databasbibliotek för andra program har samma sak. Använd dem, och du kommer att vara mycket säkrare. Det finns också objekt-relationella kartografer (som Django för Python) som sparar dig från att skriva SQL-kod alls, och ta hand om fly strängar innan de skickas till din databas, överväga att använda en av dessa.
  2. 2
    Öppna aldrig något filnamn baserat på en parameter som användaren leveranser. Till exempel, om du visar en fil till en användare, kanske du frestas att ha en webbadress som display.php file = something.txt, och i din PHP-kod använda detta?:

    Detta är mycket farligt, eftersom det ger dem möjlighet att använda sekvenser av ".. /" (ta med dem till den överordnade katalogen) för att inkludera alla filer i filsystemet, till exempel genom att gå till display.php? File =.. /.. /.. /.. /.. / etc / passwd.
    I bästa fall kommer det möjligt för dem att samla in information om din server konfiguration, vilket skulle kunna ge värdefull information för en annan attack. I värsta fall, om PHP: s krav eller inkludera funktioner (eller motsvarande i ditt språk) används för att inkludera innehållet i filen, kan den tillåta exekvering av kod (genom att manipulera User-Agent header då inklusive filen / proc / själv / miljö ).
    Lösningen på detta är att antingen hitta något annat sätt att inkludera den fil som inte gör så baserat på användarens input, eller mycket noggrant desinficera den medföljande filnamnet. Kontrollera varje tecken för giltighet, och kasta eventuella förbjudna som använder principen att de tecken som inte är tillåtna är förbjudna, och inte genom att helt enkelt ta bort skadliga. Med andra ord, försök inte att ersätta dåliga tecken i en sträng. Gör en lista på de som uttryckligen är tillåtna och skanna sträng för dem, att ta bort allt som inte är med i listan över tillåtna och kära. Det är 1) enklare 2) försvarar mot Angreppsvägarna du inte hade tänkt på.
  3. 3
    Sanitise alla data som du skriver till en sida. Din kod kan acceptera en parameter som kallas "människa" (dvs. index.php personen = Bob, och din kod skulle innehålla något sådant?:

    Detta tillåter en angripare att skriva godtycklig JavaScript till sidan, vilket innebär att om de övertygade någon att bara följa en länk till platsen, kunde de få dem att orsaka en åtgärd med en bieffekt (t.ex. posta en kommentar, eller skicka någon annan form). Byt ut alla kända-dåliga tecken (citationstecken, <och> med deras motsvarighet HTML enhet innan du skriver det till en sida.
    Många mönsterbildande motorer kommer att göra detta åt dig automatiskt, och kommer endast att tillåta HTML tecken i en utmatade variabel om de uttryckligen deklarerade säkerhetsområdet. Du kanske vill överväga att använda en.
    Om du behöver tillåta viss begränsad HTML (till exempel för att tillåta textformatering i kommentarer), desinficera sådana HTML att endast tillåta taggar är kända för att vara säkra och ha mindre biverkningar (såsom <em>), kassera alla andra, och kassera oönskade HTML-attribut. Återigen, bör principen vara bara tillåta vad uttryckligen är tillåtet, och band allt annat. (Efter denna princip kunde ha förhindrat en ökänd WordPress sårbarhet, där det saneras CSS inom en "stil" attribut, men lämnade den orörd om attributet namn i versaler.)
  4. 4
    Aldrig passera en användarlevererad variabel till ett skal. Till exempel kanske du har skrivit ett skript för att skicka en ping till en given värd. Det skulle ta en parameter kallad host (t.ex. ping.php host = 127.0.0.1?), Och så att du kan frestas att göra detta:

    Detta är mycket farligt, eftersom genom att tillföra en "host" parameter med ett rör symbol eller ett semikolon, gör det dem att köra något kommando på datorn (till exempel, ger en mängd "127.0.0.1 | wget").
    Lösningen på detta är att undvika att använda systemet fungerar där så är möjligt, åberopa externt program på annat sätt pcntl_exec är en bättre idé för PHP.. Om du måste använda systemet, noggrant desinficera eventuella användarlevererad uppgifter leds sedan vidare till skalet. (Ett exempel på vår "ping" manus skulle vara att kontrollera varje tecken för att säkerställa att det var antingen ett nummer, brev, eller period, och kasta alla tecken som är något annat.)
  5. 5
    Använd funktioner som php s eval mycket, mycket noga. Om strängen innehåller ett användarvänligt medföljande variabel, då det ger dem möjlighet att exekvera godtycklig kod. I själva verket finns det nästan aldrig en anledning att använda detta, om du befinner dig använda det, är din kod förmodligen fruktansvärt och du bör tänka om det.
  6. 6
    Kontrollera referrer på alla HTTP POST-begäran som har biverkningar. Se till att den nationella webbplatsen är din webbplats, annars kunde det har helt enkelt varit en användare som klickat på en knapp i ett formulär på en annan webbplats. (Du kanske eller kanske inte vill se till att den nationella webbplatsen är icke-tom. Den remitterande kan vara tom om angriparen kontrollerad webbsida använder säker HTTP och din inte.). Ett annat knep när du använder ett formulär skapar en unik kod, och lagra den i både en session variabel och i ett dolt fält i formuläret. När de lämnar in, kontrollera om värdet på det dolda fältet är lika med en i sessionsvariabel.
  7. 7
    Låt aldrig en HTTP GET-begäran för att ha en bieffekt. Till exempel, aldrig skriva till en databas med hjälp av parametrar som tillhandahålls i en GET begäran. Kom ihåg att en GET begäran kunde vara en användare av din webbplats som lurades till att klicka på en länk.
  8. 8
    Verifiera referenser vid varje steg. Här är ett exempel:
    Ett. De användare begär att utföra en viss åtgärd.
    Tre. Du visar ett "Är du säker på att du vill göra detta?" sida med åtgärden uttryckt i dolda formulärfält.
    Tricket är, om du bara kontrollera deras tillstånd att genomföra dessa åtgärder i steg 2, men inte i manuset som publiceras i steg 4, detta räknas på dem att inte kunna ändra formen ges till dem i steg 3 (som är förtroende felplacerad kraftigt), eller ens gå till steg 4 direkt.
  9. 9
    Spara inte lösenord i klartext. Detta är en förmildrande åtgärd ifall din webbplats äventyras. Eftersom många användare återanvändning lösenord, kan det betyda att alla deras andra online-konton får äventyras. Standarden motåtgärd till detta är att lagra en kryptografisk hash (som använder SHA-2-algoritm) av summan av några få byte av slumpmässiga data plus lösenord. Detta kommer att göra det möjligt att kontrollera om en medföljande lösenordet är korrekt, utan att spara lösenordet själv.
    (För att framtidssäkra, kan det vara en god idé att spara den typ av algoritm som används också, i fall du behöver för att migrera till en annan hash-algoritm, bör allvarliga brister finns i de befintliga. Detta hände MD5 och SHA- 1, får och ändå hända att dagens mest betrodda hash algoritmer.)
  10. 10
    När du använder en databas, inte förvara informationsdatabas inloggning direkt i rotmappen på din ansökan. Istället, lagra dem i en annan mapp och sedan antingen 1) neka åtkomst till mappen med webbserverns inställningar eller. Htaccess 2) lagra filen utanför dokumentets rot. Sedan inkludera filen, programmet påverkas inte av din webbserver behörigheter. Detta kommer att stoppa folk från att gå till http://your-awesome-site.example.com/config.ini att ta reda på din informationsdatabas inloggning (men det kommer inte att stoppa en angripare som har hittat en sårbarhet fil integration som i steg 3, eller ett skal kod exploatera som i steg 4).
  11. 11
    Inte beroende av robotar. Txt för att dölja känsliga områden på din webbplats. Det finns ibland goda skäl att göra detta (till exempel, om hela din webbplats är känslig och du inte vill att det indexeras av sökmotorer). Men kom ihåg att en av de första sakerna en angripare med siktet inställt på att kompromissa din webbplats kommer att göra är att titta på din robots.txt för att se vad du gömmer. Ett bättre sätt att göra detta är att använda en metatagg på de sidor du inte vill ska indexeras (t.ex. dina administrativa back-end sidor). Till exempel:
    <meta name="robots" content="noindex, nofollow" />
  12. 12
    Kom i rätt tänkesätt. Denna artikel är inte avsedd att vara en omfattande lista av alla säkerhetsproblem som kan påverka din webbplats, men det ger några verkliga exempel på tillämpningen några viktiga principer:
    • Lita aldrig på någon information som kan tillhandahållas av användaren. Sannerligen, anta att användaren är en angripare, och behandla eventuella användarlevererad uppgifter därefter.
    • Vid desinficering uppgifter, endast tillåta det som är säkert, och remsor något annat. Detta försvarar mot dålig ingång som du inte hade tänkt på när du skriver in koden. Ett exempel på detta skulle vara om du utvecklat din programvara på och för en Unix-liknande system, och försvaras mot fil-integration sårbarheter genom att avlägsna eventuella snedstreck från en uppgift filnamn. Detta skulle fungera OK, tills någon utplacerade din kod på en Windows-låda (vilket skulle tillåta ett omvänt snedstreck som en väg separator).
    • Antag att du kommer att göra misstag, och tillämpa principen om djupförsvar att mildra effekterna. (Ovanstående "tillåter endast det som är säkert" är ett specialfall av detta.)
    • Antag en potentiell angripare vet allt som du gör. Vilket är att säga, skriv koden som om en potentiell angripare satt bredvid dig läsa det. Detta både uppmuntrar dig att använda bra metoder varje steg på vägen, och mildrar effekterna av programmet blir äventyras. Skriv inte dålig kod tro att ingen någonsin kommer att se det, eller räkna ut hur illa det är. Och medan säkerhet genom otydlighet har sin plats, inte räkna hemligheter vistas hemlighet och tänka som en angripare.

Varningar

  • Aldrig antar att din ansökan är 100% säker. Nya bedrifter kunde hittas, vilket kommer att missbrukas av angripare. Se till att du hålla dig uppdaterad med de senaste bästa praxis för att säkra dina program till utsträckning av din kapacitet.
  • Lita inte AJAX förfrågningar. Kom ihåg att dessa är mycket, mycket lätt att förfalska av någon som vet hur man använder Wireshark (ta reda på vilka parametrar som ska användas i en HTTP-begäran) och vet hur man använder curl eller wget.