1️⃣ Uke 33: Demonisering, port 80 & chroot
Intro, repetisjon, UNIX daemon-prosesser og sikkerhet
📌 Kapitteloppsummering
- Demonisering: Prosessen med å lage bakgrunnsprosesser (daemons) som kjører uten terminal
- Port 80: HTTP-port som krever root-rettigheter, løst med privilegie-separasjon
- chroot: Sikkerhetsteknikk for å begrense filsystemtilgang ved å endre rotkatalog
- Jobber & Sesjoner: Prosessgrupper og sesjonsledelse i UNIX/Linux
- Sikkerhet: setuid/setgid for privilegie-dropp, busybox for minimal fotavtrykk
1.1 Demonisering - Bakgrunnsprosesser
💡 Hva er en daemon?
En daemon er en bakgrunnsprosess som:
- Kjører kontinuerlig uten brukerinteraksjon
- Ikke er tilknyttet en terminal
- Starter ved oppstart eller on-demand
- Eksempler: webservere (httpd), database-servere, systemloggere
Viktige begreper
Jobber:
- Flere prosesser i en gruppe
- En prosess er leder av gruppa
- Eksempel:
cat | rever én jobb med to prosesser
Sesjoner:
- En sesjon betegner et sett av relaterte aktiviteter
- Alle jobber i et skall tilhører samme sesjon
- En prosess er sesjonsleder
- Man kan være logget inn flere ganger samtidig (hver = en sesjon)
Demoniseringsoppskrift (fra Stevens)
fork()og opphav gjørexit()- for å kjøre i bakgrunnen og ikke være prosessgruppeledersetsid()- blir sesjonsleder og prosessgruppeleder for ny sesjon, fri fra kontrollterminalsignal(SIGHUP, SIG_IGN)- ignorerer SIGHUP som sendes når sesjonsleder terminererfork()igjen og opphav gjørexit()- hindrer at prosessen kan knytte til seg en kontrollterminalclose()alle unødvendige filer
⚠️ Hvorfor to fork()?
Første fork(): Sikrer at prosessen ikke er prosessgruppeleder (påkrevd for setsid)
Andre fork(): Sikrer at prosessen ikke er sesjonsleder, slik at den ikke kan åpne en kontrollterminal
1.2 Port 80 og Privilegie-separasjon
💡 Problemet
Av sikkerhetsgrunner bør man IKKE kjøre webserveren som root, men kun root kan binde til porter under 1024 (privilegerte porter).
Løsning: Privilegie-separasjon
- Start som root
- Bind til port 80
- Dropp privilegier med
setuid()ogsetgid() - Kjør server som uprivilegert bruker
Viktige systemkall:
setuid(uid)- Setter bruker-ID for prosessensetgid(gid)- Setter gruppe-ID for prosessengetuid()- Henter nåværende bruker-IDgeteuid()- Henter effektiv bruker-ID
1.3 chroot - Endre rotkatalog
💡 Konsept
chroot endrer rotkatalogen for en prosess og alle dens barn, og begrenser dermed tilgang til filsystemet.
Bruksområder:
- Isolere tjenester fra resten av filsystemet
- Sikkerhet - begrense skade ved kompromittering
- Testing - isolert miljø
- Byggesystemer - ren miljø
Systemkall:
chroot(2)- Change root directory (C-funksjon)chroot(8)- Run command with special root directory (kommandolinjeverktøy)
Busybox chroot-eksempel
⚠️ Begrensninger
- Krever root-rettigheter for å opprette chroot
- Ikke perfekt sikkerhet - root inne i chroot kan bryte ut
- Må kopiere alle nødvendige filer inn i chroot
- Modernere alternativer: containere med namespaces
Inspeksjon av prosesser i chroot:
1.4 Eksamensrelevante konsepter
🎯 Viktig for eksamen
- Forstå hvorfor vi demoniserer (bakgrunn, ingen terminal)
- Kjenne til stegene i demonisering (fork → setsid → fork)
- Forklare privilegie-separasjon (start som root → bind → dropp)
- Vite når
setuid/setgidbrukes - Forklare
chrootog dets sikkerhetsbegrensninger - Forstå jobber vs sesjoner vs prosessgrupper
Typiske eksamensspørsmål:
- "Forklar hvordan en prosess blir til en daemon"
- "Hvorfor trenger vi to fork() i demonisering?"
- "Hvordan kan en webserver binde til port 80 uten å kjøre som root?"
- "Hva er forskjellen mellom chroot og containere?"
- "Forklar setuid/setgid og deres sikkerhetsmessige implikasjoner"
2️⃣ Uke 34: Operativsystemnivå-virtualisering (Containere)
Namespaces, cgroups, og grunnlaget for moderne containere
📌 Kapitteloppsummering
- OS-nivå virtualisering: Én kjerne, flere isolerte brukerområder (containere)
- Namespaces: Isolerer systemressurser (PID, network, mount, UTS, IPC, user)
- Cgroups: Begrenser og måler ressursbruk (CPU, minne, I/O)
- Unshare: Verktøy for å opprette nye namespaces
- Fordeler: Lav overhead, rask oppstart, effektiv ressursbruk
2.1 Hva er OS-nivå virtualisering?
💡 Grunnkonsept
OS-nivå virtualisering lar én OS-kjerne kjøre flere isolerte brukerområder (containere). Hver container tror den er alene på systemet.
Sammenligning med andre virtualiseringstyper:
| Type | Eksempel | Overhead | Isolasjon |
|---|---|---|---|
| Full virtualisering | VirtualBox, VMware | Høy | Meget sterk |
| Paravirtualisering | Xen, KVM | Middels | Sterk |
| OS-nivå | Docker, LXC | Lav | Moderat |
Fordeler med OS-nivå virtualisering:
- Liten ekstrabelastning (systemkall går direkte til kjernen)
- Rask oppstart (ingen OS-boot)
- Effektiv ressursbruk (delt kjerne)
- Copy-on-Write filsystemer (delte lag)
🔑 Nøkkelbegrep
En kjerne - flere brukerområder (userspace)
Dette er kjernen i OS-nivå virtualisering. Alle containere deler samme OS-kjerne, men har hver sine isolerte prosesstrær, filsystemer, nettverkstack etc.
2.2 Linux Namespaces
💡 Hva er namespaces?
Namespaces isolerer systemressurser slik at prosesser i forskjellige namespaces ser forskjellige versjoner av systemet.
7 typer namespaces i Linux:
- PID namespace: Isolerer prosess-IDer
- PID 1 inne i namespace er faktisk en annen PID utenfor
- Prosesser kan ikke se prosesser utenfor sitt namespace
- Network namespace: Isolerer nettverksstack
- Egne nettverksgrensesnitt, IP-adresser, rutingtabeller
- Containere kan ha private nettverk
- Mount namespace: Isolerer mountpoints
- Hvert namespace ser sitt eget filsystem-hierarki
- Gjør chroot mer robust
- UTS namespace: Isolerer hostname og domenenavn
- Hver container kan ha sitt eget hostname
- IPC namespace: Isolerer inter-process communication
- Message queues, semaforer, shared memory
- User namespace: Isolerer bruker- og gruppe-IDer
- Root inne i container er ikke root utenfor
- Viktig for sikkerhet
- Cgroup namespace: Isolerer cgroup-visning
2.3 Linux Cgroups (Control Groups)
💡 Hva er cgroups?
Cgroups begrenser, måler og isolerer ressursbruk (CPU, minne, disk I/O, nettverk) for grupper av prosesser.
Hva kan cgroups begrense?
- CPU: Prosent CPU-tid, CPU-kerner
- Minne: Max RAM, swap-bruk
- Disk I/O: Read/write hastighet og IOPS
- Nettverk: Båndbredde (via andre verktøy)
- Antall prosesser: Max antall prosesser
Eksempel: Begrens minne for en prosess
⚡ Cgroups v1 vs v2
v1: Hver ressurstype har sitt eget hierarki
v2: Unified hierarchy - ett tre for alle ressurser (moderne standard)
2.4 Unshare - Manuell Container
unshare er et Linux-verktøy som lar deg opprette nye namespaces og kjøre et program i dem.
Eksempel: Lag en enkel container fra bunnen
Forklaring av flagg:
--fork- Fork før unshare (nødvendig for PID namespace)--pid- Nytt PID namespace--mount- Nytt mount namespace--uts- Nytt UTS namespace (hostname)--ipc- Nytt IPC namespace
2.5 Fra chroot til Containere
Evolusjon av isolasjonsteknikker:
- chroot (1979):
- Endrer rotkatalog
- Ingen prosess- eller nettverksisolasjon
- Kan brytes ut av root
- FreeBSD Jails (2000):
- Legger til nettverks- og prosessisolasjon
- Mer robust enn chroot
- Linux Namespaces (2002-2013):
- Finkornet isolasjon av mange ressurser
- Grunnlag for moderne containere
- LXC (2008):
- Sys-admin verktøy for containere
- Bruker namespaces + cgroups
- Docker (2013):
- Developer-friendly
- Image-format og registry
- Populære containere idag
🎯 Viktig for eksamen
- Forklare forskjellen mellom chroot og namespaces
- Liste opp de 7 typene namespaces og hva de isolerer
- Forklare hva cgroups brukes til (ressursbegrensning)
- Forstå at containere = namespaces + cgroups + filsystem
- Vite at systemkall i container går direkte til vertskjernen (lav overhead)
3️⃣ Uke 35-36: Docker/Podman
Container orchestration, images, Dockerfile, docker-compose
📌 Kapitteloppsummering
Docker er plattformen for containerisering - den pakker applikasjoner med alle avhengigheter i isolerte containere. Docker bruker OS-nivå virtualisering med namespaces, cgroups og capabilities for sikkerhet og ressurskontroll. Images er statiske templates, containere er kjørende instanser. Dockerfile/Containerfile definerer lagvis bygging av images.
🐳 Om Docker
💡 Viktige begreper
- Image (bilde): Statisk, read-only template - kan sammenlignes med git-repository
- Container: Dynamisk, kjørende instans av et image
- Dockerfile/Containerfile: Oppskrift for å bygge images lagvis
- Docker Hub: Registry med offisielle og bruker-images
- Docker Daemon: Bakgrunnstjeneste som håndterer containere
- Docker Client: CLI som kommuniserer med daemon via HTTP
Containere vs. Virtuelle Maskiner:
- Containere deler OS-kjerne med verten (VM-er har egen kjerne)
- Containere er lettere i størrelse
- Containere starter raskere
- Containere bruker ressurser mer effektivt
🎯 Eksamensrelevant
- Forklare forskjellen mellom image og container
- Beskrive Docker-arkitekturen med daemon og klient
- Forstå hvordan Docker bruker namespaces og cgroups
🏗️ Dockerfile/Containerfile
En Dockerfile (nå ofte kalt Containerfile) er en tekstfil med instruksjoner for å bygge et Docker image lagvis.
💡 Viktige Dockerfile-instruksjoner
- FROM: Definerer grunnlagsbildet (må være først i filen)
- COPY: Kopierer filer fra build context til bildets filsystem
- ADD: Som COPY, men støtter URL'er og automatisk utpakking av arkiver
- RUN: Kjører kommando i shell (/bin/sh) og danner nytt lag
- CMD: Standard kommando når container startes (kun siste CMD kjøres)
- ENTRYPOINT: Kommando som alltid kjøres ved containerstart
- EXPOSE: Dokumenterer porter containeren lytter på
- WORKDIR: Setter arbeidskatalogen for RUN/CMD/ENTRYPOINT
- USER: Setter bruker (navn eller UID) for påfølgende instruksjoner
- VOLUME: Oppretter mount point for volumer
Build Context
Build context er mengden filer som kan refereres til med ADD/COPY. Pakkes og sendes fra klient til daemon.
- Normalt en katalog oppgitt med filsti
- Kan være URL til git-repository
- Kan være tom mengde
- Bruk
.dockerignorefor å ekskludere filer (unngå å sende unødvendige filer)
Kommandolinje-argumenter: exec- vs shell-format
🎯 Eksamensrelevant
- Kunne skrive en enkel Dockerfile
- Forstå hvordan bildelag bygges opp
- Forklare forskjellen mellom CMD og ENTRYPOINT
- Vite at base images (scratch, alpine, debian) ikke har foreldre
🔒 Sikkerhetsbegrensninger
1. Cgroups (Control Groups)
Brukes til å begrense og måle ressursbruk for containere.
2. Capabilities
Siden Linux 2.2: Finkornet privilegiekontroll. Tradisjonell UNIX har kun root/ikke-root, men capabilities lar oss gi spesifikke rettigheter.
💡 Eksempel på capabilities
- CAP_NET_ADMIN: Rett til nettverksadministrasjon
- CAP_SYS_TIME: Rett til å endre systemklokka
- CAP_CHOWN: Rett til å endre eierskap på filer
3. AppArmor
Enda mer finkornet kontroll - per filsti og operasjon (les, skriv, kjør).
4. User Namespaces
Mapper brukere i container til upriviligerte brukere i vertssystem. Root i container kan være vanlig bruker på verten.
🎯 Eksamensrelevant
- Forstå hva cgroups brukes til (ressursbegrensning)
- Forklare hvordan capabilities gir finkornet privilegiekontroll
- Beskrive hvordan user namespaces forbedrer sikkerhet
🌐 Docker Nettverk
💡 Nettverkstyper
- bridge: Standard nettverk - isolerer containere fra verten, forbinder containere på samme vert
- host: Deler nettverk med verten (ingen isolasjon)
- none: Kun localhost, ingen ekstern kommunikasjon
Scope (gyldighetsområder)
- local: Nettverket eksisterer kun på maskinen containeren kjører på
- global: Nettverket spenner over alle containere i cluster (ingen ruting satt opp)
- swarm: Nettverket omfatter hele Docker swarm
Bridge-nettverk arkitektur
Docker oppretter virtuelle ethernet-par: en ende i containeren, en i docker0-bridge på verten. Containere kan kommunisere via IP-adresser.
🎯 Eksamensrelevant
- Forstå bridge-nettverk og hvordan containere kommuniserer
- Forklare forskjellen mellom bridge, host og none
💾 Docker Volumer
Volumer brukes til å persistere data utenfor containerens livssyklus. Data i containere forsvinner når de slettes!
💡 Tre måter å opprette volumer
- Automatisk sti: Docker velger sti på verten
- VOLUME i Dockerfile: Definert i image
- Bind mount: Monterer spesifikk katalog fra vert til container
🔧 Docker Verktøy
- Docker Swarm: Dockers innebygde clustering-løsning
- Docker Compose: Definerer og kjører multi-container applikasjoner (YAML-fil)
- Docker Machine: Installerer/konfigurerer Docker på fjern-verter
Container-orkestrering (alternativer)
- Kubernetes (mest populær)
- Docker Swarm
- Apache Mesos Marathon
- Amazon ECS
- Azure Container Service
4️⃣ Uke 37: HTML, XML, CSS
Webteknologier og markup-språk
📌 Kapitteloppsummering
HTML (HyperText Markup Language) er oppmerkingsspråk for web-dokumenter, utviklet på CERN. HTML5 erstatter HTML 4.01 og er ikke lenger basert på SGML. XML (eXtensible Markup Language) er egnet for semistrukturerte data med irregulær struktur. CSS (Cascading Style Sheets) styrer utseende til HTML/XML-dokumenter uten å endre strukturen.
📄 HTML - HyperText Markup Language
💡 Om HTML
- Oppmerkings-språk for web-dokumenter
- Utviklet på CERN av Berners-Lee et.al.
- Tidlige versjoner (< 5) basert på SGML (ISO-standard)
- Utviklet med tanke på plattformuavhengighet
- Standarisert av IETF i 1995 (RFC 1866)
- HTML5 kom i 2014, vedlikeholdes nå av WHATWG
HTML5 Nyheter
- Ikke lenger basert på SGML
- Inkluderer DOM (Document Object Model) med API
- Egne tagger for lyd og video:
<audio>,<video> <canvas>for tegning- Semantiske tagger:
<section>,<article>,<header>,<nav> - SVG (vektorgrafikk) og MathML (matematisk notasjon)
Seks typer HTML5-elementer
- Void elements: (area, br, hr, img, input, link, meta) - uten innhold, uten slutt-tag
- Template element: <template>
- Raw text elements: <script>, <style>
- Escapable raw text elements: <textarea>, <title>
- Foreign elements: MathML og SVG
- Normal elements: Alle andre
🎯 Eksamensrelevant
- Forstå forskjellen mellom HTML 4.01 og HTML5
- Vite at HTML5 ikke er basert på SGML
- Kjenne til nye HTML5-elementer (audio, video, canvas, semantiske tagger)
🔖 XML - eXtensible Markup Language
💡 XML og semistrukturerte data
Mye data har ikke fast tabularisk struktur som i relasjonsdatabaser, men har likevel en viss struktur.
Semistrukturerte data:
- Irregulære og ufullstendige data
- Struktur som endres hyppig
- Kan være skjemaløs, kun med begrensninger på data
- Skjema oppdages underveis, ikke på forhånd
Oppbygning av XML
- Valgfri XML-deklarasjon:
<?xml version="1.0"?> - Elementer: Start-tag, innhold, slutt-tag
- Rot-element: Må være første element, inneholder alle andre
- Elementer kan inneholde: andre elementer, attributter, tekst, entitetsreferanser
Velformet XML-dokument
Krav til velformethet:
- Rot-elementet må inneholde alle resterende elementer
- Elementer må være nøstet i trestruktur uten overlapping
- Alle ikke-tomme elementer må ha både start- og slutt-tagg
Navnerom (Namespaces) i XML
- XML-dokumenter kan definere ulike navnerom
- Unngår navnekollisjoner mellom elementer fra ulike kilder
- URI'er brukes for globalt unike navn
- Lokale navn (prefikser) brukes for korte referanser
Gyldig XML-dokument
DTD (Document Type Definition):
- Definerer et XML-dokuments gyldige syntaks
- Ikke påkrevd
- Begrensninger: ikke XML-syntax, begrenset datatype-støtte, ikke støtte for navnerom
XML Schema:
- Alternativ til DTD
- Løser DTD's begrensninger
- Skrevet i XML
- Større uttrykksmuligheter
- Støtter navnerom
- Rike datatyper
XHTML (eXtensible HTML)
- HTML 4.01 reformulert til XML 1.0
- Strengere HTML-versjon
- Tagger og attributter med små bokstaver
- Obligatorisk slutt-tagg
- Må følge XML-regler
XML-API
DOM (Document Object Model):
- Laget av W3C
- Plattform- og leverandør-uavhengig
- Bygger tre-representasjon i minnet
- Bra for å legge til, slette, reorganisere elementer
SAX (Simple API for XML):
- Hendelse-basert (event-driven)
- Seriell tilgang
- Hendelser for start-tag og slutt-tag
- Bygger IKKE tre-representasjon (lavere minnebruk)
🎯 Eksamensrelevant
- Forstå hva semistrukturerte data er
- Kjenne til krav for velformet XML
- Forklare forskjellen mellom DTD og XML Schema
- Forstå forskjellen mellom DOM (tre-basert) og SAX (hendelse-basert)
🎨 CSS - Cascading Style Sheets
💡 Om CSS
- Opphavsmann: Håkon Wium Lie fra Halden
- Brukes for å angi utseende av HTML/XML
- Kan styre opptegning, men ikke endre strukturen
- Separerer innhold fra presentasjon
CSS Syntax
Selector refererer til elementer i dokumentet.
Klasser
Elementer kan grupperes ved å tilordne dem til klasser:
Pseudoklasser
- :link
- :visited
- :active
- :first-line
- :first-letter
ID'er
Enkelt-elementer kan gis identifikatorer:
Fire måter å plassere CSS i HTML
- I <head>:
<style media=screen> ... </style>
- Lenke til stilsett-fil:
<link rel="stylesheet" type="text/css" href="..." />
- Import i stilsett:
<style type="text/css"> @import url(http://...) i {color: red} </style>
- Inline som attributt:
<i style="color: red">Kursiv og rødt</i>
CSS i XML
XML kan stilformes ved å referere til CSS-fil:
🎯 Eksamensrelevant
- Forstå CSS-syntax med selector og egenskaper
- Kjenne til klasser og ID'er
- Vite hvordan CSS kan inkluderes i HTML (4 måter)
- Forstå at CSS kan brukes både på HTML og XML
5️⃣ Uke 38: SQLite Databaseprogrammering
Embedded database, SQL basics, transactions
📌 Kapitteloppsummering
Databaseprogrammering handler om hvordan applikasjoner kommuniserer med DBMS. Tre tilnærminger: Embedded SQL, API, og egne språk. Standardiserte API som ODBC og JDBC bruker drivere til å oversette mellom leverandørspesifikk og standard API. Typisk fremgangsmåte: opprette forbindelse, sende spørringer, motta resultater, stenge forbindelse. Forberedte kommandoer (prepared statements) beskytter mot SQL injection.
🗄️ SQL Repetisjon
💡 DML (Data Manipulation Language)
- SELECT: Henter data fra tabeller
- INSERT: Legger til nye rader
- UPDATE: Oppdaterer eksisterende rader
- DELETE: Sletter rader
💡 DDL (Data Definition Language)
- CREATE: Oppretter tabeller, indekser, views
- ALTER: Endrer struktur på eksisterende tabeller
- DROP: Sletter tabeller, indekser, views
🔌 Tilnærminger til databaseprogrammering
1. Embedded SQL
SQL-kommandoer er innebygd direkte i programmeringsspråket (f.eks. C, COBOL). Preprocessor oversetter SQL til API-kall.
2. API (Application Programming Interface)
Programmet kaller funksjoner/metoder i et API for å kommunisere med DBMS.
3. Egne språk
Spesialiserte språk designet for databaseinteraksjon (f.eks. PL/SQL i Oracle).
🎯 Eksamensrelevant
Forstå forskjellen mellom de tre tilnærmingene. API-tilnærmingen er mest brukt i moderne programmering.
🌐 Standardiserte API
💡 Hvorfor standardiserte API?
- Uavhengighet av DBMS-leverandør
- Drivere oversetter mellom standard og leverandørspesifikk API
- Lettere å bytte database
- Samme kode kan brukes mot ulike DBMS
ODBC (Open Database Connectivity)
- Opprinnelig Microsoft-standard
- Mest brukt i Windows-miljøer
- API for C/C++
JDBC (Java Database Connectivity)
- Java-standard for databasetilgang
- Plattformuavhengig
- Bruker JDBC-drivere for ulike DBMS
📋 Typisk fremgangsmåte
- Opprett forbindelse: Klient oppretter forbindelse til DBMS (tjener)
- Samhandling: Klient sender spørring og mottar resultat
- Gjenta: Eventuelt flere spørringer
- Steng: Steng forbindelsen når ferdig
🛡️ Forberedte kommandoer (Prepared Statements)
💡 Hvorfor forberedte kommandoer?
- Sikkerhet: Beskytter mot SQL injection
- Ytelse: Query plan kan gjenbrukes
- Lesbarhet: Tydeligere hva som er data vs SQL
SQL Injection - Problemet
Løsning: Prepared Statements
🎯 Eksamensrelevant
- Forklare hva SQL injection er og hvordan det fungerer
- Vite at prepared statements er løsningen
- Kunne skrive eksempel med prepared statement
- Forstå hvorfor parameterized queries er sikrere
💾 SQLite-spesifikt
💡 Om SQLite
- Embedded database (ikke klient-tjener)
- Hele databasen i én fil
- Ingen separat server-prosess
- ACID-compliant (Atomicity, Consistency, Isolation, Durability)
- Selvinneholdt, zero-configuration
- Mye brukt i mobile apper, nettlesere, embedded systemer
SQLite fra kommandolinjen
SQLite i C
🎯 Eksamensrelevant
- Forstå at SQLite er embedded (ikke klient-tjener)
- Vite at hele databasen er i én fil
- Kunne forklare fordeler og ulemper med embedded database
🔄 Transaksjoner
💡 ACID-egenskaper
- Atomicity: Alt eller intet - transaksjonen fullfører helt eller rulles tilbake
- Consistency: Databasen går fra én gyldig tilstand til en annen
- Isolation: Transaksjoner kjører isolert fra hverandre
- Durability: Når transaksjonen er committed, er endringene permanente
6️⃣ Uke 39: CGI, HTML-skjema, REST
Common Gateway Interface og RESTful web services
📌 Kapitteloppsummering
CGI (Common Gateway Interface) definerer hvordan web-tjener og CGI-programmer kommuniserer. Web-tjeneren kjører CGI-programmet og sender dets output til klienten. Miljøvariabler og stdin brukes for input, stdout for output. HTML-skjema sender data til server via GET eller POST. REST (REpresentational State Transfer) er arkitekturstil for web services basert på HTTP-metoder (GET, POST, PUT, DELETE) og ressurs-orienterte URL'er.
🔧 Common Gateway Interface (CGI)
💡 Hva er CGI?
Spesifikasjon som definerer hvordan web-tjener og CGI-skript/programmer kommuniserer.
Slik fungerer det:
- URL refererer til fil som skal kjøres (CGI-programmet)
- Web-tjener kjører programmet
- Utskrift fra programmet sendes til klienten som HTTP-responsens kropp
- Web-tjeneren sender begynnelsen av HTTP-hodet
- CGI-programmet sender slutten av hodet (+ tom linje) og kroppen
CGI-transaksjon (Pseudokode)
🎯 Eksamensrelevant
- Forstå CGI-flyten: tjener kjører program, output sendes til klient
- Vite at CGI-program må skrive Content-Type og tom linje
- Forstå at ny prosess startes for hver forespørsel (overhead!)
🌍 Miljøvariabler i CGI
💡 Viktige miljøvariabler
Web-tjeneren setter miljøvariabler som CGI-programmet arver:
Basert på HTTP-forespørsel
- REQUEST_METHOD: GET, POST, PUT, DELETE, etc.
- QUERY_STRING: Det som står etter ? i URL'en
- CONTENT_TYPE: MIME-type av kroppen
- CONTENT_LENGTH: Lengden av kroppen (i bytes)
- SERVER_PROTOCOL: HTTP-versjon
- SERVER_PORT: Port-nummer
- PATH_INFO: Ekstra sti-informasjon
- REMOTE_ADDR: Klientens IP-adresse
- REMOTE_HOST: Klientens vertsnavn
- HTTP_*: HTTP-header-felter (f.eks. HTTP_USER_AGENT)
Uavhengig av forespørsel
- SERVER_SOFTWARE: Navn/versjon av web-tjener
- SERVER_NAME: Vertsnavnet
- GATEWAY_INTERFACE: CGI-versjon
⚖️ CGI Fordeler og Ulemper
✅ Fordeler
- Enkelhet: Lett å forstå og implementere
- Språk-uavhengighet: Kan skrives i hvilket som helst språk
- Web-tjener-uavhengighet: Fungerer med de fleste web-tjenere
- Stor utbredelse: Tidligere 'de facto' standard
❌ Ulemper
- Ytelse: Ny prosess for hver forespørsel (resursskrevende)
- Flaskehals: All kommunikasjon må gå via web-tjeneren
- Tilstandsløshet: Ingen transaksjonsstøtte, må logge inn/ut for hver forespørsel
- Sikkerhet: Mange CGI-programmer starter shells - brukerinput kan inneholde farlig kode
- Konkuranse: Mange prosesser konkurrerer om minne, disk, CPU
🎯 Eksamensrelevant
Kunne liste opp og forklare både fordeler og ulemper ved CGI. Spesielt viktig: ytelsesproblem med prosess per forespørsel og sikkerhetsproblemer med shell injection.
📝 HTML-skjema
💡 HTML Forms
HTML-skjema lar brukere sende data til server. Data sendes til URL spesifisert i action-attributt.
GET vs POST
- GET:
- Data sendes i QUERY_STRING (synlig i URL)
- Begrenset lengde
- Idempotent (kan gjenta uten sideeffekter)
- Brukes for søk og visning
- POST:
- Data sendes i HTTP-kroppen (via stdin i CGI)
- Ingen lengdebegrensning
- Ikke idempotent
- Brukes for oppdateringer og sensitive data
🌐 Web Services og REST
💡 Om Web Services
Web Services er tjenester tilgjengelig over nettverk (typisk HTTP). To hovedtilnærminger:
- SOAP: Simple Object Access Protocol - kompleks, XML-basert
- REST: REpresentational State Transfer - enklere, fleksibel
SOAP (Simple Object Access Protocol)
- XML-basert meldingsprotokoll
- Formell kontrakt via WSDL (Web Services Description Language)
- Tung og kompleks
- UDDI for service discovery
REST (REpresentational State Transfer)
Arkitekturstil med følgende prinsipper:
- Klient-tjener: Separasjon av bekymringer
- Tilstandsløs: Hver forespørsel inneholder all nødvendig info
- Cachebar: Responser kan caches
- Uniform interface: Ressurs-identifikasjon via URL'er
- Lagdelt system: Klient vet ikke om den snakker direkte med server
💡 REST HTTP-metoder
- GET: Hent ressurs (idempotent, safe)
- POST: Opprett ny ressurs
- PUT: Oppdater/erstatt ressurs (idempotent)
- DELETE: Slett ressurs (idempotent)
- PATCH: Delvis oppdatering
HTTP Statuskoder
- 200 OK: Suksess
- 201 Created: Ressurs opprettet
- 204 No Content: Suksess, ingen kropp
- 400 Bad Request: Ugyldig forespørsel
- 401 Unauthorized: Autentisering kreves
- 403 Forbidden: Ingen tilgang
- 404 Not Found: Ressurs finnes ikke
- 500 Internal Server Error: Serverfeil
🎯 Eksamensrelevant
- Forstå REST-prinsipper (ressurs-orientert, tilstandsløs, uniform interface)
- Vite hva GET, POST, PUT, DELETE brukes til
- Forstå idempotens (GET, PUT, DELETE er idempotente)
- Kunne designe en enkel RESTful API
- Kjenne til vanlige HTTP-statuskoder
🔍 REST vs SOAP
| Aspekt | REST | SOAP |
|---|---|---|
| Protokoll | Arkitekturstil (bruker HTTP) | Protokoll (kan bruke HTTP, SMTP, etc.) |
| Format | JSON, XML, HTML, tekst | Kun XML |
| Kompleksitet | Enkel | Kompleks |
| Ytelse | Raskere | Tregere |
| Caching | Støttes naturlig | Vanskelig |
| Kontrakt | Ingen formell kontrakt | WSDL (streng kontrakt) |
Når bruke hva?
- REST: Offentlige API'er, mobile apps, moderne web services
- SOAP: Enterprise-systemer som krever formelle kontrakter og transaksjoner
7️⃣ Uke 44: Informasjonskapsler & JavaScript
Cookies, sessions, JavaScript fundamentals
📌 Kapitteloppsummering
Informasjonskapsler (cookies) implementerer tilstand i den tilstandsløse HTTP ved at tjener instruerer klient til å lagre og sende tilbake navn-verdi-par. JavaScript er et dynamisk, objektorientert skriptspråk mye brukt på både klient- og tjenerside. JavaScript har dynamiske variabler (type bestemmes ved tilordning), tre primitive typer (boolean, number, string) og objekter for alt annet.
🍪 Informasjonskapsler (Cookies)
💡 Hvorfor cookies?
HTTP er tilstandsløs - hver forespørsel er uavhengig. Cookies lar oss implementere tilstand ved at:
- Tjener sender
Set-Cookie:header - Klient lagrer cookien
- Klient sender
Cookie:header i etterfølgende forespørsler
Cookie-attributter
- Domain: Hvilke domener som får cookien
- Path: Hvilke stier cookien gjelder for
- Expires/Max-Age: Når cookien utløper
- Secure: Kun sendt over HTTPS
- HttpOnly: Ikke tilgjengelig via JavaScript (XSS-beskyttelse)
- SameSite: CSRF-beskyttelse (Strict, Lax, None)
HttpOnly for session-cookies (beskyttelse mot XSS). Bruk Secure for å kreve HTTPS. Bruk SameSite for CSRF-beskyttelse.
🎯 Eksamensrelevant
- Forklare hvorfor cookies trengs (tilstand i tilstandsløs HTTP)
- Vite at tjener sender Set-Cookie, klient sender Cookie
- Kjenne til sikkerhetsflagg: HttpOnly, Secure, SameSite
📜 JavaScript - Grunnspråket
💡 Om JavaScript
- JavaScript/JScript/ActionScript implementerer ECMAScript (ES)
- Mye brukt på web (klient- OG tjenerside)
- Objektorientert (klasseløst opprinnelig, klasser i ES6)
- Java-lignende syntax, men IKKE Java!
- Dynamiske variabler (type bestemmes ved tilordning)
- Skiller mellom store og små bokstaver
Dynamiske variabeltyper
Tre grunnleggende datatyper (primitiver)
- boolean:
trueellerfalse - number: 64-bits flyttall (ingen int/float-skille)
- string: Null eller flere Unicode-tegn
Alt annet er objekter!
Spesielle verdier
- null: Bevisst ingen verdi (ikke samme som 0)
- undefined: Variabel som ikke eksisterer eller ikke er initialisert
- NaN: Not a Number (resultat av ugyldig matematikk)
- Infinity: Uendelig
🔤 Typekonverteringer
=== og !== for streng sammenligning (type og verdi). == og != konverterer typer automatisk.
📦 Objekter og Arrays
Objekter (hashtabeller/assosiative arrays)
Arrays (tabeller)
🎯 Eksamensrelevant
- Forstå at JavaScript-objekter er hashtabeller
- Vite at arrays kan inneholde forskjellige typer
- Kjenne til vanlige array-metoder (push, pop, shift, unshift)
🔧 Funksjoner
Variablers gyldighetsområde (scope)
- var: Funksjons-scope (function scope)
- let: Blokk-scope (block scope) - ES6
- const: Blokk-scope, kan ikke reassignes - ES6
Midlertidige objekter (Wrapper Objects)
Primitiver oppfører seg som objekter når nødvendig:
🔄 Flytkontroll
Feilhåndtering
🎯 Eksamensrelevant
- Forstå dynamiske variabler i JavaScript
- Kjenne til de tre primitive typene
- Forstå typekonvertering (spesielt string + number)
- Vite forskjellen mellom == og ===
- Kjenne til null vs undefined
- Forstå funksjoner som first-class citizens
8️⃣ Uke 44: Web-apper
JavaScript i nettleseren, DOM, events, AJAX
📌 Kapitteloppsummering
JavaScript i nettleseren har tilgang til DOM (Document Object Model) for å manipulere HTML. Event-drevet programmering lar oss reagere på brukerhandlinger. AJAX (Asynchronous JavaScript and XML) lar oss hente data uten å laste siden på nytt. Moderne web-apper bruker fetch API, Promises og async/await for asynkron kommunikasjon.
🌐 JavaScript i Nettleseren
💡 JavaScript i HTML
Tre måter å inkludere JavaScript:
- Inline: I HTML-attributter (ikke anbefalt)
- Internal: I <script>-tag
- External: Egen .js-fil (best practice)
Global objekt: window
I nettleseren er det globale objektet window:
window.alert()- Vis dialogbokswindow.console.log()- Logg til konsollwindow.document- Tilgang til DOMwindow.location- URL-informasjonwindow.setTimeout()- Forsinket kjøringwindow.setInterval()- Gjentatt kjøring
🌳 DOM (Document Object Model)
💡 Hva er DOM?
DOM er en tre-representasjon av HTML-dokumentet. JavaScript kan:
- Finne elementer
- Endre innhold og attributter
- Legge til/fjerne elementer
- Endre CSS-stiler
- Reagere på events
Finne elementer
Endre innhold
Legge til/fjerne elementer
🎯 Eksamensrelevant
- Forstå at DOM er tre-representasjon av HTML
- Kunne bruke querySelector/querySelectorAll
- Vite hvordan endre innhold (textContent, innerHTML)
- Kunne legge til/fjerne elementer dynamisk
⚡ Events (Hendelser)
💡 Event-drevet programmering
JavaScript reagerer på brukerhandlinger via events:
- Klikk (click)
- Tastaturinput (keydown, keyup, keypress)
- Musebevegelse (mouseover, mouseout, mousemove)
- Skjema (submit, change, focus, blur)
- Vindus-events (load, resize, scroll)
Legge til event listeners
Event-objektet
Event bubbling og capturing
Events "bobbler" opp fra child til parent:
addEventListener, ikke onclick-attributter. Det lar deg legge til flere listeners og gir bedre separasjon.
🌐 AJAX og Asynkron Kommunikasjon
💡 Hva er AJAX?
AJAX (Asynchronous JavaScript And XML) lar oss:
- Hente data fra server uten å laste siden på nytt
- Sende data til server i bakgrunnen
- Oppdatere deler av siden dynamisk
Gammel måte: XMLHttpRequest
Modern måte: fetch API
Async/Await (modern og enklere)
Promises
Promise representerer en fremtidig verdi:
🎯 Eksamensrelevant
- Forstå hva AJAX er og hvorfor det brukes
- Vite at fetch returnerer en Promise
- Kunne bruke async/await for asynkron kode
- Forstå forskjellen mellom synkron og asynkron kode
🔒 Sikkerhet i Web-apper
XSS (Cross-Site Scripting)
CSRF (Cross-Site Request Forgery)
Beskyttelse:
- CSRF-tokens i skjema
- SameSite cookie-attributt
- Sjekk Referer/Origin headers
Content Security Policy (CSP)
🎯 Eksamensrelevant
- Forstå XSS og hvordan unngå det (bruk textContent, ikke innerHTML)
- Vite hva CSRF er og at tokens beskytter mot det
- Kjenne til CSP som sikkerhetslag
9️⃣ Uke 45: Oppsummering & Eksamenstips
Gjennomgang av alle temaer og eksamensforberedelse
📌 Overordnet oppsummering
TSD3060 dekker sikker utvikling av webtjenester fra bunnen opp: OS-nivå sikkerhet (demonisering, chroot, namespaces), containerisering (Docker), webteknologier (HTML/XML/CSS), databaseprogrammering (SQLite, SQL injection), web-grensesnitt (CGI, REST), og klientside-programmering (JavaScript, DOM, AJAX). Sikkerhetstråden går gjennom hele kurset: isolasjon, prinsippet om minste privilegium, input-validering, og beskyttelse mot vanlige angrep (SQL injection, XSS, CSRF).
🗺️ Temaer etter uke
💡 Uke 33: Demonisering, port 80, chroot
- Demonisering: Bakgrunnsprosesser uten terminal
- Port 80: Krever root, dropp privilegier etter binding
- chroot: Endrer rotkatalog for isolasjon (begrenset)
💡 Uke 34: OS-nivå virtualisering
- Namespaces: 7 typer isolasjon (PID, NET, MNT, UTS, IPC, USER, CGROUP)
- Cgroups: Ressursbegrensning og måling
- Containere = namespaces + cgroups + filsystem
💡 Uke 35-36: Docker/Podman
- Images (statisk) vs Containere (dynamisk)
- Dockerfile: Lagvis bygging (maks 127 lag)
- Sikkerhet: Capabilities, AppArmor, user namespaces
- Nettverk: bridge, host, none
- Volumer: Persistering av data
💡 Uke 37: HTML, XML, CSS
- HTML5: Ikke lenger SGML, nye elementer (audio, video, canvas)
- XML: Semistrukturerte data, velformet vs gyldig
- DOM vs SAX: Tre-basert vs hendelse-basert parsing
- CSS: Separerer innhold fra presentasjon
💡 Uke 38: SQLite
- Embedded database (ingen server)
- ODBC/JDBC: Standardiserte API
- Prepared statements: Beskyttelse mot SQL injection
- ACID-transaksjoner
💡 Uke 39: CGI og REST
- CGI: Miljøvariabler, stdin/stdout, ny prosess per forespørsel
- HTML-skjema: GET vs POST
- REST: Ressurs-orientert, HTTP-metoder (GET, POST, PUT, DELETE)
- REST vs SOAP: Enkelhet vs kompleksitet
💡 Uke 44: Cookies og JavaScript
- Cookies: Tilstand i tilstandsløs HTTP
- Cookie-sikkerhet: HttpOnly, Secure, SameSite
- JavaScript: Dynamiske typer, 3 primitiver + objekter
- DOM: Manipulere HTML fra JavaScript
- AJAX: Asynkron kommunikasjon (fetch, async/await)
🔐 Gjennomgående sikkerhetstema
Prinsippet om minste privilegium
- Dropp root-privilegier etter behov (port 80)
- Bruk chroot for filsystemisolasjon
- Begrens capabilities i containere
- Kjør prosesser som upriviligerte brukere
Isolasjon
- chroot: Rotkatalog-isolasjon
- Namespaces: Prosess-, nettverks-, filsystem-isolasjon
- Containere: Kombinert isolasjon
Input-validering
- SQL injection: Bruk prepared statements
- XSS: Escape HTML, bruk textContent
- Shell injection: Unngå shell-kall med brukerinput
- CSRF: Bruk tokens og SameSite cookies
📝 Eksamenstips
🎯 Viktige begreper å kunne forklare
- Demonisering: Fork twice, setsid, chdir, umask, close fds
- Namespace-typer: PID, NET, MNT, UTS, IPC, USER, CGROUP
- Image vs Container: Statisk template vs kjørende instans
- Prepared statements: Beskyttelse mot SQL injection
- REST-prinsipper: Ressurs-orientert, tilstandsløs, uniform interface
- Cookies: Set-Cookie (tjener) vs Cookie (klient)
- DOM: Tre-representasjon av HTML
🎯 Vanlige eksamensspørsmål
- Forklar forskjellen mellom chroot og namespaces
chroot endrer kun rotkatalog, ingen prosess-/nettverksisolasjon. Namespaces gir finkornet isolasjon av mange ressurser (PID, NET, etc.).
- Hvordan beskytte mot SQL injection?
Bruk prepared statements / parameterized queries. ALDRI konkatenere brukerinput direkte inn i SQL.
- Hva er forskjellen mellom GET og POST?
GET: Data i URL (QUERY_STRING), begrenset lengde, idempotent. POST: Data i kropp, ingen lengdebegrensning, ikke idempotent.
- Forklar hvordan Docker bruker cgroups
Cgroups begrenser og måler ressursbruk (CPU, minne, I/O) for containere. Eksempel:
docker run -m 4mbegrenser minne. - Hva er XSS og hvordan unngå det?
Cross-Site Scripting: Angriper injiserer ondsinnet JavaScript. Unngå: Bruk textContent i stedet for innerHTML, escape HTML-tegn.
🎯 Kommandoer å kunne
🎯 Kodeeksempler å kunne skrive
- Enkel Dockerfile (FROM, COPY, CMD, EXPOSE)
- CGI-script som leser QUERY_STRING
- SQL med prepared statement (Java/C)
- HTML-skjema med POST
- JavaScript med DOM-manipulering
- Fetch API med async/await
📚 Studietips
Effektiv læring
- Aktiv repetisjon: Test deg selv uten å se i notater først
- Forklar til andre: Hvis du kan forklare det, forstår du det
- Lag sammenhenger: Koble temaer sammen (f.eks. sikkerhet går gjennom alt)
- Øv på koding: Skriv eksempler selv, ikke bare les
- Gammel eksamener: Øv på tidligere eksamensoppgaver
Prioritering siste uke før eksamen
- Høy prioritet:
- Sikkerhet (SQL injection, XSS, CSRF)
- Docker (images, containers, Dockerfile, sikkerhet)
- REST API design
- JavaScript grunnleggende + DOM
- Middels prioritet:
- Namespaces og cgroups
- CGI og miljøvariabler
- HTML/XML/CSS grunnleggende
- Cookies og sessions
- Lav prioritet (men les gjennom):
- Demonisering (detaljer)
- XML schemas og DTD
- SOAP vs REST (vet hovedforskjeller)
✅ Sjekkliste før eksamen
Kan du forklare...
- ☐ Demoniseringsprosessen (fork, setsid, etc.)?
- ☐ Alle 7 namespace-typer?
- ☐ Forskjellen mellom image og container?
- ☐ Hvordan Dockerfile bygger images lagvis?
- ☐ Hva cgroups, capabilities og AppArmor brukes til?
- ☐ Forskjellen mellom DOM og SAX?
- ☐ Hvordan prepared statements beskytter mot SQL injection?
- ☐ CGI-flyten (miljøvariabler, stdin/stdout)?
- ☐ REST-prinsipper og HTTP-metoder?
- ☐ Hvordan cookies implementerer tilstand?
- ☐ JavaScript: Datatyper, objekter, funksjoner?
- ☐ DOM-manipulering og event handling?
- ☐ XSS, CSRF og hvordan beskytte mot dem?
Kan du skrive kode for...
- ☐ En enkel Dockerfile?
- ☐ Et CGI-script som leser miljøvariabler?
- ☐ SQL med prepared statement?
- ☐ Et HTML-skjema?
- ☐ JavaScript som endrer DOM?
- ☐ Event listener i JavaScript?
- ☐ Fetch API med async/await?
💡 Siste råd
Du har jobbet hardt, du er godt forberedt! Husk:
- Ta deg god tid til å lese oppgavene
- Svar på det som spørres om
- Bruk eksempler for å illustrere
- Strukturer svarene (punktlister, nummerering)
- La koden få puste (kommentarer, mellomrom)
🎓 Lykke til på eksamen! 🚀
🎮 Quiz-spill
Test kunnskapene dine på en morsom måte!