LabbCybersäkerhet · Etisk hackning
0/0
Förberedelse

Att läsa kod — för dig utan kodvana

Den här sidan finns för att resten av kursen visar kod, och koden är meningslös om du inte kan läsa den. Du behöver inte kunna skriva kod för att gå kursen. Du behöver kunna titta på ett kodstycke och se vad det försöker göra. Det är precis vad den här sidan lär ut, och ingenting mer.

Läs den en gång nu. Kom tillbaka hit när något i en laboration ser obegripligt ut.

Tre sorters text som ser lika ut men inte är det

Nästan all kod i kursen hör till en av tre kategorier, och det första steget är att se vilken.

Terminalkommandon är instruktioner du skriver för hand och trycker Enter på. De är korta, börjar ofta med ett verb som ping, curl eller tail, och har små flaggor efter sig som -c 3 eller -I. De körs en gång och är sedan klara.

Konfigurationsfiler är inställningar, inte instruktioner. De körs inte uppifrån och ned — ett program läser dem när det startar och ställer in sig därefter. All nginx-kod i kursen är av det här slaget. Känns igen på rader av typen namn värde; och på klammerparenteser som grupperar inställningar som hör ihop.

Program är det som faktiskt utför något, rad för rad, varje gång någon besöker sidan. Python, PHP och JavaScript i kursen är program. Det är här de riktiga säkerhetsbesluten fattas.

Kommentarer: raderna som inte gör något

En kommentar är text som datorn hoppar över. Den finns där för människan som läser. Tecknet skiljer sig åt mellan språken, men funktionen är densamma:

  • # i Python, i terminalen och i nginx
  • // i JavaScript, PHP, C och liknande språk
  • -- i SQL

När du ser # Sårbart ovanför ett stycke kod är det en människa som pekar på något, inte en instruktion till datorn.

Variabler: namngivna lådor

En variabel är ett namn på ett värde, så att du kan använda värdet igen utan att skriva om det. Skrivsättet skiljer sig:

  • Python: pris = 100
  • PHP: $pris = 100; — dollartecknet hör till namnet
  • JavaScript: const pris = 100; — const betyder att värdet inte ska ändras efteråt

Likhetstecknet betyder här inte "är lika med" i matematisk mening. Det betyder "lägg det här värdet i den här lådan". När du vill jämföra två saker används i stället ==, två likhetstecken.

Text, citattecken och ihopklistring

Text i kod kallas en sträng och omges alltid av citattecken: "hej" eller 'hej'. Citattecknen är inte en del av texten, de markerar bara var den börjar och slutar.

Strängar kan klistras ihop. I PHP görs det med en punkt, i Python och JavaScript med plustecken. Det låter oskyldigt, men ihopklistring av strängar är grundorsaken till hela Lab 3 — när användarens text klistras in i ett kommando kan datorn inte längre se var kommandot slutar och användarens text börjar.

Funktioner: namngivna recept

En funktion är ett stycke kod som fått ett namn, så att det kan köras när som helst utan att skrivas om. Den tar emot värden, gör något, och lämnar ofta tillbaka ett svar.

def verifiera(losenord):
    ...
    return True

def betyder "definiera en funktion". Namnet är verifiera. Det som står i parentesen är vad funktionen tar emot. return är vad den lämnar tillbaka.

Att anropa funktionen är att skriva dess namn med parenteser efter: verifiera("hemligt"). Du ser detta överallt — ph.hash(losenord) betyder "kör funktionen hash och ge den losenord".

Punkten i ph.hash(...) betyder "hash som hör till ph". Det är ett sätt att gruppera funktioner som hör ihop.

Parenteser, klamrar och hakar

Tre olika sorters tecken grupperar tre olika saker:

  • ( ) runt det en funktion tar emot
  • { } runt ett block som hör ihop, eller runt en uppsättning namngivna fält
  • [ ] runt en lista av värden, eller runt ett uppslag i en lista

I Python används dessutom indraget — hur långt in på raden koden börjar — för att visa vad som hör ihop. Rader som är indragna lika långt tillhör samma block. Det är inte dekoration; flyttar du indraget ändrar du betydelsen.

Databasfrågor

En databasfråga är en mening på språket SQL, och den liknar faktiskt engelska:

SELECT * FROM users WHERE id = 5

Läst rakt av: hämta (SELECT) alla kolumner (*) ur tabellen users där kolumnen id är 5. En tabell är ett kalkylblad: rader är poster, kolumner är fält.

Det du behöver se i kursen är var siffran 5 kommer ifrån. Om den kommer från användaren och klistras in i meningen som text, uppstår problemet i Lab 3. Om den skickas separat gör den inte det.

Bibliotek

Ett bibliotek är färdig kod som någon annan skrivit och granskat, och som du hämtar in i stället för att skriva själv. from argon2 import PasswordHasher betyder "hämta verktyget PasswordHasher ur biblioteket argon2".

Inom säkerhet är detta inte lathet utan en regel: egenhändigt skriven krypto- och rensningskod går nästan alltid sönder på sätt som inte syns förrän någon utnyttjar dem.

Att läsa terminalen

Ett $ eller # först på raden i ett exempel är prompten — datorns sätt att säga "skriv här". Den ska inte skrivas in av dig.

Flaggor är de korta tilläggen efter kommandot. -I i curl -I betyder "bara svarshuvudena". Vilken bokstav som betyder vad varierar mellan kommandon, och alla slår upp dem.

Det lodräta strecket | kallas pipe och skickar resultatet från kommandot till vänster in i kommandot till höger. curl -I sajten | grep -i policy betyder alltså: hämta huvudena, och visa bara de rader som innehåller ordet policy.

Vad du faktiskt behöver kunna

Du ska inte kunna skriva koden i den här kursen utantill. Du ska kunna titta på två kodstycken och säga vilket av dem som bygger ett kommando av användarens text, och vilket som håller dem isär. Det är hela färdigheten. Allt annat i den här kursen bygger på den.