Jeppe Falk Leth

Hej, mit navn er

Jeppe Falk Leth.

Datamatiker studerende

Min LinkedIn profil Min Github profil

Hvem er jeg?

Personlige oplysninger

Profil billede
Experience icon

Erfaringer

+2 års erfaring med
programmering og systemudvikling.
Bred forståelse for software og hardware.

Education icon

Uddannelse

Folkeskole 0-9 klasse - Assenskolen
3 årig HHX - Vestfyns Gymnasium
Datamatiker - UCL (Igangværende)

Jeg er Datamatikerstuderende på UCL med en passion for programmering, systemudvikling og projektledelse. Gennem mit studie forsøger jeg at opnå en forståelse og tilegne mig erfaring indenfor softwarearkitektur, frontend- og backendudvikling samt IT-sikkerhed.

Ved siden af mine studier arbejder jeg i Click&Collect hos Power Odense, hvor jeg sætter stor fokus på god service og tilfredse kunder. Jeg bruger meget tid med software og it og ønsker at kombinere mine tekniske færdigheder med en forståelse for brugervenlige og effektive løsninger.


4. Semester

Jeg har valgt at specialisere mig inden for IT-sikkerhed og webudvikling, da disse emner både udfordrer min tekniske viden og giver mig mulighed for at udvikle nye færdigheder. IT-sikkerhed er et område, der konstant udvikler sig og fascinerer mig, især med hensyn til at opdage og forebygge cybertrusler.

Webudvikling har jeg valgt da jeg her kan fordybe mig i almen udvikling, i håb om at opnå dybere forståelse for andre udviklingssprog- og metoder.

Langsigtede

Læringsmål

Webudvikling

  • Viden
  • Forståelse for hvordan JavaScript styrer DOM, events og interaktivitet.
  • Forstå betydningen af UI-feedback og visuelle brugergrænseflader
  • Opnå forståelse for de forskellige frameworks og libraries, der anvendes til webudvikling
  • Kan forstå eksisterende JavaScript scripts og identificere funktioner
  • Forståelse for HTML strukturen mhp. at udarbejde et miljø for JavaScript metoder.
  • Kan forklare, beskrive og begrunde for valg af metoder i JavaScript
  • Opnå kendskab til JavaScript med henblik på nemmere at lære andre udviklingssprog

  • Færdigheder
  • Implementere inputvalidering til kontrol af brugerens input.
  • Vise beskeder, fejl eller loading states for at sikre tydelig brugerfeedback og forbedre brugeroplevelsen
  • Debugge en webside vha. browser DevTools.
  • Kan udvikle en webside vha. JavaScript, HTML og CSS.

  • Kompetencer
  • Opretholde ren projektstruktur ved overholdelse af SoC (Seperation of Concerns)
  • Kan navigere og arbejde i en webside udviklet i JavaScript
  • Kan udvikle en interaktiv og visuelt responsiv UI med JavaScript og CSS

IT-Sikkerhed

  • Viden
  • Kan anvende egen viden om webbaseret It-sikkerhed for formidling til andre.
  • Indblik i webbaseret sessionhåndtering og token-baseret autentifikation
  • Forstå betydningen og anvendelsen af sikkerhedsheaders
  • Opnå forståelse for typiske angrebsmetoder mod webapplikationer
  • Forstå test- og analyseværktøjer til at vurdere en websides sikkerhedsniveau
  • Få indsigt i, hvordan Content Security Policy (CSP) kan anvendes som en konkret sikkerhedsforanstaltning
  • Opnå forståelse for HTTPS og HSTS der beskytter dataintegritet

  • Færdigheder
  • Kan dokumentere sikkerhedsforbedringer gennem før- og eftermålinger
  • Kunne identificere sikkerhedsrisici i egne eller andre webapplikationer gennem tests og analyser
  • Kan kombinere forståelse for frontend-udvikling, brugeroplevelse og itsikkerhed på en gang.
  • Kunne identificere forskellen mellem frontend- og backend-sikkerhedstiltag.

  • Kompetencer
  • Kan udvikle og demonstrere kontrolleret visse sårbare demo-funktioner.
  • Benytte browseres devtools og netværksinspektion til at analysere ingående og udgående trafik

Læringsplan for hvert

Sprint

1. Sprint

10 februar - 21. februar

Læringsmål

At opnå en grundlæggende forståelse af React ved at lære at opbygge komponenter, arbejde med JavaScript og anvende CSS til styling, derudover bygger jeg sideløbende min portfølge. Her bygger jeg den vha. almen HTML, CSS og JavaScript.

Aktiviteter

  • Forstå React-library
  • Forståelse for components i React
  • Arbejde med JavaScript teknikker
  • Anvende CSS til styling
  • Opnå kendskab til JavaScipt og dets syntax
  • Opnå kendskab til semantisk HTML Opbygning
  • Forstå CSS opbygning og dets egenskaber

Dagsplan (hverdage)

  • 09:00–10:00 React
  • 10:00–10:15 Pause
  • 10:15–11:30 Webudvikling
  • 11:30–12:00 Frokost
  • 12:00–14:00 Afrunding

Logbog

I denne uge vil jeg arbejde med at lære React. Jeg følger React quickguide (se ressourcer) og vil arbejde med at opbygge en simpel applikation. Jeg vil med fokus på første sprints aktiviteter, opnå viden for hver af mine delmål.

Evalueringer

Det første sprint har budt på både op- og nedture. For mit vedkommende havde jeg svært ved at komme i gang med IT-sikkerhed og fokuserede stort set kun på React. Jeg skal blive bedre til at strukturere mit arbejde og skelne tydeligere mellem mine to emner for at opnå en god forståelse af begge områder.

2. Sprint

24 februar - 7. marts

Læringsmål

2. Sprints hovedformål er at opnå en dybere forståelse for IT-sikkerhed med det mål at opstarte et IT-sikkerhedskursus gennem TryHackMe’s interaktive kursus. Derudover vil jeg arbejde videre med webudvikling. Ved at følge Scrimba’s JavaScript-kursus får jeg hands-on erfaring og mulighed for at arbejde i praksis.

Aktiviteter

  • Opnå en forståelse af IT-Sikkerhed
  • Forstå hvordan formularer og inputfelter fungere i HTML
  • Arbejde videre med webudvikling
  • Lære at læse og analysere kode med variabler, loops og betingede udsagn.
  • Forstå hvordan HTML, CSS og JavaScript arbejder sammen i en webside.
  • Udarbejde en frontend platform for Optilogic projektet (se produkter)
  • Opnå kendskab til almindelige sikkerhedstrusler

Dagsplan (hverdage)

  • 09:00–10:00 Webudvikling
  • 10:00–10:15 Pause
  • 10:15–11:30 IT-Sikkerhed
  • 11:30–12:00 Frokost
  • 12:00–13:00 Afrunding

Logbog

I dette sprint vil jeg arbejde med IT-sikkerhed og webudvikling. Jeg vil forsøge at forbedre min struktur og fokusere på at opnå en dybere forståelse for begge emner. Jeg vil arbejde med at implementere en frontend i vores projekt og samtidig opstarte et IT-sikkerhedskursus.

Evalueringer

To uger hvor jeg igen har haft meget fokus på webudvikling. Dog skal det siges at jeg er begyndt at få en forståelse for IT-sikkerhed og har opstartet et kursus. Jeg har arbejdet med at implementere en frontend i vores projekt og har fået en dybere forståelse for html, css og JavaScript.

3. Sprint

10 marts - 21. marts

Læringsmål

Gennemgå TryHackMe’s interaktive kursus hvor jeg får en struktureret og dybdegående gennemgang af Cyber Security. Det indebærer Computer networking and cryptography - MS Windows, Active Directory, and Linux basics - Offensive security tools and system exploitation - Defensive security solutions and tools - Cyber security careers.

Aktiviteter

  • TryHackMe's interaktive kursus
  • Lære at implementere sikkerhedsforanstaltninger (inputvalidering samt tydelige fejlbeskeder)
  • Forstå hvordan Document Object Model er opbygget og fungerer.
  • Forstå princippet om Seperation of Concerns
  • Lære at analysere og fortolke responskoder (f.eks. 200 OK, 403 Forbidden, 404 Not Found)

Dagsplan (hverdage)

  • 09:00–10:00 IT-Sikkerhed
  • 10:00–10:15 Pause
  • 10:15–11:30 IT-Sikkerhed
  • 11:30–12:00 Frokost
  • 12:00–14:00 Udvikling i React

Logbog

I dette sprint opdeler jeg med vilje min tid mellem IT-sikkerhed og webudvikling. Dette for at opnå en dybere forståelse for begge emner. Jeg vil arbejde med at implementere React i vores projekt og samtidig gennemgå TryHackMe’s interaktive kursus.

Evalueringer

3. Sprint har givet mig et godt indblik i IT-sikkerhed. Jeg følger det interaktive kursus fra TryHackMe hver dag, hvilket giver mig praktisk erfaring og mulighed for at afprøve forskellige aspekter af cybersikkerhed. Samtidig har jeg fortsat arbejdet på vores projekt hos Optilogic. Jeg arbejder utroligt meget på min portfølge da det i og for sig også er mit produkt for webudvikling.

4. Sprint

24 marts - 4 april

Læringsmål

Forsætte på TryHackMe's interaktive kursus, blandt andet Windows Fundamentals, Command Line og Networking. Fortsætte på webudvikling og arbejde videre med frontenden hos Optilogic. Jeg arbejder hele tiden med HTML, CSS og JavaScript igennem udarbejdelsen af min portfølje.

Aktiviteter

  • Cyber Security 101
  • Lære at indsætte og observere XSS-angreb i inputfelter
  • Lære hvordan man opsætter simple-demo miljøer med bevidste usikre funktioner
  • Lære at anvende event listeners og håndtere brugerinput
  • Forstå hvordan JavaScript kan manipulere HTML- og CSS elementer dynamisk
  • JavaScript Tutorial

Dagsplan (hverdage)

  • 09:00–10:00 IT-Sikkerhed
  • 10:00–10:15 Pause
  • 10:15–11:30 IT-Sikkerhed
  • 11:30–12:00 Frokost
  • 12:00–14:00 Webudvikling

Logbog

Jeg fortsætter på TryHackMe's interaktive kursus og arbejder videre med webudvikling.

Evalueringer

Meget stillestående sprint. Vi mangler stadig svar fra PO om, hvorvidt vi har mulighed for at få et kamera ud på en havn. Det har gjort, at vi desværre har været holdt tilbage på projektet, som har sat et spænd omkring, hvor meget vi hver især har kunnet arbejde med for projektet hos Optilogic. Med det sagt har jeg kigget meget på JavaScript, som jeg har siddet med stort set hver dag. Jeg har haft en del mere fokus på webudvikling, end jeg har haft på IT-sikkerhed dette sprint. Det er taget til efterretning, og jeg vil igen begynde at arbejde mere med IT-sikkerhed i de kommende uger.

5. Sprint

7 april - 18 april

Læringsmål

I dette sprint står vi overfor nogle ændringer i vores projekt. Vi har været på standby, da vi har ventet på at få et kamera ud på en havn og derfor ikke kunne komme videre med projektet for Optilogic. Vi afventer egentlig bare PO. Jeg skal finde ud af, hvordan jeg kan implementere IT-sikkerhed for det nye projekt. Umiddelbart beholder vi idéen om en parkeringsplads, men fokuserer på at lave det ud fra en parkeringsplads frem for en havn. Det gør det nemmere at finde dataen, som de i teamet, der har machinelearning, skal bruge. Det gør, at jeg forhåbentlig snart ved, hvor jeg skal begynde at implementere IT-sikkerhed.

Aktiviteter

  • Finde IT-sikkerheds materiale der passer til projektet
  • Forstå ansvarsfordeling mellem klient og server ift. sikkerhed.
  • Free JavaScript Tutorial
  • JavaScript gennemgang med w3schools
  • Lære at bruge JavaScript til at vise og skjule elementer dynamisk
  • Kende til betydningen af tydelig fejlmeddelelse og bekræftelser i brugerinteraktion
  • Kende til almindelige valideringsprincipper
  • Forstå betydningen af brugerfeedback i interaktive systemer

Dagsplan (hverdage)

  • 09:00–10:00 IT-Sikkerhed
  • 10:00–10:15 Pause
  • 10:15–11:30 IT-Sikkerhed
  • 11:30–12:00 Frokost
  • 12:00–14:00 Webudvikling

Logbog

Jeg fortsætter på TryHackMe's interaktive kursus og arbejder videre med React.

Evalueringer

Første uge af 5. sprint var vi meget presset på vores projekt. Vi har stadig ingen svar fået fra PO hvilket har ført til at vi hver især laver lidt individuelle projekter for tiden. Ift ITSikkerhed vil jeg prøve på at lave nogle forskellige små produkter som afspejler itsikkerhed. Så kan jeg både arbejde med noget JavaScript og IT-Sikkerhed sammen. Indtil vi høre mere har vi ikke rigtigt andre projekter for semesteret. Anden uge af 5. sprint gik med at holde påskeferie og søge praktik.

6. Sprint

21 april - 2 maj

Læringsmål

6. Sprint fokusere jeg udelukkende på min egen udvikling. Jeg fokusere indtil videre, ikke mere på projektet, før vi hører noget fra PO. Problemet med at vi ingen svar får, er at vi faktisk ikke har et rigtigt produkt. Lige nu egentlig bruger vi dummydata, og næste step i projektet er at få det implementeret et sted, vi rent faktisk kan få lov til at arbejde på, så vi kan indsamle noget rigtig data.

Aktiviteter

  • Finde frem til IT-Sikkerheds relateret produkter
  • Forstå hvad en session er, og hvordan sessioner bruges til at huske brugerens tilstand i en webapplikation
  • Få indsigt i hvordan cookies, tokens og sessions overføres mellem klient og server
  • Få lagt produkter ind på min portfølge
  • Læse op på IT-Sikkerheds principper
  • Fortsætte arbejdet med HTML, CSS og JavaScript
  • Opnå kendskab til forskellem mellem et framework og et library
  • Opnå kendksab til hvordan browserens DevTool
  • Kenskab til DevTools fanerne, network, console og elements.

Dagsplan (hverdage)

  • 09:00–10:00 IT-Sikkerhed
  • 10:00–10:15 Pause
  • 10:15–12:00 IT-Sikkerhed
  • 12:00–12:30 Frokost
  • 12:30–14:30 Webudvikling

Logbog

Jeg går efter at få lidt afveksling i min hverdag, så jeg ikke udelukkende låser mig fast på interaktive kurser som TryHackMe's. Jeg vil ud og søge efter flere kilder.

Evalueringer

Jeg har desværre været meget presset med praktiksøgning dette sprint. Jeg har dog formået at få udarbejdet nogle prøv selv knapper på min portfølge som dækker begge mine emner. Projektet hos optilogic er stadig i stå, da vi ikke har fået svar fra PO. Det er meget frustrerende, da vi ikke rigtig kan komme videre med projektet. Vi er dog hver i sær begyndt at lave egne små projekter.

7. Sprint

5 maj - 16 maj

Læringsmål

Jeg vil fokusere på at finde IT-sikkerheds relateret produkter og få dem lagt ind på min portfølje. Det styrker både min portfølje og min forståelse for IT-sikkerhed og for webudvikling. Jeg gør det i og med vores projekt hos Optilogic er gået helt i stå. Så jeg kommer til at sidde med egne projekter i stedet for.

Aktiviteter

  • Finde frem til itsikkerheds relevante projekter
  • Forstå forskellen mellem HTTP og HTTPS.
  • Lære hvordan HTTPS beskytter mod angreb som Man-in-the-Middle
  • Opnå forståelse for at kvalitetsikre en webside for udviklre og brugeres skyld
  • Opnå forståelse for de forskellige frameworks og libraries, der anvendes til webudvikling
  • Forstå hvorfor og hvornår man vælger at bruge et framework eller library fremfor vanilla JavaScript
  • Få kendskab til JWT (JSON Web Token) og hvordan det bruges til autentificering
  • Øve sig i at dokumentere forskelle før og efter, herunder beskrive hvilke risici der er reduceret.

Dagsplan (hverdage)

  • 09:00–10:00 IT-Sikkerhed
  • 10:00–10:15 Pause
  • 10:15–12:00 IT-Sikkerhed
  • 12:00–12:30 Frokost
  • 12:30–14:30 Webudvikling

Logbog

Jeg har kigget meget på egne produkter dette sprint.

Evalueringer

I dette sprint har jeg haft stort fokus på at lave en masse produkter samt at dokumentere dem på en måde, så man kan se, hvordan de er blevet lavet. Jeg skal have rettet lidt i nogle af de produkter, jeg lavede helt i starten – i de første sprints. Derudover føler jeg, at der er kommet meget afklaring i forhold til eksamen, hvilket har givet mig ro og fokus på det, jeg skal lave her til sidst. Jeg skal her til sidst have lagt de sidste produkter ind, og så skal jeg have færdiggjort det login-system, jeg er ved at arbejde med, hvor jeg viser en del IT-sikkerhed. Det indebærer en hashing-algoritme (Argon2). Jeg har lavet noget rate limiting og lockout, session- og cookie-sikkerhed, CSRF-beskyttelse – det er, hvad jeg har lavet indtil nu – så det skal afsluttes og dokumenteres.

8. Sprint

19 maj - 30 maj

Læringsmål

Jeg skal her til sidst have lagt de sidste produkter ind, og så skal jeg have færdiggjort det login-system, jeg er ved at arbejde med, hvor jeg viser en del IT-sikkerhed. Det indebærer en hashing-algoritme (Argon2). Jeg har lavet noget rate limiting og lockout, session- og cookie-sikkerhed, CSRF-beskyttelse – det er, hvad jeg har lavet indtil nu – så det skal afsluttes og dokumenteres. Jeg udarbejder samtidig også et form for landkort over min portfølge, hvor jeg dækker min front-end, back-end og hvad der ellers er af sammenhæng. Jeg har fået kigget ind på mit sidste "emne", headers, hvilket jeg har brugt en del tid på at undersøge.

Aktiviteter

  • Opretholde ren projektstruktur ved forståelse af Modular Software Design
  • Øve sig i at formulere hvorfor en bestemt metode er valgt i en given kontekst
  • Forstå hvad Content Security Policy er, samt rollen den spiller i webapplikationers sikkerhed.
  • Lære at bruge online testværktøj som Securityheaders.com og SSL Labs
  • Forstå hvordan disse værktøjer identificerer svagheder som manglende sikkerhedsheadere mm.
  • Lære at definere og implementere en CSP-header i en webapplikation
  • Lære om vigtige sikkerhedsheadere som Content-Security-Policy, Strict-Transport-Security mm.
  • Lære at implementere sikkerhedsheadere korrekt i serverkonfiguration eller backend-kode
  • Forstå hvordan sikkerhedsheadere og korrekt konfigurerede serversvar kan forebygge visse angreb.
  • Forstå hvordan manglende headere kan skabe sikkerhedsrisici

Dagsplan (hverdage)

  • 09:00–10:00 IT-Sikkerhed
  • 10:00–10:15 Pause
  • 10:15–12:00 IT-Sikkerhed
  • 12:00–12:30 Frokost
  • 12:30–14:30 Webudvikling

Logbog

Dagene er gået på at få færddigjort de sidste ting. Få afsluttet de projekter jeg havde gang i, selvom de ikke var færdige.

Evalueringer

Det sidste og mest pressede sprint til dato. Jeg har haft utroligt mange hængepartier, som jeg gerne ville have arbejdet mere med – men der har desværre ikke været tid nok her på falderæbet. Min samlede evaluering af de sidste tre måneder lyder, at jeg først og fremmest burde have været mere disciplineret i forhold til, hvor meget tid jeg bruger på hvert emne ad gangen. Ofte er jeg blevet helt opslugt af at arbejde med webudvikling, og når der går for lang tid mellem de to hovedemner, kræver det lidt genopfriskning. Det har dog været et meget lærerigt og spændende 4. semester, selvom det har krævet, at man hanker op i sig selv og aktivt opsøger viden. Her føler jeg, at jeg for hvert sprint er blevet bedre til netop det. Jeg har brugt meget tid på at få uploadet produkter til min side her i den sidste periode. Det har taget langt mere tid end forventet, og det er tydeligt, at det havde været smartere at gøre løbende. Det betyder desværre, at jeg ikke helt er nået i mål med det. Praktik har også fyldt meget, hvilket har gjort det lidt svært for mig at holde kursen i en periode, mens jeg ledte efter et praktiksted. Jeg har dog nu fået en praktikplads, og det har givet mig ro og overskud til at afslutte det sidste sprint på en god måde.

Ugenlig logbog for

4. Semester

React logo

1. sprint

10 - 21 februar
At opnå en grundlæggende forståelse af React ved at lære at opbygge komponenter, arbejde med JavaScript teknikker og anvende CSS til styling, derudover bygger jeg sideløbende min portfølge.
  • I dag og de næste par dage vil jeg arbejde med at lære React. Jeg følger React quickguide (se kilde) og vil arbejde med at opbygge en simpel applikation. Learn React
  • Forsættelse fra dagen før... Learn React
  • Forsættelse fra dagen før... Learn React
  • Forsættelse fra dagen før... Learn React
  • Forsættelse dagen før, afrunding af ugen. Learn React
  • Jeg forsætter med at fordybe mig i React og samtidig få et overblik over IT-Sikkerhed. Learn React
  • Jeg forsætter med at fordybe mig i React og samtidig få et overblik over IT-Sikkerhed. Learn React
  • Jeg forsætter med at fordybe mig i React og samtidig få et overblik over IT-Sikkerhed. Learn React
  • Jeg forsætter med at fordybe mig i React og samtidig få et overblik over IT-Sikkerhed. Learn React
  • Jeg forsætter med at fordybe mig i React og samtidig få et overblik over IT-Sikkerhed. Learn React
React logo

2. Sprint

24 februar - 7 marts
Opnå en dybere forståelse for IT-sikkerhed med det mål at opstarte et IT-sikkerhedskursus gennem TryHackMe’s interaktive kurser. Derudover vil jeg arbejde videre med React. Ved at følge Scrimba’s JavaScript-kursus får jeg hands-on erfaring og mulighed for at arbejde i praksis.
  • Sygdom Learn React
  • Sygdom Learn React
  • Sygdom Learn React
  • Sygdom Learn React
  • Sygdom Learn React
  • Jeg forsætter med at fordybe mig i webudvikling og samtidig få et overblik over IT-Sikkerhed. Learn React
  • Jeg forsætter med at fordybe mig i webudvikling og samtidig få et overblik over IT-Sikkerhed. Learn React
  • Jeg forsætter med at fordybe mig i webudvikling og samtidig få et overblik over IT-Sikkerhed. Learn React
  • Jeg forsætter med at fordybe mig i webudvikling og samtidig få et overblik over IT-Sikkerhed. Learn React
  • I dag var vi ude hos productowner Optilogic. Vi fandt sammen ud af at frontenden skulle have en kærlig hånd. Derudover skal vi lære igennem machinelearning at forudsige hvornår der er vand og hvornår der ikke er.
React logo

3. Sprint

10 - 21 marts
Gennemgå TryHackMe’s interaktive kursus hvor jeg får en struktureret og dybdegående gennemgang af Cyber Security. Det indebærer Computer networking and cryptography - MS Windows, Active Directory, and Linux basics - Offensive security tools and system exploitation - Defensive security solutions and tools - Cyber security careers.
  • Dagen i dag er gået med opstart af TryHackMe’s interaktive kursus. Jeg har gennemgået en introduktion, hvor man kommer igennem Offensive Security Intro og Defensive Security Intro – som introducerer en til forskellige emner inden for IT-Sikkerhed. Derudover er jeg fortsat med React. Cyber Security 101
  • I dag er jeg fortsat med THM's kursus. Jeg har gennemgået Search Skills for at lære, hvordan man bedst optimerer sin søgning efter information vha. specielle søgemaskiner. Cyber Security 101
  • Dagen i dag gik på at optimere min portefølje vha. HTML, CSS og JavaScript. Jeg har opdateret forskellige sektioner for at gøre siden mere informativ og klar til processmøde.
  • Dagen i dag er fortsat gået med THM's kursus. Jeg har gennemgået Linux Fundamentals part 1 og 2. I dette kursus lærer man, hvordan man bruger Linux gennem terminalen og benytter forskellige kommandoer – eksempelvis at tilkoble sig en anden virtuel maskine og/eller finde filer uden et GUI. Cyber Security 101
  • Fridag.
  • I dag var projektgruppen til produktvejledning, og det meste af dagen gik med at forberede til mødet.
  • I dag fortsatte jeg på Linux Fundamentals part 3, hvilket tog længere tid end forventet, men nu er den gennemgået. Dermed er Linux Fundamentals fuldt gennemgået, og jeg kan gå videre til næste emne.
  • Dagen i dag gik med at oprette en model i Figma, hente den som SVG og implementere den i vores React-projekt for Optilogic. Vi har møde med productowner fredag og skal forbedre UI'en og sikre, at vi får forbindelse til vores API.
  • I dag gik dagen med Erfa-møder. Der var møder for både IT-Sikkerhed og Webudvikling.
  • Dagen i dag gik ude hos productowner, som var tilfreds med arbejdet. Vi venter nu på, at PO får sat et kamera op nede på Odense Havn, så vi kan afprøve i praksis.
React logo

4. Sprint

24 marts - 4 april
Forsætte på TryHackMe's interaktive kursus, blandt andet Windows Fundamentals, Command Line og Networking. Fortsætte på webudvikling og arbejde videre med frontenden hos Optilogic. Jeg arbejder med HTML, CSS og JavaScript igennem udarbejdelsen af min portfølje.
  • Fridag.
  • Hele dagen i dag er gået med optimering og opdatering af min portefølje. Jeg har opdateret mine sprints, tilføjet nye projekter og opdateret min logbog.
  • Eksamensforudsætning.
  • I dag kiggede jeg udelukkende på JavaScript da det er en stor del af webudvikling og samtidig her jeg føler, at jeg gerne vil styrkes endnu mere. W3 Schools JavaScript
  • Fridag.
  • Noterne bliver meget ensformet og jeg har svært ved at sætte nye ord på det jeg laver. Jeg laver ærligt talt det samme hver dag, men selvfølgelig hvor jeg lærer noget nyt. Jeg har atter engang kigget på JavaScript. Det er et kæmpe stort emne og der er mange forskellige ting at tage fat i. JavaScript, JavaScript, JavaScript.
  • JavaScript, JavaScript, JavaScript.
  • JavaScript, JavaScript, JavaScript.
  • JavaScript, JavaScript, JavaScript.
  • Fridag.
React logo

5. Sprint

7 april - 18 april
I dette sprint står vi overfor nogle ændringer i vores projekt. Vi har været på standby, da vi har ventet på at få et kamera ud på en havn og derfor ikke kunne komme videre med projektet for Optilogic. Vi afventer egentlig bare PO. Jeg skal finde ud af, hvordan jeg kan implementere IT-sikkerhed for det nye projekt.
  • Ugen er startet og jeg fortsætter hvor jeg slap. Grunden til at jeg fokusere så meget på JavaScript er at det er selve funktionaliteten bag webudvikling og frontend. Cyber Security 101
  • Dagene er meget ens for tiden. Jeg læser meget op på JavaScript men har svært ved at holde koncentrationen for IT-Sikkerhed. Det skyldes primært at vores projekt igennem Optilogic er gået meget i stå. Så jeg står lige nu med følelsen af at jeg har svært ved at finde frem til produkter. Cyber Security 101
  • I dag har jeg brugt dagen på nogle forskellige projekter igennem roadmap.sh. Roadmap.sh er en interaktiv guide til at lære forskellige programmeringssprog og frameworks, derudover kan man finde forskellige tests, hvor man kan teste sig selv i at lave forskellige projekter. I dag har jeg lavet nogle forskellige projekter derfra. Roadmaps
  • Cyber Security 101
  • I dag går turen til Århus, for at besøge en virksomhed til praktik. Cyber Security 101
  • Påskeferie & praktiksøgning. Cyber Security 101
  • Påskeferie & praktiksøgning. Cyber Security 101
  • Påskeferie & praktiksøgning. Cyber Security 101
  • Påskeferie & praktiksøgning. Cyber Security 101
  • Påskeferie & praktiksøgning. Cyber Security 101
React logo

6. Sprint

21 april - 2 maj
Jeg fokusere udelukkende på min egen udvikling. Jeg fokusere indtil videre, ikke mere på projektet, før vi hører noget fra PO. Problemet med at vi ingen svar får, er at vi faktisk ikke har et rigtigt produkt. Lige nu egentlig bruger vi dummydata, og næste step i projektet er at få det implementeret et sted, vi rent faktisk kan få lov til at arbejde på, så vi kan indsamle noget rigtig data.
  • Dagen i dag er brugt på at forbedre min praktikansøgning og finde virskomheder til praktik.
  • I dag har jeg lagt kræfter i at udarbejde nogle interaktive knapper på hjemmesiden her. Det viser at jeg har forståelse for itsikkerhed men også udviklingsdelen. Det giver også personer, der ser min portfølge en mulighed for at se hvad jeg kan, gennem interaktive knapper.
  • Jeg har arbejdet videre med mine produkter. Jeg har tilføjet Authentication, XSS & SQL Injection. Authentication viser hvordan der ved login af en profil bliver sendt en token til serveren. Jeg laver en Base64‑“hash” for at give et indblik bagved et login. XSS testen viser at man ikke kan indsætte et script tag i et input felt, da jeg har erstattet med entiteter. Så vi undgår ondsindet kode køre på siden. SQL injection testen viser at hvis der bliver kørt en payload i vores input. Så bruger jeg ? som pladsholder, og egentlig sender brugerens input som ren data. Det vil sige 1 OR 1=1 kun kan blive vist som tekst, aldrig ændring af en kommando.
  • Jeg har arbejdet videre med mine produkter. Jeg har tilføjet Authentication, XSS & SQL Injection. Authentication viser hvordan der ved login af en profil bliver sendt en token til serveren. Jeg laver en Base64‑“hash” for at give et indblik bagved et login. XSS testen viser at man ikke kan indsætte et script tag i et input felt, da jeg har erstattet med entiteter. Så vi undgår ondsindet kode køre på siden. SQL injection testen viser at hvis der bliver kørt en payload i vores input. Så bruger jeg ? som pladsholder, og egentlig sender brugerens input som ren data. Det vil sige 1 OR 1=1 kun kan blive vist som tekst, aldrig ændring af en kommando.
  • Produkterne er tilføjet og jeg arbejder videre med dem og brainstormer nye ideer til nye produkter.
  • Jeg skal have opdateret mine proukter med alle mine noter og alt koden der ligger bag blandt andet de interaktive knapper men også hele hjemmesiden.
React logo

7. Sprint

5 maj - 16 maj
Jeg vil fokusere på at finde IT-sikkerheds relateret produkter og få dem lagt ind på min portfølje. Det styrker både min portfølje og min forståelse for IT-sikkerhed og for webudvikling. Jeg gør det i og med vores projekt hos Optilogic er gået helt i stå. Så jeg kommer til at sidde med egne projekter i stedet for.
  • I dag var vi til ERFA møde på skolen. Vi kom frem til at det nok var en god i det at få lavet nogle produkter individuelt, og så eventuelt sparre med hinanden.
  • Opdateret min portfølge.
  • I dag har jeg arbejdet i at tilføje produkter til min portfølge. Ikke så meget nye proukter men mere koden bag de eksisterende produkter. Jeg sidder og repitere meget af webudviklings koncepter og til dels også itsikkerhed. Så jeg føler egentlig det kører meget godt. Jeg mangler lidt flere læringsmål, og ellers klør jeg bare på.
  • Jeg har tilføjet flere læringsmål. Læringsmål der dækker de kompetencer jeg har tilegnet mig henover 4. semester. Jeg mangler stadig at finde de sidste læringsmål for IT-Sikkerhed. Derudover har jeg brugt meget tid på at optimere min portfølge.
  • Jeg har i dag rettet i min logbog og fået det til at passe mine sprints. Dagene går på meget sideoptimering.
  • Jeg har i dag lavet et nyt produkt. Jeg har lavet en knap "Fold et papir til månen", knappen her åbner et overlay, i det overlay vil jeg vise at jeg kan vha. knapper navigere igennem billeder med tilhørende tekst og ideer, så hvert tekst er forbundet til et billede. Jeg har lavet en list hvor hver billede har en tilhørende tekst, og det er så den list man kører igennem. Derudover er det også lærigt.
  • Jeg har arbejdet videre på "Fold et papir til månen", ikke at der er sindsygt meget at gøre, men det tager lidt tid lige så snart det grundlæggende er på plads. Jeg bruger det blandt andet til at vise der er nogle forskellige elementer jeg har styr på indenfor JavaScript. Derudover var det en sjov udfordring.
  • Jeg er gået i gang med at lave en login og opret bruger system på min side. Det er for at vise min forståelse for JavaScript og Itsikkerhed. Planen er at jeg vil indkopere flere forskellige itsikkerheds elementer, for at illustrere min viden og færdigheder. Jeg har lavet 2 modals, en til log ind og en til opret konto. Dertil har jeg lavet en backend mappe, hvor jeg har har oprettet flere filer. Blandt andet en server.js, en db.js, en auth.js og en users.db. Jeg har som det første forsøgte at læse mig frem til den bedste hashing metode, og er kommet frem til argon 2 import. Som egentlig er et library, der hjælper med at oprette den bedste hashing for brugere der opretter en konto.
  • Jeg har i dag og de næste par dage til at arbejde videre på min login og opret konto modaler. Jeg har arbejdet videre med min hashing af passwords for nye brugere. Jeg er også begyndt på en rateLimiter.js. Det ern rateLimiter gør er at sætte en grænse for antal forsøg en bruger kan lave. Dette er nyttigt for at jeg kan dæmpe brute-force-angreb. Så ondsindet agtøre ikke kan skaffe adgang til de oprettede adgangskoder.
  • Forsættelse på login modal. Jeg er har færdiggjort rateLimiteren samt fået importet argon2 hashing korrekt. Jeg er nu begyndt med nogen Session og Cookie sikkerhed. Session er serveren der husker på hvem brugeren er, cookien er en lille billet i browseren der fortæller serveren hvilken seddel der min. Jeg er ved at kigge på noget implementering af forsvar mod CSRF angreb, som er et angreb der kan misbruge den her cookie billet.
React logo

8. Sprint

19 maj - 30 maj
Jeg skal her til sidst have lagt de sidste produkter ind, og så skal jeg have færdiggjort det login-system, jeg er ved at arbejde med, hvor jeg viser en del IT-sikkerhed. Det indebærer en hashing-algoritme (Argon2). Jeg har lavet noget rate limiting og lockout, session- og cookie-sikkerhed, CSRF-beskyttelse – det er, hvad jeg har lavet indtil nu – så det skal afsluttes og dokumenteres. Jeg begynder på udarbejdelse af noter over min portfølge, hvor jeg dækker min front-end, back-end og hvad der ellers er af sammenhæng. Derudover skal jeg have lavet en opsamling af alle mine "noter".
  • Jeg har så vidt muligt forsøgt at arbejde mig videre på mit login modal. Jeg føler dog jeg er meget presset på tid med alt det jeg gerne vil nå. Tilgængel er der utroligt meget spændene indhold i den modal. Så jeg arbejdet med en masse spændene opgaver.
  • Jeg har i dag skaffet praktik og det har ærligt talt skabt meget mere overskud. Jeg har været meget presset med at kunne nå det hele føler jeg. Jeg er dog kommet til den konklusion at jeg ikke kan nå at færddiggøre min login modal. Jeg har arbejdet i at lave noget
  • Jeg har brugt dagen i dag på at lave en samlet liste for webudvikling, herunder HTML, CSS og JavaScript. Jeg deler mine noter op i termer, forklaring og kode eksempel. Det gør jeg for at få sat navn på, en forklaring dertil og så med et kode eksempel fra min egen portfølge. Jeg føler det er en god tilgang og det har virket godt for mig.
  • Jeg fortsættede med mine lister, og tilføjede i dag også en noteboks for itsikkerhed. Ligeledes her deler jeg det op i term, forklaring og kode eksempel. Derudover har jeg brugt en del tid på at tilføje bilag og beskrivelse af de produkter jeg indtil nu har lavet. Det kan godt tage lidt tid at skulle forklare det helt lagpraktisk, men tilgengæl får jeg genemfrisket kodestykkerne. I princippet skulle det have været gjort løbende med de blev lavet, men de fleste af produkterne har jeg tilføjet her på Peters anbefaling :)
  • Jeg har i dag indsat mine langsigtede læringsmål i et målhieraki og arbejder på et lave en en tråd igennem hele 4. semeester. Jeg har her lagt mine kortsigtede måls aktiviteter ind for at understøtte mine langsigtede læringsmål for hver emne. Der er mange refleksioner der skal gøres. Jeg føler det er svært at sætte fordele dem på viden, færdighed og kompetencer, hvilket jeg ærligt talt ikke har været god nok til at gøre gennem semesteret.
  • Jeg arbejder videre på mine målhieraki. Det gør jeg for at skabe et overblik, samt at få draget parralellerne til mine kortsigtede læringsmål. Jeg har også tilføjet nogle produkter til min produktsektion. Jeg har blandt andet lagt mine Webudviklings- og Itsikkerhedsnoter ind i en tabel. En hurtig google søgning, så fandt jeg frem til tables, og den røg da også på listen.
  • I dag har jeg arbejdet på at færdiggøre målhierarki'erne for Webudvikling og It-sikkerhed. Jeg har lagt mine sidste kortsigtede læringsmål ind og fået det til at passe sammen. Jeg er ligeledes ved at få et overblik over det der skal med til eksamen, og forsøge at skabe en råd tråd igennem hele 4. semester.
  • Det sidste og mest pressede sprint til dato. Jeg har haft utroligt mange hængepartier, som jeg gerne ville have arbejdet mere med – men der har desværre ikke været tid nok her på falderæbet. Min samlede evaluering af de sidste tre måneder lyder, at jeg først og fremmest burde have været mere disciplineret i forhold til, hvor meget tid jeg bruger på hvert emne ad gangen. Ofte er jeg blevet helt opslugt af at arbejde med webudvikling, og når der går for lang tid mellem de to hovedemner, kræver det lidt genopfriskning. Det har dog været et meget lærerigt og spændende 4. semester, selvom det har krævet, at man hanker op i sig selv og aktivt opsøger viden. Her føler jeg, at jeg for hvert sprint er blevet bedre til netop det. Jeg har brugt meget tid på at få uploadet produkter til min side her i den sidste periode. Det har taget langt mere tid end forventet, og det er tydeligt, at det havde været smartere at gøre løbende. Det betyder desværre, at jeg ikke helt er nået i mål med det. Praktik har også fyldt meget, hvilket har gjort det lidt svært for mig at holde kursen i en periode, mens jeg ledte efter et praktiksted. Jeg har dog nu fået en praktikplads, og det har givet mig ro og overskud til at afslutte det sidste sprint på en god måde.
  • Deadline for portfølge 13.00

Prøv selv

Tilføj cookies Tilføj cookies
Login, XSS & SQL‑injektion Login, XSS & SQL‑injektion
Test adgangskode‑styrke Test adgangskode‑styrke
Paper folder Fold et papir til månen

Indblik i igangværende

Produkter

PubGolf app-ikon – ruter og check-ins

PubGolf

Udforsk byer med ruter, check-ins og scoring.

Hvad kan appen?

PubGolf gør det sjovt og enkelt at opleve nye byer sammen med venner. Appen kombinerer navigation, sightseeing og legende scoring, så I kan besøge monumenter, parker, caféer og vartegn – og samle point undervejs.

  • Automatisk ruteoprettelse: Vælg område og antal stop – få en optimal rute på sekunder.
  • Navigation & tracking: Følg ruten på kortet, se afstand og tid, og hold styr på dine check-ins.
  • Scoring & udfordringer: Golf-inspireret point gør ruterne til en leg for hele gruppen.
  • Gem & fortsæt: Pause midt i ruten og fortsæt præcis hvor I slap.
  • Leaderboard & deling: Følg stillingen live og del jeres resultater.
  • Privat data: Alt gemmes lokalt på enheden – ingen konto, ingen uploads.

Ekstra (18+): For dem der ønsker det, kan særlige aften-/nightlife-ruter låses op. De er tydeligt markeret som 18+ og kræver aldersbekræftelse.

Release notes
  • 1.1.0 – City-ruter som standard, 18+ nightlife som valgfrit tilvalg, opdateret ikon/metadata.

Optilogic

Klik for at åbne ⭣

Indblik i vores projekt hos Optilogic (frontend og machinelearning)

Februar 2025 - 2. Sprint

Opstart af projekt – fastlæggelse af scope og begyndelse på en frontend over en parkeringsplads.

Vi er i gang med at udvikle en frontend, der skal vise ledige og optagede pladser på en havneplads. Teamet er opdelt, ud fra vores selvvalgte emner, så vi samarbejder og varetager forskellige roller. Jeg har ansvaret for at udvikle frontenden og for at inkorporere IT-sikkerhed, mens resten af teamet arbejder med backend, database og DevOps.

Optilogic Start Optilogic Start Optilogic Start Optilogic Start
Marts 2025 - 3. Sprint

Grundlæggende UI er nu på plads. Jeg har designet en model af Odense Havn i Figma og derefter overført den som en SVG til vores React-projekt. På den måde kan jeg tilføje en onClick-metode, så hver enkelt bådplads kan interageres med.

Optilogic UI i marts Optilogic UI i marts

Målhieraki

Klik for at åbne ⭣

Målhieraki for emnerne Webudvikling og Itsikkerhed.

Maj 2025 - 8. Sprint
Målhieraki webudvikling Målhieraki itsikkerhed

TryHackMe

Klik for at åbne ⭣

Indblik i TryHackMe's interaktive kursus og badges dertil.

Marts 2025 - 3. Sprint

Jeg er i gang med TryHackMe’s interaktive kursus for at opnå en dybere forståelse af IT-sikkerhed. Med en bred introduktion som udgangspunkt er målet at indsnævre fokusområdet, så det giver bedre mening i forhold til vores projekt hos Optilogic Opstart af It-sikkerhed. Første badges er hentet.

tryhackme Start

Her har jeg startet en virtuel Linux maskine. Jeg kører kommandoen ps aux, for at se hvilke processer der er blevet kørt af hvilke brugere.

tryhackme Start Jeg har vedhæftet mine noter til første del af TryHackMe's del. tryhackme tryhackme tryhackme tryhackme tryhackme tryhackme tryhackme tryhackme tryhackme tryhackme tryhackme tryhackme tryhackme tryhackme

Tilføj cookie

Klik for at åbne ⭣

Indblik i hvad der skal til, for at lave en simpel cookie popup.

April 2025 - 6. Sprint

Det første, jeg gør, er at oprette en ny section med id’et andre-produkter. Dette ersimpel HTML-opstilling og tillader mig at skabe et overblik over sektionen og tilpasse CSS’en til det. Herefter har jeg tilføjet nogle div med classer, så jeg kan ramme de enkelte klasser i CSS’en. Img er for at tilføje billederne til knapperne. Ellers er der bare tilføjet noget simpelt tekst for at fortælle, hvad det er for en knap.

cookie Start

Det næste, der sker, er, at jeg har tilføjet et id, som jeg skal bruge til at oprette noget JavaScript-funktionalitet. Derudover har jeg tilføjet nogle classer, et billede og den tekst p, der skal stå inde i popupen.

cookie Start

Nedenstående, vi ser nu, er den tilhørende CSS, jeg bruger til at style min popup og alt, hvad den indebærer. Det er blandt andet baggrundsfarven, hvor på skærmen den skal være, størrelsen på den, selve cookie-billedet, knappen for at acceptere cookies og luk-knappen.

cookie Start cookie Start

Der er ingen funktionalitet bag knappen, andet end at den blot er visuel og åbner og lukker ved tryk. Det, der sker her, er, at jeg først og fremmest skal ramme den her popup. Det gør jeg ved at hente de forskellige id’er med document.getElementById(). Ud fra det laver jeg en funktion, hvor jeg siger, at display = ‘none’. Popupen bliver egentlig vist hele tiden, men jeg har gjort den ikke synelig. Så tilføjer jeg en EventListener med en click-funktion, som går ind og blokerer den her display, der før var none. Nu bliver den vist. Resten giver lidt sig selv. console.log er for, at jeg selv kan se i konsollen, hvad der bliver klikket på.

cookie Start Her er hvordan det ser ud, når jeg klikker på knappen. Cookie knap gif

Simulere login-flow

Klik for at åbne ⭣

Indblik i, hvad der skal til for at lave en popup, hvori jeg kan vise brugere, hvordan et login-hash (Base64→JWT) fungerer i praksis.

Maj 2025 - 7. Sprint

Det første, jeg gør, er at oprette en ny section med id’et andre-produkter. Dette er simpel HTML-opstilling og tillader mig at skabe et overblik over sektionen og tilpasse CSS’en til det. Herefter har jeg tilføjet nogle div med classer, så jeg kan ramme de enkelte klasser i CSS’en. Img er for at tilføje billederne til knapperne. Ellers er der bare tilføjet noget simpelt tekst for at fortælle, hvad det er for en knap.

cookie Start

Først implementere jeg Login-simulatoren i HTML, jeg har her lavet 2 input felter med id'er så de matcher til et username og et password. Forskellen er at password er af typen password, så det bliver skjult. Placeholderen er for at give brugeren et hint til hvad der skal skrives i felterne. Dernæst kalder jeg en onclick funktion, som hedder simulateLogin(). Det er den funktion, der bliver kaldt når brugeren klikker på Log ind knappen. Jeg har så en paragraph der spytter det input ud, der afhænger af hvilke mail og kode der bliver skrivet ind i input felterne. Klassen security-steps er her hvor jeg, for god ordens skyld, forklare og vejlederen brugeren til hvad der sker i de forskellige steps. Til sidst afunder jeg med en forklaring af hvad det egentlig er der sker her. cookie Start Efter jeg har implementeret HTLM delen, går jeg videre til JavaScript delen. Jeg opretter den her simulateLogin funktion, som indeholder følgende. Det første jeg gør er at finde HTML-elementerne med id'erne sec-username og sec-password. Det gør jeg ved at bruge document.getElementById(). Derefter definerer jeg en btoa() browser-funktion, som er en Base64-encoder. Det vil sige at den tager det input der kommer fra brugeren og encoder det til Base64. OBS: Dette er ikke en sikker hash i virkeligheden. Vi skal bruge nogle systemer der er modstandsdygtige over for brute-force og rainbow-table-angreb. Jeg tjekker ved en if-statement at hash === validHash matcher Base64-enkodningen af hemmelig. Så generere vi et falsk token, for at visualisere hvad der sker bagved. Det er en JWT token, som er en JSON string, der indeholder et header og en payload. Så sætter vi egentlig textContent på elementet med id login-result fra html koden før. cookie Start Her er et eksempel på hvordan det ser ud når jeg logger ind, med en gyldig bruger og kode, samt hvordan det ser ud når jeg logger ind med en ugyldig bruger og kode. cookie Start

XSS Test

Klik for at åbne ⭣

Indblik i hvad der skal til for at vise en simpel XSS test. Hvor jeg erstatter `<`/`>` med entiteter, så det ikke kan køre som script.

Maj 2025 - 7. Sprint

Det først jeg gør er at angive et id, et billede og et navn i prøv selv sektionen. xss 1

Stadig i mit HTML dokument, er jeg nødt til at oprette det overlay jeg skal style igennem mit style.css dokument. Her tilføjer jeg de klasser jeg skal ramme, blandt andet securityOverlay og knappen der skal lukke overlayet.

Jeg opretter også et div med klassen security-card i min index.html, og giver det titlen “XSS test”. Inden i kortet tilføjer jeg et input-felt med id="xss-input" og type="text", hvor placeholder-teksten fortæller, at brugeren kan afprøve fx <script>alert('XSS')</script>. Knappen Kør test har attributten onclick="runXSSDemo()", som kalder JavaScript-funktionen bag demoen. Under knappen placerer jeg en div id="xss-output", hvor resultatet af testen vises, samt en liste med klassen security-steps, der guider brugeren gennem trinene.

XSS test opsætning

I JavaScript definerer jeg herefter funktionen runXSSDemo(), som henter de to elementer med document.getElementById(). Brugerens input læses via .value, og resultatet vises med out. Derefter sætter jeg: out.textContent = input.replace(//g, '>'); Her bliver alle `<`- og `>`-tegn (matcher med regex’en /</g og />/g med global-flaget g) erstattet af deres HTML-entiteter, så browseren kun viser teksten – ikke kører den som kode. /.../ = regex, her skriver jeg tegnet jeg vil have erstattet. g = globalt flag der siger at hele strengen skal tjekkes og ikke kun første <.

XSS test resultat

For at alt det her skal give mening skal vi have en måde hvorpå jeg kan vise det for brugeren. Jeg henter knappen til at åbne, selve overlayet og luk knappen som det første med getElementById.

Jeg tilføjer en EventListener for hver knap/overlay. Det første der sker er at jeg fjerner klassen .hidden ved klik på åben knappen, hvilket får overlayet til at åbne sig. Præcis samme metode for luk-knappen, her tilføjer jeg classen hidden.

xss 3

xss 3

Her er hvordan det ser ud, når jeg kører XSS testen. Xss gif

SQL Injection

Klik for at åbne ⭣

Indblik i hvad der skal til for at lave en SQL-injection.

Maj 2025 - 7. Sprint

Jeg laver et div med klassen security-card og giver det titlen “SQL Injection”. Indeni putter jeg et input id="sql-input" type="text" med placeholder “F.eks. 1 OR 1=1” – det er payload’en. Knappen Kør injection har onclick="runSQLDemo()", som kører funktionen runSQLDemo(). Under knappen er der en pre id="sql-output", hvor jeg viser mine queries. Jeg har en liste security-steps, der forklarer trinene for brugeren. SQL Injection opsætning I JavaScript henter jeg først input og output med document.getElementById(): const input = document.getElementById('sql-input').value; const output = document.getElementById('sql-output'); Så laver jeg to queries: const queryVulnerable = `SELECT * FROM users WHERE id = ${input};`; const querySafe = `SELECT * FROM users WHERE id = ?; // param: "${input}"`; Den første indsætter input direkte, så en payload som “1 OR 1=1” kan ændre kommandoen (sårbart). Den anden bruger en placeholder ?, så input kun ses som data og aldrig kan lave en injection. Til sidst skriver jeg output.textContent = 'Sårbar query:\n' + queryVulnerable + '\n\nSikker query:\n' + querySafe; for at vise begge. SQL Injection resultat Her er hvordan det ser ud, når jeg klikker på knappen. Sql injection gif

Sikring af min portefølje mod webangreb

Klik for at åbne ⭣

Implementering af sikkerhedsforanstaltninger i min portefølje med .htaccess og bevidste angrebstests

Maj 2025 - 8. Sprint

I arbejdet med min portefølje har jeg haft stort fokus på at sikre siden mod de mest almindelige webtrusler. Jeg har forsøgt at oprette forskellige indgangsvinkler med sårbare huller såsom et log ind- og opret konto-system. Derudover har jeg implementeret forskellige “prøv selv”-knapper, hvor det er meningen, jeg viser, hvordan authentication, XSS og SQL injection virker. I denne forbindelse har jeg arbejdet med at implementere flere tekniske sikkerhedsforanstaltninger direkte på serveren ved hjælp af en .htaccess-fil. Dette er en konfigurationsfil, som anvendes i Apache-servermiljøer (som Simply.com benytter, min sides hosting), og som giver mulighed for at tilføje sikkerhedsregler og header-indstillinger, der sendes til browseren. Jeg kører ved hjælp af securityheaders.com en test på min side, og modtager nogle resultater jeg er nødt til at rette op på.

headerSecurity

headerSecurity

Her er headeren jeg har smidt ind i min .htaccess.

headerSecurity

Jeg har sikret mod Cross-Site Scripting (XSS). Ved at tilføje en Content Security Policy (CSP) header har jeg sørget for, at kun indhold fra betroede kilder kan afvikles på siden. Det betyder konkret, at: Eksterne scripts og styles (f.eks. Google Fonts) kun må loades fra godkendte kilder. Ondsindede scripts, der forsøger at blive indlæst via en XSS-sårbarhed, bliver afvist af browseren. Dette reducerer kraftigt risikoen for, at en angriber kan indsprøjte skadelig kode i sitet – noget som især er vigtigt, hvis man arbejder med brugerinput, login eller andre interaktive elementer.

headerSecurity

Jeg har aktiveret Strict-Transport-Security (HSTS). Ved aktivering sørger jeg for, at alle besøgende, som én gang har besøgt min side via HTTPS, fremover automatisk bliver tvunget til at bruge HTTPS. Dette beskytter mod Man-in-the-Middle-angreb, hvor angribere forsøger at aflytte eller manipulere trafikken.

headerSecurity

Jeg har tilføjet følgende header for at forhindre, at min side bliver indlejret i en af en anden side – en teknik, der bruges i clickjacking-angreb.

headerSecurity

Jeg har tilføjet en referrer-kontrol for øget privatliv. Med denne header styrer jeg, hvor meget information browseren sender med, når brugeren klikker på et link væk fra mit site.

headerSecurity

Denne politik sikrer, at kun domænet – og ikke den fulde URL – deles med tredjepartswebsites. Det giver bedre privatliv og gør det sværere for andre sider at analysere brugernes adfærd på mit site. Permissions-Policy giver mig mulighed for at begrænse adgangen til funktioner som geolokation, mikrofon, kamera m.m. De er ikke nødvendige for min portefølje, derfor er de lukket ned. Jeg sikrer, ved at forbyde disse, at ingen scripts – uanset oprindelse – kan misbruge adgang til hardwarefunktioner.

headerSecurity

Jeg kører nu min test endnu engang og her er resultatet.

headerSecurity

headerSecurity

headerSecurity

Hele processen blev udført via FileZilla, hvor .htaccess-filen blev uploadet til public_html-mappen. Det er vigtigt, .htaccess er en ren tekstfil, for at vi kan loade den ind i FileZilla. Derudover var der en for stram CSP, så jeg skulle tilpasse den for at få Google Fonts til at virke og loade siden. Begge dele blev identificeret og løst ved gradvis test og validering. Hele processen blev startet og afsluttet med en sikkerhedsanalyse – jeg gik fra en score på F til A.

headerSecurity

Siden fremstår nu visuelt korrekt og virker som ønsket. Den er sikkerhedsmæssigt hærdet mod en række angrebsformer, og den er transparent i sin sikkerhed, da alle mine headers kan verificeres offentligt. Her er hvordan det ser ud, når jeg kører testen.

Security headers gif

Test adgangskode styrke

Klik for at åbne ⭣

Indblik i hvad der skal til for at kunne teste en adgangskode styrke og visualisere det for en bruger.

Maj 2025 - 7. Sprint

I min prøv selv sektion har jeg tilføjet endnu et product-item. Jeg har her tilføjet en knap, der hedder "Test adgangskode styrke". Når brugeren klikker på knappen, åbner der sig et overlay, hvor brugeren kan indtaste en adgangskode. Jeg tilføjer som sædvaneligt et img element for at give knappen et form for logo. Jeg har givet knappen et id, så jeg kan ramme den i JavaScript. SQL Injection opsætning Stadig i min HTMl kode, har jeg lavet et divmed idet pwdOverlay, for password overlay. Jeg tilføjer en closePwd til lukningen af overlayet. Derudover har jeg en overskrift der fortæller hvad det er . Samt en overskrift til input feltet "Indtast adgangskode". Jeg indsætter et input fel med ideet pwd-input, det er af typen password, så det bliver skjult og placeholderen for at tydeligegøre hvad der skal ske. Jeg har tilføjet 2 divs som er til for at vise styrken af adgangskoden. Jeg har id'et pwd-keter og pwd-bar. Derudover er der tilføjet en pwd-feedback, som er til for at give feedback til brugeren om hvor svag eller stærk adgangskoden er. Jeg tilføjer security steps, som guider brugeren igennem hvad de skal lægge mærke til. Derudover tilføjer jeg lidt gode fifs i bunden. SQL Injection opsætning Selve HTML delen er nu på plads, så jeg går videre til JavaScrip delen. Først og fremmest henter jeg de forskellige ideer vha. en constant som jeg sætter = document.getElementById. Jeg starter med at oprette nogle EventListener, som lyttter henholdsvis efter klik ved åben, klik ved luk og klik udenfor indholdet. SQL Injection opsætning Til sidst opretter jeg en global funktion runPwdTest, som måler styrken på et adgangskode-felt, hver gang den kaldes. Det første der sker er at jeg henter selve tekststregnen brugeren har skrevet ind i input-feltet med idet pwd-input. Jeg opretter så en let score, hvor jeg starter et pointtal baseret på længden af adgangskoden. 10 point pr tegn, men maksimalt 60. Derefter tjekker jeg vha. af regex udtryk om adgangskoden indeholder store bogstaver, små bogstaver, tal og specialtegn. Hver gang der er et af disse, så tilføjer jeg 10 point til scoren. Til sidst sikrer jeg at scoren ikke overstiger 100, og jeg opdaterer styrke-baren og feedback-teksten baseret på scoren. Jeg henter så pwd-bar og pwd-feedback elementerne, og opdaterer deres indhold baseret på scoren. Ved let maskWidth = 100 - score, beregner jeg hvor meget af baren der skal dækkes. If (maskWidth <= 0) maskWidth = 0;, her beskytter jeg mod negative værdier, så baren ikke bliver negativ. pwdBar.style.width = maskWidth + '%';, her ændrer vi bredden på baren dynamisk, så den afspejler styrken. Vi er nødt til at matche pwdBar med mask for at få det til at virke. SQL Injection opsætning Til sidst opdaterer jeg feedback-teksten baseret på scoren. Jeg bruger en række if-sætninger til at bestemme, om adgangskoden er svag, middel eller stærk. if (score < 40) - Her tjekker jeg om scoren er under 30, så er adgangskoden svag. else if (score < 70) - Her tjekker jeg om scoren er under 70, så er adgangskoden middel. else - Hvis scoren er 70 eller højere, er adgangskoden stærk. For at afslutte funktionen her, har jeg en EventListener, der pwdInput, så funktionen kører automatisk hver gang brugeren skriver eller sletter et tegn. Her er slutresultatet af min adgangskode styrke test. Adgangskode styrke test

Udarbejdet webudviklingsnotater

Klik for at åbne ⭣

Generelle noter om webudvikling.

Maj 2025 - 8. Sprint

I udarbejdelsen af min portfølge og andre webudviklingsrelaterede projekter, har jeg samlet en række noter. Disse noter dækker HTML, CSS, JavaScript og lidt itsikkerheds begræber. Jeg har delt det op i termer, forklaring og så eksempler der så vidt muligt er ud fra min portfølje. Jeg har valgt at oprette dem som tabeller, men for en god ordensskyld er de også vedhæftet som billeder i bunden af stykket her.

JavaScript - Terminologi og forklaringer


Term Forklaring Kode eksempel
addEventListener() Knytter en event-listener til et DOM-element når en bestemt hændelse opstår. “Når det her sker, på det her element, så kør denne funktion”. btn.addEventListener(‘click’, fn);
Arrow function () => {} Kort syntax for en funktion. Hurtig måde at skrive en funktion, uden “function”. const sum = (a, b) => a + b;
async / await Gør asynkrone Promises lettere at læse som synkron kode. “Vent lige” i koden, indtil resultatet er klar. const data = await fetch (‘/api’).then(r => r.json());
class Skabelon til objekter; syntaktisk sukker over prototype-arv. Opskrift til at lave mange ens objekter. class Car { start() {...} }
console.log() Skriver debugging-info til konsollen. console.log(user);
const / let / var Deklarerer variabler. Gemmer værdier i hukommelsen - const kan ikke gen-tildeles, let kan. let count = 0; const btn = document.getElementById(button)
document.querySelector(All) Finder første/alle matchende elementer via CSS-selector. Giv mig det/de element(er) der matcher denne selector. const nav = document.querySelector(‘nav’);
DOMContentLoaded Event der fyres når HTML er parset, før billeder osv. DOM skal være klar før manipulation. document.addEventListener(‘DOMContentLoaded’, init);
event.preventDefault() Stopper elementets standard handling. Forhindrer normal adfærd. form.addEventListener(‘submit’, e => e.preventDefault());
Fetch API fetch () HTTP-kald der returnerer en Promise med Response. Henter data fra en server. const json = await fetch(‘/users’).then(r => r.json());
for...of / for...in Løkker. for...of: Gå gennem hvert element. for...in: gå gennem hver egenskab. for (const el of arr) {...}
JSON.parse()/stringify() Konverterer mellem objekter og tekst. Oversætter JavaScript-objekter til tekst. Så de kan gemmes eller sendes. localStorage.setItem(‘u’, JSON.stringify(user));
localStorage / sessionStorage Nøgle-værdi-lager i browseren. Gem små stykker data i browseren så de huskes næste gang. localStorage.setItem(‘theme’, ‘dark’);
map()/filter()/reduce() Array-metoder. Map: lav alle elementer om. Filter: fjern dem der ikke matcher. Reduce: opsumer til en værdi. const names = users.map(u => u.name);
Modules import / export Opdeler kode i filer med klare afhængigheder. Gør det umuligt at importere funktioner fra andre filer der ikke bliver importeret. import { login } from ‘./auth.js2’;
this Refererer til den aktuelle kontekst. Det objekt funktionen hører til lige nu. btn.onclick = function () { console.log(this); };
setTimeout() Kører en funktion en gang efter en forsinkelse. Vent X millisekunder (1000), gør så dette. setTimeout(closeModal, 2000);
setInterval() Gentager en funktion hver X millisekunder (1000). Gør dette igen og igen med et fast interval. setInterval(tick, 1000);
try...catch Fanger fejl i kode og håndterer dem. Prøv dette, hvis det fejler, så gør noget andet i stedet for at crashe. try { risky() } catch (e) { alert(e) }
document.getElementById() / document.getElementByClass() Henter id / klasse elementet fra din index.html fil, så den kan bruges i din script.js fil. const clickBtn = document.getElementById(‘button’)

CSS - Terminologi og forklaringer


Term Forklaring Kode eksempel
position: fixed/relative/absolute Bruges til at placere elementer fast, relativt eller frit på siden. Relative beholder plads i dokument-flow’et. Absolute flyttter ud af flow’et og måler fra nærmest positionerede forælder. Fixed måler fra viewport og følger ikke med, når siden scrolles. nav {position: fixed, top: 0; left: 0; width: 100%;}
top, left, right, bottom Bruges sammen med position til at angive præcis placering / forskyde elementet .arrow {right: -5rem; bottom: 2.5rem;}
margin, padding Margin er luft udenfor elementet, padding er luft inden i. .btn {margin: 1rem; padding: 1rem; }
box-sizing: border-box Gør at width/height inkluderer både padding og border, så elementet ikke “vokser” uventet. ::before, ::after {box-sizing: border-box}
display: flex / grid / block / inline / inline-block Vælger layout-model: flex (en dimension), grid (Opdeling, 2 dimensioner), block (Bloks under hinanden), Inline (Efter hinanden), Inline-block (Efter hinanden, blok format) .menu-links { display: flex;}
flex-direction, flex-wrap: wrap, justify-content, align-items, gap Styrer rækkefølge, om indhold må bryde linjen, hoved-/tvær-aksernes justering og den indbyrdes afstand i en flex container. nav-links {display: flex; gap: 2rem; flex-wrap: wrap;justify-content: center; }
grid-template-columns Definerer kolonne strukturen i et CSS-grid (antal og størrelse) .product-grid {display: grid; grid-template-columns: repeat(3,1fr);}
width, height, min-/max-height Sætter faste eller begrænsede dimensioner; min-max/-* forhindrer, at elementet bliver mindre/større end grænsen. .logo {max-width: 200px; }
overflow-x, overflow Bestemmer, hvad der sker, når indholdet er større end elementets boks - f.eks. scroll, skjul eller vise. body {overflow-x: hidden; }
z-index Angiver stablings-rækkefølgen for positionerede elementer; højere tal lægger sig “forrest”. #desktop-nav {z-index: 1000M}
background, background-color, background-position / size Lægger farve/billede bag elementet, justerer billedets udgangspunkt og skalering. body{background: #fafafa }
color Farve på tekst. a:hover {color: #666;}
border, border-radius Tegner kant omkring elementet; radius runder hjørnerne. .card {border: 1px solid #ddd;border-radius: 2rem; }
box-shadow Tilføjer skygge for dybde-effekt; parametre = x-offset, y-offset, blur, spread, farve. .card {box-shadow:0 4px 6px rgba(0,0,0,.1);}
font-family, font-size, font-weight, line-height Styrer skrifttype, skriftstørrelse, vægt (tykkelse) og lodret afstand mellem tekstlinjer. body {font-family: “Poppins”, sans-serif; font-size: 1rem; line-height: 1.5;}
text-align, text-decoration Horisontal justering af inline-indhold + pynt som understregning. h2{text-align: center;text-decoration: underline; }
cursor: pointer / default / not-allowed Ændrer muse-markøren, fx til hånd-ikon når noget er klikbart (pointer), default eller slet ikke tilladt. button{cursor: pointer;}
transition Giver en glidende animation mellem to værdier. .btn {transition: background 200ms ease; }
transform: translateY(...) / scale(...) / rotate(...) Manipulerer elementets koordinatsystem (flyt, skaler, drej ) uden at påvirke dokument-flow’et. .logo:hover{transform: scale(1.05) rotate (-2deg);}
opacity Gør elementet gennemsigtigt 0 - 1 (0 - 100% vist) .disabled{opacity: .5; }
animation, @keyframes Fuld tidslinje-styret animation, keyframes beskriver mellem-stadier, animation binder den til elementet. @keyframes pulse {0%{transform:scale(1);} 50%{transform:scale(1.1);} 100%{transform:scale(1);} .cta{animation:pulse 1.5s infinite;}}
@media (max-width: ...) Bryder til alternative regler, når viewport-bredden er lig med eller mindre end et bestemt bredde. Bruges til mobilvisning. @media (max-width: 768px){.nav-links{flex-direction: column; }}
object-fit, object-position Bestemmer, hvordan img/video skal udfylde sin boks, og hvilken del af motivet der skal centreres. .about-pic {object-fit: cover; object-position: center top;}
scroll-behavior: smooth Giver blød rulning til interne ankre (sektioner) html {scroll-behavior: smooth;}

HTML - Terminologi og forklaringer


Term Forklaring Kode eksempel
nav Navigationsbar. Primær navigation. (Links, menuer, logoer søgebar) nav id="desktop-nav" class="nav-links"> a href="#home">Hjem a href="#about">Om
header/footer Hoved- og bund-sektion, kan være overordnet info, logoer, kontakt, politikker osv. footer

© 2025 Min Portefølje

/footer
section Afsnit af siden, hjælper med opdeling af siden. Hjælper skærmlæsere (Softwareprogram, der hjælper blinde og svagsynede med at læse tekst) section id ="about"
div Et div-tag er til at definere et stykke eller en form for sektion i et HTML dokument. Det bruges til at gruppere indhold og anvende CSS-styling eller JavaScript-funktionalitet på det. div class ="wrapper" /div
ul/ol/li Liste elementer. Unordered-list, Ordered liste eller bare en liste. ul li item1
a href = "..." A tag består af en href, som er et link til en side, anker eller en fil. a href ="#contact">Kontakt< a
img src="..." alt="..." Bruges til at indsætte et billede. Angiv at det er et billede med src, som er linket til billedet. Alt er en beskrivelse af billedet, til tekstalternativer for SEO/tilgængelighed. img src="selvportræt.png" alt="Profilbillede"
button Button definere en knap, som er et interaktivt kontrol-element. Det kan udløse en JavaScript metode eller en formular submit button class="btnClose">Luk<
input type ="text/password/email Input definere et input-felt, som kan være tekst, password eller email. Det bruges til at indsamle data fra brugeren. input type ="email" id="signupEmail"
label for="..." Klikbart navn, der forbinder sig til et input felt. label for="signupPwd">Adgangskode<
Globale attributter: Class, id, style Id bruges til at identificere et unikt element på siden, class bruges til at gruppere elementer og style bruges til at tilføje inline CSS-styling. div id="button" class="closeButton"
href, src, alt, type, placeholder, disabled, aria-* Disse er alle attributter, der bruges til at definere elementer. href er linket til en side, src er linket til et billede, alt er en beskrivelse af billedet, type er typen af input-feltet, placeholder er en tekst der vises i input-feltet, disabled gør et element inaktivt og aria-* bruges til at forbedre tilgængeligheden for skærmlæsere. a href="https://example.com" target="_blank">Link til eksempel<. img src="billede.jpg" alt="Beskrivelse af billede". input type="text" placeholder="Indtast tekst her" disabled. input type="email" aria-label="Email adresse".
script type="module" src="..." Script tag bruges til at inkludere JavaScript på siden. Type="module" angiver, at det er et modul, og src er linket til JavaScript-filen. script type="module" src="script.js"<
code Code tag bruges til at vise kode på siden. Det er en semantisk måde at vise kode på, og det hjælper med at formatere koden korrekt. >console.log('Hello World');
html lang="da" HTML tag bruges til at definere et HTML-dokument. Lang attributten angiver sproget for dokumentet, i dette tilfælde dansk. html lang="da"
link Link tag bruges til at inkludere eksterne ressourcer som CSS-filer. Det hjælper med at adskille stil og indhold. link rel="stylesheet" href="styles.css"
small Small tag bruges til at vise mindre tekst, som f.eks. copyright eller fodnoter. Det hjælper med at adskille mindre vigtig information fra hovedindholdet. small © 2025 Min Portefølje< /small
Span Span tag bruges til at gruppere inline-elementer og anvende CSS-styling på dem. Det er en semantisk måde at gruppere elementer på, uden at ændre deres layout. span class="highlight">Dette er fremhævet tekst
Table Tables bruges til at oprette tabeller i HTML. Med et td(table data cell) og tr(table row), laver jeg simple tabeller som denne.

IT-Sikkerhed - Terminologi og forklaringer


Term Forklaring Kode eksempel
Hashing med Argon2 En ensrettet funktion til at gemme adgangskoder sikker. Argon2 beskytter mod brute-force bl.a. await argon2.hash(password, opts);
JWT (JSON Web Token) Token der indeholder brugerinfo og bruges til session-håndtering uden server-side sessions. Underskrives med hemmelig nøgle. jwt.sign({ uid }, secret, { expiresIn: ‘15m’ });
CSRF-beskyttelse Stopper angribere fra at udnytte brugerens aktive session til at sende skadelige forespørgsler. app.use(csurf({ cookie: cookieCfg })); res.json({ csrfToken : req.csrfToken () } );
Rate Limiting Begrænser antallet af forespørgsler fra en IP for at beskytte mod brute-force. max: 20, windowMs: 15 * 60 * 1000
Brute-force forsvar / lockout Midlertidig kontolås ved for mange forkerte loginforsøg. if (fails >= 5) lock = dayjs().add(15, ‘minute’)
Refresh-token hashing Refresh-tokens hashes i databasen for at beskytte mod token stjæling. crypto.createHash(‘sha256’).update(token).digest(‘hex’);
HTTPOnly cookie Forhindrer JavaScript i at få adgang til cookies og dermed reducerer XSS-risiko. res.cookie(‘refresh’, token, { httpOnly: true })
Secure / SamSite cookies secure kræver HTTPS. SameSite beskytter mod CSRF ved at begrænse cross-site requests. samSite: ‘lax’, secure: true
Helmet (sikkerhedsheaders) Tilføjer headers som HSTS, CSP, X-Frame-Options for at beskytte mod XSS, clickjacking m. m. app.use(helmet());
Content Security Policy (CSP) Kun scripts fra godkendte kilder må køres - begrænser XSS. scriptSrc: [“’self’”]
SQL Injection En angrebsteknik hvor angriberen injicerer SQL i inputfelter. Beskyttes mod med prepared statements. db.prepare(“SELECT * FROM users WHERE id = ?”).get(id);
XSS (Cross-Site Scripting) Når angriberen injicerer skadelig JavaScript i DOM’en. Sanitering forhindrer dette. out.textContent = input.replace(/
TryHackMe (forløbet) En platform hvor jeg lærer om XSS, SQLi, brute-force, netværk og forsvar. Windows Fundamentals, Linux Basics osv. Læringsmæssigt baggrundsarbejde
Base64 hashing (min demo) Bruges til at illustrere koncepter i din frontend-demo, f.eks. hvordan simple hash kan manipuleres. btoa(‘hemmelig’);
Sanitering af input (mod XSS) Uskadeliggør skadelige tegn som < og > i inputfelter. input.replace(//g, ‘>’)
Token rotation Refresh-token ændres og verificeres server-side ved hver login eller fornyelse refresh_hash valideres og overskrives i databasen
HSTS Tvinger browseren til kun at kommunikere over HTTPS. app.use(helmet.hsts());
Password salting En tilfældig streng tilføjes til brugerens kodeord før hashing for at undgå rainbow table-angreb. Argon2 bruger automatisk saltning.
Timing attack En angriber måler svartid for at afsløre korrekt input (fx passwords) Argon2 beskytter mod dette.
Token hijacking Når en angriber stjæler en gyldig token, fx via XSS. Modvirker det med httpOnly cookies og short JWT-levetid.
Session fixation En angriber tvinger brugeren til at bruge en kendt session-id. Refresh-token rotation beskytter mod dette.
CSP CSP kan også kontrollere hvor objekter/iframes må loades fra. Bruger basic CSP hos mig.
Clickjacking Brugeren narrer til at klikke på noget andet via iframe/lag helmet.framequard({ action: ‘deny’ })
Open Redirect Bruges i phishing - redirect uden kontrol over destination Ikke i mit projekt.
IDOR (Insecure Direct Object Reference) Når bruger direkte får adgang til fx andres data via ID i URL. Sårbarhed, bliver beskyttet med token-validering.

htmlNotes htmlNotes htmlNotes htmlNotes

Min portfølje

Klik for at åbne ⭣

Indblik i den HTML, CSS og JavaScript der ligger bag min portfølje.

1 - 8 sprint.

Jeg har sammenlagt flere tusinde linjer af kode fordelt ud mellem HTML, CSS og JavaScript. For at at skabe det bedste overblik over baggrunden for min portfølje, deler jeg det op i sektioner, ligesom jeg har gjort i min portfølge. Det første vi gør er at fortælle browseren at bi bruger HTML5-standard og det gør vi ved at definere DOCTYPE html, derefter sætter vi sproget til dansk, som hjælper både skærmlæsere og søgemaskiner. Inde i vores head krop, tilføjer vi alt metadata'en. Først fastlægger vi tegnsættet til Unicode. Efter gør vi layoutet responsivt på mobiler med meta name="viewport". Jeg tilføjer så titlen til min browserfane og til søgeresultater ved at angive title Jeppe Falk Leth. For at jeg kan benytte min css/styling skal jeg have fortalt hvilke filer jeg kan tage CSS'en fra. Det gør jeg ved at angive med et link rel="stylesheet" både min style.css og mine mediaqueries.css. Style.css er til generel styling, mediaqueries er for at lave responsivt mobildesign. link rel viser mit ikon der viser sig oppe ved siden af min titel. Meget af det her kommer som standard ved at skrive kommandoen "!", så skal det ellers bare tilpasses til din side derfra. Header png Vi rykker videre til min navigation. Jeg tilføjer et logo, som egentlig bare er en streng jeg efterfølgende har stylet. Selve navigationen består af 6 "faner", samt en dropdown til mit profilikon. Jeg opretter en unordered liste = ul, og angiver de enkelt liste items inde i. Hver af de her li items, har et a tag, med en href til henholdsvis den sektion jeg ønsker skal vises ved klik på det menupunkt jeg har angivet. I min dropdown bruger jeg et ikon som den knap der skal trykkes på. I stedet for at navigere på siden, bliver der åbnet en dropdown menu. Dropdown menuen viser som udgangspunkt Log ind, Opret profil og Indstililnger. Hver af de her links, åbner hver deres modal, som enten repræsentere en login form eller en opret konto form. Log ud tagget har jeg angivet klassen hidden. Log ud skal nemlig kun være tilgængelighed når man rent faktisk er logget ud. Det berører jeg i produkter (Log ind/Opret konto modal). Nav 1 billede Jeg har til min side oprettet en hamburger-menu, hvilket er menuen med de 3 streger under hinanden. Hamburger menuen er til mobilversion, for at skabe en mere overskuelig menu. Hertil har jeg oprettet en onClick funktion der hedder ToggleMenu, som bliver kaldt i det jeg klikker på menuen. Nav 2 billede Funktionen toggleMenu bindes til window, så den kan kaldes direkte fra onclick-attributter i HTML. Den finder de to elementer og toggler klassen open. Nav 6 billede Når ToggleMenu() er blevet kaldt, kører funktionen. CSS'en viser hvordan jeg har stylet .menu-links. Jeg har tildelt den en transform: scaleY(0), og lige så snart klassen open bliver tilføjet, sætter jeg scaleY(1), det giver effekten af menuen har åbnet sig. Knapperne virker her, ligesom de ville gøre på computeren. Nav 7 billede
Her ses det i praksis hvordan det ser ud på mobilversion. Hamburger-menu gif

Produkter jeg ikke nåede at sætte ord på.

Nav 5 billede Nav 4 billede Nav 3 billede Nav gif

Log ind/Opret konto modal

Klik for at åbne ⭣

Indblik i min log ind / opret konto modal (Ikke færdig)

1 - 8 sprint.

Jeg har forsøgt at oprettet en log ind og en opret konto modal. Det har dog været et meget stort projekt og jeg er desværre ikke noget helt i mål med hvad jeg gerne har ville. Grunden til jeg har forsøgt at oprette min egen for at skabe fokus på sikkerheden ved kontooprettelser og sider hvor man skal logge ind. Jeg gennemgår i dette skriv nogle af de tanker jeg har gjort mig og de ting jeg gerne ville ha nået mere. Selve nav-linksne og de to modaler har jeg kort gennemgået under "Min portfølje"-produkt sektion. Men her er koden bag dem. Det første jeg gør at gemme referencen til alle de knapper og overlays jeg skal bruge. Det gør jeg ved at gemme referencen til knappen der skal åbne login-modalen med document.getElementById('btnOpenLogin'), og ligeledes signup knappen med (btnOpenSignup). Dernæst de to "luk"-knapper (btnCloseLogin og btnCloseSignup). Til sidst henter jeg selve overlay-elementerne, de modaler der bliver givet til udtryk ved min bagvedliggende CSS, for at style det for brugeren. Jeg definere så to hjælpe funktioner til at vise og skjule en model. openModal(el) fjerner klassen hidden fra elementet og sætter document.body.style.overflow = 'hidden', så resten af siden ikke kan rulle mens modalen er åben. De er sat som værende hidden da de skal være skjult indtil brugeren kalder dem, på den måde viser de sig som om de kommer frem ved klik. closeModal(el) gør præcis det modsatte: tilføjer hidden og nulstiller overflow. Når brugeren klikker på enten “Log ind”- eller “Opret bruger”-linket, kører jeg en preventDefault() (prevenDefault er til for at sige, "du skal ikke gøre det du plejer at gøre i den givende situiation") og kalder openModal() med det ønskede overlay overlay. Klikker man på krydset inde i modalboksen, kalder jeg closeModal() på samme overlay Jeg smider begge overlay-referencer i et lille array og looper over det. For hvert overlay lytter jeg efter et klik. Hvis selve target for klikket er overlayet, så lukker jeg. Det er det samme som at sige, hvis der er klik ved siden af overlayet, så luk modal.

Modal 1

Inde i signup-modalen henter jeg “Opret konto”-knappen (btnSignup) og binder en asynkron click-handler på den. Den asynkrone click-handler skal vi bruge da vi venter på serverens svar, så uden at blokere resten af siden kalder vi derfor en async click-handler. Når brugeren klikker, læser jeg e-mailfeltet samt de to kodeordsfelter og trimmer e-mailen. At trimme en email betyder at fjerne whitespace, hvis der kommer utilsigtede mellemrum, ville det blive læste uden et trim. Hvis koderne ikke matcher, eller er kortere end 8 tegn, får brugeren en alert() og funktionen returnerer tidligt. Hvis valideringen består, kalder jeg apiFetch('/signup', ...), som sender et AJAX-kald(Asynchronous JavaScript and XML ) til serveren med e-mail og adgangskode. Min apiFetch-funktion tilføjer automatisk en CSRF-header for sikkerhed. Hvis serveren svarer med en fejl, vises den med alert(). Går alt godt, logger jeg brugeren ind, lukker signup-modalen og opdaterer brugerfladen med updateMenuUI().

Modal 1

Ved klik på “Log ind”-knappen læser jeg e-mail og adgangskode, og trimmer e-mailen for at fjerne utilsigtede mellemrum. Hvis et af felterne er tomme, vises en fejlbesked. Ellers forsøger jeg at logge brugeren ind med login(email, pwd), som også henter og gemmer en token. Ved succes lukkes login-modalen, og brugerfladen opdateres med updateMenuUI().

Modal 1

Når brugeren klikker på “Log ud”-knappen, kalder jeg preventDefault() og den asynkrone logout()-funktion, som afbryder sessionen. Uanset om log ud lykkes eller fejler, opdateres brugerfladen med updateMenuUI() for at afspejle, at brugeren nu er logget ud.

Modal 1

Funktionen updateMenuUI() styrer synligheden af login-, signup- og logout-knapperne baseret på, om brugeren er logget ind. Jeg bruger isLoggedIn() til at afgøre, om der findes en aktiv session, og toggler derefter klassen hidden på de tre knapper. Hvis brugeren er logget ind, skjules “Log ind” og “Opret konto”, mens “Log ud” vises. Hvis brugeren ikke er logget ind, skjules “Log ud”, mens “Log ind” og “Opret konto” vises. Denne funktion bliver kaldt både efter login og logout, samt én gang ved indlæsning af siden, så UI’et altid viser den aktuelle loginstatus korrekt.

Modal 1

Ved login sender jeg en POST-request med e-mail og adgangskode til /login via apiFetch. Hvis serveren svarer med en fejl, kommer der en fejlmeddelelse. Ved succes henter jeg et JWT access-token fra svaret og gemmer det i sessionStorage, så brugeren forbliver logget ind i sessionen. Logout-funktionen sender en POST-request til /logout og fjerner access-token både fra hukommelsen og sessionStorage. Til at tjekke om brugeren er logget ind, bruger jeg isLoggedIn(), som returnerer true, hvis et token er tilgængeligt, som nævnt tidligere.

Modal 1

Produkter jeg mangler at sætte ord på

Klik for at åbne ⭣

Indblik i de produkter jeg ikke nåede at sætte ord på. Samling af screenshots af mine koder.

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Webudvikling & IT-sikkerhed

Video

Ressourcer og referencer

Kildeliste

Cyber Security 101

TryHackMe gør det nemt og brugervenligt at få inblik og forståelse af IT-Sikkerhed. Man får en masse hands-on erfaring igennem interaktive kurser.
Søgeord: Learn cyber security, Lær IT-sikkerhed, TryHackMe.

Rating:
★★★★★
JavaScript Interaktiv learner

Kilden her tager dig med igennem et interaktiv JavaScript kurser. Man får lov til at arbejde med projekter uden at man får svarene serveret. Det giver tid til at tænke frem til løsningen selv. Det lærer jeg personligt bedst af.
Søgeord: Learn JavaScript, Scrimba, (Anbefalet af studerende).

Rating:
★★★★☆
React Interaktiv Learner

Kilden her tager dig med igennem et interaktiv React kursus. Man får lov til at arbejde med projekter uden at man får svarene serveret. Det giver tid til at tænke frem til løsningen selv. -||-
Søgeord: Learn React, Scrimba, (Anbefalet af studerende).

Rating:
★★★★☆
W3Schools JavaScript gennemgang.

W3schools giver den bredeste gennemgang af hvert enkelte emne. Jeg har selv brugt den til JavaScript, men alt er at finde. Fordelen ved w3schools er at gennemgår du hele listen, så er du rigtigt godt på vej. Men det er meget bredt.
Søgeord: W3schools JavaScript, JavaScript.

Rating:
★★★★★
Best Pentesting Search Engines

Kilden her brugte jeg i forbindelse med TryHackMe's kursus. Det var en del af starten på kurset. Videoen giver et godt indblik i de bedste pentesting søge maskiner.
Søgeord: (Linket er fundet igennem TryHackMes kursus.)

Rating:
★★★★☆
Responsive Portfolio Website From Scratch

Kilden her brugte jeg i forbindelse med at lave min portfølje. Det var en del af starten på semesteret og den video, der satte mig ind i det hele. Videoen giver et godt indblik i hvordan htlm, css og Javascript virker sammen. Han viser HTML strukturen, CSS styling og JavaScript funktionalitet.
Søgeord: "build portfolio website html css javascript".

Rating:
★★★★★
Security Report Summary

Kilden her brugte jeg i forbindelse med en sikkerhedstest på min portfølje. Man indsætter et link og siden laver en sårbarhedsanalyse og udskriver referatet til brugeren af siden. Det gav mig mulighed for at tjekke op og rette headers, så jeg sikrer min side mode ondsindet angreb.
Søgeord: security headers, http response headers, check headers, scan headers.

Rating:
★★★★★
Password Storage Cheat Sheet

Kilden her brugte jeg i forbindelse med at hashe passwords for brugere der loggede ind med min side. Jeg fandt frem til at Argon2 havde det bedste forudsætninger for en stærkt hashing-algoritme og derfor brugte jeg den.
Søgeord: OWASP, Cheat Sheet.

Rating:
★★★★★
bcrypt, scrypt, and Argon2: Choosing the Right Password Hashing Algorithm

Lidt undersøgelse for at finde frem til den bedste hashing-algoritme.
Søgeord: hashing, password hashing.

Rating:
★★★★★
Blocking Brute Force Attacks

I forbindelse med itsikkerhed, blev der undersøgt flere forskellige angreb. Blandt andet Brute Force Attacks. Dette er et skriv på hvordan man blockere disse angreb.
Søgeord: Blocking Brute Force Attacks.

Rating:
★★★★★
Blocking Brute Force Attacks

Prioriterede liste over de mest kritiske web-app risiko­er. Første halvår 2025
Søgeord: OWASP top 10.

Rating:
★★★★☆
SSL Server Test

Prioriterede liste over de mest kritiske web-app risiko­er. Første halvår 2025
Søgeord: ssl, ssl test, ssl check, certificate, ssl server test.

Rating:
★★★★☆
Cross Site Scripting (XSS)

Brugt i forbindelse med XSS test.
Søgeord: Owasp, xss test.

Rating:
★★★★☆
JavaScript Validation API

Brugt i forbindelse med Validation API
Søgeord: Javascript validation api.

Rating:
★★★★☆
JavaScript HTML DOM EventListener

Brugt i forbindelse med udarbejdelse af mine eventListeners.
Søgeord: JavaScript eventListeners

Rating:
★★★★★
Validation in Web Development: Ensuring Data Accuracy and Security

Et lille skriv for at sætte ord på validering i web development. Forholder mig dog en anelse kildekritisk, der der ingen kilder er linket og brugeren kun har 27 følgere.
Søgeord: Kan ikke huske søgeord.

Rating:
★★☆☆☆
Top 10 Cyber Security Principles

Et skriv på cyber security pincipper, for at få indblik i hvad der er vigigt i forhold til at aegere på nettet.
Søgeord: Cyber security principper.

Rating:
★★★★☆
What are the 5 basic security principles?

Endnu et skriv på hvad man skal lægge mærke til inden for basic cyber security.
Søgeord: Cyber security principper.

Rating:
★★★★☆
Chrome Dev Tools 101: A Beginner's Guide to Using Dev Tools

Youtube video der omhandler brugen af DevTools. Ganske fin video der hjælper en godt igennem browser devtools.
Søgeord:

Rating:
★★★★☆
Software Framework vs Library

Et skriv på Software Framework vs Library. For at skabe en ide af hvad der er hvad.
Søgeord: Framework vs Library.

Rating:
★★★★☆
Why is HTTP not secure? | HTTP vs. HTTPS

Et skriv på forskellen af HTTP og HTTPS. Brugt i forbindelse med header sikkerhed.
Søgeord:

Rating:
★★★★★
A Gentle Guide to Modular Software Design

En linkedIn guide til Modular Software Design
Søgeord:

Rating:
★★★★☆
Content Security Policy Reference

Et skriv på hvordan en CSP (Content Security Policy) HTTP response header hjælper med at reducere XSS sårbarheder.

Rating:
★★★★☆

Kontakt mig

×