Cyber Security 1
"GratisWork opzet",in maar moet nog veel aan veranderen.Progress
1 Wat is Cyber Security?
๐ฏ Leerdoelen
- Je weet wat Cyber Security is en waarom het belangrijk is.
- Je kent verschillende soorten cyberaanvallen.
- Je kunt voorbeelden noemen van echte incidenten en uitleggen wat er fout ging.
๐ก Uitleg
Cyber Security betekent simpel gezegd: het beschermen van computersystemen tegen aanvallen of misbruik. Denk hierbij aan het veilig houden van je website, je wachtwoorden, je e-mails en alle andere digitale gegevens.
Als je een website of app bouwt, ben je automatisch verantwoordelijk voor de veiligheid van de gegevens van je gebruikers. Hackers proberen vaak in te breken via bekende zwakke plekken, zoals slechte wachtwoorden of fouten in je code.
Voorbeelden van cyberaanvallen:
- Phishing: iemand probeert jou te misleiden om je wachtwoord af te geven (bv. via een nep-mail van je bank)
- Malware: schadelijke software zoals een virus, ransomware of spyware
- Virus: speciaal soort malware dat zichzelf kan vermenigvuldigen (net als het Corona virus).
- DDoS-aanval: een server wordt overspoeld met aanvragen en raakt onbereikbaar
- SQL-injection: via een formulier wordt je database gehackt
- Man-in-the-middle: iemand onderschept je gegevens tussen jou en een website
๐ Je gaat in deze module zien hoe aanvallen werken รฉn hoe je jezelf (en jouw code) daartegen kunt beschermen.
Cyberaanvallen maken gebruik van kwaadaardige software.
๐ ๏ธOpdracht 1, kwaadaardige software
Hierboven staat een lijst van 6 soorten cyberaanvallen. Welke van deze maakt niet per sรฉ gebruik van kwaadaardige software?
Zoek informatie op internet en leg uit!
Geef minimaal รฉรฉn bron goede bronvermelding.
๐ ๏ธOpdracht 2, risico
Hierboven zijn 6 voorbeelden van cyberaanvallen beschreven. Zoek zelf op wat de volgende soorten cyberaanvallen betekenen:
- Ransomware
- Trojan
- Spyware
- Adware
- Keylogger
Zet deze 6 soorten op volgorde van gevaarlijkheid (volgens jou) en leg bij elk type uit waarom je het op die plek zet.
Geef je bronvermelding.
๐ ๏ธ Opdracht 3, Incident analyseren
- Zoek online naar een bekend cyber security-incident (bijv. een datalek, hack, ransomware-aanval of lek bij een grote organisatie).
- Schrijf in je eigen woorden:
- Wat er is gebeurd
- Wat het gevolg was
- Wat ze beter hadden kunnen doen
- Geef je bronvermelding.
๐ง Opdracht 4, Reflectie
- Waarom denk jij dat veel mensen niet nadenken over digitale veiligheid?
- Wat is iets waar jij op gaat letten sinds je deze les hebt gevolgd?
๐ค Inleveren
- Beschrijf alle het antwoord op alle 4 de opdrachten. Neem de vraag over en weer de vraag daarna uit.
Werk netjes en lever een PDF in.
2 HTTPS en netwerkveiligheid
๐ฏ Leerdoelen
- Je begrijpt het verschil tussen HTTP en HTTPS.
- Je weet waarom SSL-certificaten belangrijk zijn voor beveiligde communicatie.
- Je kunt een eigen website beveiligen met HTTPS.
๐ก Uitleg
Wat is het verschil tussen HTTP en HTTPS?
HTTP betekent dat gegevens onversleuteld worden verzonden. Iedereen die tussen jou en de server in zit (zoals hackers op een openbaar netwerk), kan meekijken.
HTTPS (de S staat voor Secure) gebruikt een SSL-certificaat om alle communicatie tussen jouw browser en de server te versleutelen.
Waarom is HTTPS belangrijk?
- Het voorkomt dat anderen je gegevens kunnen onderscheppen.
- Het zorgt voor vertrouwen bij je bezoekers (slotje in adresbalk).
- Google straft HTTP-sites af in zoekresultaten (door niet op een goede positie te zetten)
Wat is een SSL-certificaat?
Een SSL-certificaat is een soort digitaal paspoort voor je website. Het zorgt ervoor dat bezoekers zeker weten dat ze verbinding hebben met jรณuw site, en dat de data versleuteld is.
๐ Waarvoor biedt HTTPS wรฉl bescherming?
HTTPS zorgt ervoor dat de verbinding tussen jouw computer en een website veilig is. Dat betekent:
-
Niemand kan meekijken met wat jij invult of leest (zoals je wachtwoord of bankgegevens).
-
Niemand kan de informatie veranderen terwijl die onderweg is.
-
Je weet zeker dat je met de echte website praat (en niet met een nepserver), als het certificaat klopt.
Denkbij https aan een afgesloten envelop in plaats van een open briefkaart: anderen kunnen het bericht niet lezen of aanpassen.
โ Waarvoor biedt HTTPS gรฉรฉn bescherming?
HTTPS voorkomt niet alles. Het beschermt je niet tegen:
-
Nepwebsites met een slotje โ criminelen kunnen ook een HTTPS-site maken die er echt uitziet.
-
Phishing โ als je op een valse link klikt en je wachtwoord daar invult, ben je nog steeds de klos.
-
Virussen of malware โ als je iets downloadt, controleert HTTPS niet of het veilig is.
-
Slechte wachtwoorden โ HTTPS helpt niet als jij zelf een zwak of gestolen wachtwoord gebruikt.
๐ง Reflectie
- Waarom is HTTPS extra belangrijk op loginpaginaโs? Leg uit wat het risico is.
- Wat zou er kunnen gebeuren als je een onbeveiligde (HTTP) verbinding gebruikt in een openbaar WiFI netwerk? Leg uit wat het risico is.
- Je gaat naar www.nu.nl (voor het nieuws) en stel dat je geen slotje ziet en er dus geen SSL verbinding is gemaakt. Wat kan er mis gaan? Wat is het risico?
- Je meldt je aan voor een sport evenement op een onbeveiligde (HTTP) site. Leg uit wat het risico is.
- Je hebt een website op je laptop draaien en een medestudent bezoekt deze website vir een onbeveiligde (HTTP) verbinding. Leg uit wat het risico is.
- Zet alle risico's (nummer 1 t/m 5) op volgorde van gevaarlijkheid. Motiveer je antwoord.
De refelctie is een verslag in je eigen woorden, AI input wordt niet geaccepteerd!
Deze vragen komen terug in de kennis-check!
๐ค Inleveren
- Lever je reflectie in als een .pdf
3 Encryptie
๐ฏ Leerdoelen
- Je weet wat encryptie betekent en waarvoor ze gebruikt worden.
- Je kunt een eenvoudige versleuteling (Caesar cipher) herkennen en kraken.
- Je weet het verschil tussen symmetrische en asymmetrische encryptie.
๐ก Uitleg
Wat is encryptie?
Encryptie (versleuteling) betekent dat je gegevens onleesbaar maakt voor anderen. Alleen iemand met de juiste โsleutelโ kan de gegevens weer ontcijferen.
- Symmetrisch: dezelfde sleutel voor versleutelen en ontsleutelen (bijv. Caesar cipher).
- Asymmetrisch: verschillende sleutels voor versleutelen en ontsleutelen (zoals bij HTTPS).
๐ Verdieping over symeterische en asymetrische encryptie
Leg uit, hoe werkt dat asymentrisch precies?
Stel iedereen heeft een eigen brievenbus met twee sloten met twee sleutels: een public key waarmee je een brief in de brievenbus kan stoppen en een private key waarmee de eigenaar de brievenbus kan openen en de inhoud kan bekijken.
![]() |
โWil je mij iets sturen?
Gebruik dan deze publieke sleutel (= mijn slotje).โ
Alleen jij kunt de brievenbus openen, want jij hebt de privรฉ-sleutel die bij dat slotje hoort. |
Waarom zou asymentrische encryptie beter zijn dan symetrische encryptie?
๐ Symmetrische encryptie
-
Sleutel is geheim en wordt gedeeld
-
Je gebruikt dezelfde sleutel om iets te versleutelen รฉn te ontsleutelen.
-
Probleem: je moet die geheime sleutel veilig delen, en dat is lastig.
๐ Asymmetrische encryptie
-
Gebruikt twee sleutels:
-
Een publieke sleutel (om te versleutelen)
-
Een privรฉ sleutel (om te ontsleutelen)
-
-
Je kunt de publieke sleutel vrij geven aan iedereen, want alleen jij kunt de boodschap met je privรฉ sleutel openen.
๐ค Waarom is asymmetrische encryptie beter?
-
De privรฉ sleutel hoef je nooit met iemand te delen en de kans dat deze prive sleutel in verkeerde handen komt is dan dus kleiner.
Waarom zou je symetrische encryptie nog geberuiken als assymentrische encryptie beter is?
๐ง Kort gezegd:
-
Asymmetrisch = veilig, wat meer complex en trager.
-
Symmetrisch = iets minder veilig, maar wel snelen en eenvoudig
Om dat symetrische encrytie sneller en eenvoudiger is wordt die voroal gebruikt daar waar de sleutel snel veranderd dan is het niet zo erg als de sleutel in verkeerde hamden komt omdat er dan weer een neiuwe sleutel wordt gebruikt.
๐ ๏ธ Opdracht - Caesar Encryptie
In deze opdracht wordt jouw gevraagd een wachtwoord te 'hacken'. Het wachtwoord dat je moet ontcijferen is encrypted met het Caesar algoritme. Om te kunnen hacken moet je eerst begrijpen hoe het Caesar encryptie algoritme werkt.
Code Caesar encryptie
<?php
$sleutel = 2; // Caesar-sleutel: aantal posities verschuiven
function caesar_encrypt($tekst, $verschuiving) {
$resultaat = '';
for ($i = 0; $i < strlen($tekst); $i++) {
$char = $tekst[$i];
if (ctype_alpha($char)) {
$offset = ctype_upper($char) ? ord('A') : ord('a');
$resultaat .= chr(((ord($char) - $offset + $verschuiving) % 26) + $offset);
} else {
$resultaat .= $char; // Laat leestekens, spaties en cijfers ongemoeid
}
}
return $resultaat;
}
function caesar_decrypt($tekst, $verschuiving) {
return caesar_encrypt($tekst, 26 - $verschuiving); // Omgekeerde verschuiving
}
// Voorbeeld
$origineel = "Hallo Wereld!";
$gecodeerd = caesar_encrypt($origineel, $sleutel);
$ontsleuteld = caesar_decrypt($gecodeerd, $sleutel);
echo "Origineel: $origineel\n";
echo "Versleuteld: $gecodeerd\n";
echo "Ontsleuteld: $ontsleuteld\n";
Bekijk deze encryptie methode en probeer te begrijpen wat er gebeurt. Je kunt natuurlijk de code ook proberen/testen.
Als je het algoritme begrijpt, kan je verder.
๐จโ๐ป Hack-opdracht
Het volgende wachtwoord is encrypted met de Caesar methode.
Chs_hr_fdgdhl! |
Kan jij dit wachtwoord kraken?
๐ง Reflectie
- Is het Caesar algoritme een vorm van symmetrische- of asymetrische encryptie? Leg uit waarom.
- Hoe zou jij aan een niet programmeur uitleggen wat Caesar encryptie is?
- Hoe heb je het wachtwoord gehacked? Welke stappen heb je doorlopen?
- Als je een andere en misschien een iets lastigere wachtwoord moest kraken dat met het Caesar algoritme is ge-encrypt, hoe zou je dat dan aanpakken?
๐ค Inleveren
- Antwoorden op de reflectiie PDF
4 Hashing
๐ฏ Leerdoelen
- Je weet hashing betekenen en waarvoor ze gebruikt worden.
- Je kunt wachtwoorden op een veilige manier hashen in PHP.
- Je weet hoe je hashed wachtwoorden zou kunnen hacken.
๐ก Uitleg, wat is hashing?
Hashing is een soort encryptie die maar รฉรฉn kant op werkt; Je kunt wel encrypten maar niet de-crypten!
Hashing is dus eenrichtingsversleuteling: je zet een waarde om in een versleutelde vorm die je niet meer kunt terugrekenen naar het origineel. Dit wordt vaak gebruikt voor het veilig opslaan van wachtwoorden.
In PHP kun je een wachtwoord hashen met:
$hash = hash("sha256", "geheim123");
Het resultaat is bijvoorbeeld: $2y$10$f0849a42909dc18035cb470d239e485acbc1cdd1e48bc41f7a2801e3b08bdbdb
Je kunt dit niet terug rekenen naar geheim123
๐ Wat gebeurt er bij het inloggen?
Bij het inloggen controleer je of het ingevoerde wachtwoord overeenkomt met de opgeslagen hash:
if hash("sha256", $ingevoerdWachtwoord) == $hash {
echo "Ingelogd!";
}
โ ๏ธ Je moet het zo zien dat het ingevoerde wachtwoord opnieuw wordt omgezet met de hash-functie. Is het resultaat hetzelfde als de opgeslagen $hash dan is het ingevoerde wachtwoord goed.
๐ ๏ธ Opdracht 2 Hashing
Neem om te beginnen de start code, form.htm
en check.php
over.
Controleer of het werkt en probeer in te loggen met admin/wachtwoord. Probeer de code te begrijpen.
form.html
<!DOCTYPE html>
<html lang="nl">
<head>
<meta charset="UTF-8">
<title>Loginformulier</title>
</head>
<body>
<h2>Login</h2>
<form method="get" action="check.php">
<label for="gebruikersnaam">Gebruikersnaam:</label><br>
<input type="text" name="gebruikersnaam" id="gebruikersnaam" required><br><br>
<label for="wachtwoord">Wachtwoord:</label><br>
<input type="password" name="wachtwoord" id="wachtwoord" required><br><br>
<button type="submit">Inloggen</button>
</form>
<p><?= $melding ?></p>
</body>
</html>
check.php
<?php
$gebruikers = [
'max' => '',
'lisa' => '',
'admin' => 'e0NRta6G8WpOMOMK9qOC6O3z6F7cJcmA0r8GRPt4NeWcAUO4ED8Di' // Vaste hash van "wachtwoord"
];
$melding = '';
$gebruikersnaam = $_GET['gebruikersnaam'];
$wachtwoord = $_GET['wachtwoord'];
if (isset($gebruikers[$gebruikersnaam])) {
if (password_verify($wachtwoord, $gebruikers[$gebruikersnaam])) {
$melding = "โ
Ingelogd als <strong>$gebruikersnaam</strong>!";
} else {
$melding = "โ Fout wachtwoord.";
}
} else {
$melding = "โ Gebruiker bestaat niet.";
}
?>
Als je de code begrijpt dan is de volgende opdracht niet moeilijk.
๐ Zorg ervoor dat de gebruikers max en lisa kunnen inloggen met de volgende wachtwoorden. |
Gebruikersnaam | Wachtwoord |
max | top-secret123! |
llisa | sinclair1974 |
Probeer te ontdekken hoe je dit moet doen en hoe je de juiste wachtwoorden toe kan voegen.
๐จโ๐ป Hack-opdracht
Ste je hebt de volgende code onderschept;
$gebruikers = [
'max' => '$2y$10$AF4UcvDki/VEQKCUzHQxIudD9cYLRaF9v4GIkhTyTzWzxCN/Yo0q6',
'lisa' => '$2y$10$nWGSzTcP7TShCVwz78eNGO3LjoxR/FPR3WjZqxbodWHQUe/XEzZC.',
'admin' => '$2y$10$e0NRta6G8WpOMOMK9qOC6O3z6F7cJcmA0r8GRPt4NeWcAUO4ED8Di'
];
Aan jouw de taak om de wachtwoorden te 'kraken'.
Tip 1
Tip Het is niet mogelijk om de hash terug te rekenen vanuit de hash naar een wachtwoord.
Tip 2
Tip 2Je kunt natuurlijk wel een wachtwoorden in een hash omzetten en kijken of de hash hetzelfde is.
Tip 3
Lisa en Max hebben wachtwoorden die veel gebruikt worden en niet erg veilig zijn.
๐ Had je geen tips nodig, dan ben je een meester hacker!
๐ง Reflectie
- Waarom is het geen goed idee om wachtwoorden encrypted (versleuteld) op te slaan en waarom kun je beter hashing gebruiken?
Leg uit wat er mis zou kunnen gaan als je encryptie gebruikt voor het opslaan van wachtwoorden. - Stel je hebt een bestand gekregen met allemaal userid's en wachtwoorden. De wachtwoorden zijn hashed. Leg uit hoe je mogelijk toch achter de wachtwoorden kan komen.
๐ค Inleveren
- aangepaste
check.php
- de antwoorden op de vragen uit de reflectie in pdf
5 Brute Force-aanvallen en Loginbeveiliging
๐ฏ Leerdoelen
- Je weet wat een brute force-aanval is.
- Je kunt een eenvoudige loginpagina maken in PHP.
- Je begrijpt hoe je zo'n loginpagina kunt beveiligen tegen brute force-aanvallen.
๐ก Uitleg
Wat is een brute force-aanval?
Bij een brute force-aanval probeert een aanvaller heel veel verschillende wachtwoorden achter elkaar uit om zo toegang te krijgen tot een account. Als er geen beperking zit op het aantal pogingen, kan dit op den duur succes hebben.
Hoe bescherm je hiertegen?
Je kunt brute force-aanvallen voorkomen door bijvoorbeeld:
- Een limiet te stellen op het aantal pogingen
- Een vertraging inbouwen bij het inloggen en deze laten groeien als je vaker een fout wachtwoord hebt ingevuld.
- Tijdelijk een gebruiker of IP-adres te blokkeren (=black listing)
- Van te voren alleen bepaalde ip adressen toelaten (=white listing)
- Captcha toe te voegen
- Twee-factor authenticatie toe te passen
- Zet alle mislukte inlogpogingen in een logbestand.
Deze laatste bescherming met logfile voorkomt niet zozeer dat er brute force aanvallen plaatsvinden, maar je kunt wel zien als er wat vreemds gebeurt. Je kan dan op dat moment (extra) maatregelen nemen,
๐ ๏ธ Opdracht
Maak een eenvoudige loginpagina
Maak een bestand login.php
met het volgende formulier:
<form method="get" action="inlogcontrole.php">
Gebruikersnaam: <input name="username"><br>
Wachtwoord: <input type="password" name="password"><br>
<input type="submit" value="Login">
</form>
Maak daarna een eenvoudige inlogcontrole.php
in PHP:
<?php
session_start();
$gebruikersnaam = "admin";
$wachtwoord = "geheim";
if (!isset($_SESSION['pogingen'])) {
$_SESSION['pogingen'] = 0;
}
if ($_SESSION['pogingen'] >= 3) {
die("Te veel pogingen. Probeer het later opnieuw.");
}
if ($_GET) {
if ($_GET['username'] === $gebruikersnaam && $_GET['password'] === $wachtwoord) {
echo "Welkom!";
$_SESSION['pogingen'] = 0;
} else {
echo "Foutieve inlog.";
$_SESSION['pogingen']++;
}
}
?>
In het form wordt $_GET gebruikt, is dat handig?
Vanuit het oogpunt van cyber security is het beter om $_POST te gebruiken. Weet je nog waarom?
Aanpassingen
- Verander het formulier en de vervolgpagina zodat je geen post meer gebruikt en zodat het user id en wachtwoord niet meer in de URL staan.
- Voeg een vertraging toe met
sleep(1)
bij een mislukte poging. - Voeg logging toe aan een tekstbestand zodat je pogingen kunt terugzien.
Extra uitdaging
- Als je bijhoud hoevaak een gebruiker probeert in te loggen (met een sessie variabele), dan kan je de tijd tussen twee pogingen laten groeien: de eerste keer moet je 1 seconden wachten, dan 2 dan 4 dan 8 dan 16, etc. etc.
Kan jij dat implementeren?
๐ง Reflectie
- Waarom is het belangrijk om een limiet te stellen op het aantal inlogpogingen?
- Wat gebeurt er als je de sessiegegevens wist of in een andere browser werkt?
- Welke nadelen heeft deze eenvoudige beveiliging?
๐ค Inleveren
- De aangepaste code
inlogcontrole.php
- Reflectie met antwoorden op bovenstaande vragen in pdf.
*************
6
--
5 SQL Injection in PHP
๐ฏ Leerdoelen
- Je begrijpt wat een SQL Injection is en waarom het gevaarlijk is.
- Je kunt zelf een simpele SQL Injection uitvoeren op een onveilige PHP-pagina.
- Je kunt uitleggen hoe je dit soort aanvallen voorkomt.
๐ก Uitleg
Bij een SQL Injection wordt misbruik gemaakt van een fout in je code, waarbij de invoer van een gebruiker direct in een SQL-query wordt gezet. Als je niet oppast, kan een hacker zo gegevens uit je database stelen of zelfs verwijderen.
Een klassiek voorbeeld is een inlogformulier waarin de gebruikersinvoer zonder controle in de query komt te staan:
<?php
$conn = new mysqli("localhost", "root", "", "testdb");
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "Welkom!";
} else {
echo "Ongeldige login.";
}
?>
Als een aanvaller het volgende invoert:
Gebruikersnaam: ' OR '1'='1
Wachtwoord: watdanook
dan wordt de SQL-query dit:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = 'watdanook'
Omdat '1'='1' altijd waar is, kan de aanvaller inloggen zonder wachtwoord te kennen.
๐ ๏ธ Opdracht โ Voer een SQL Injection uit
- Maak een database
testdb
met een tabelusers
:CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(255), password VARCHAR(255) );
- Voeg een gebruiker toe:
INSERT INTO users (username, password) VALUES ('admin', 'admin123');
- Maak een PHP-bestand
login.php
met bovenstaande onveilige code. - Maak een formulier met twee velden:
username
enpassword
. - Voer een SQL-injection uit zoals hierboven uitgelegd. Wat gebeurt er?
๐ ๏ธ Vervolgopdracht โ Beveilig je formulier
- Pas de code aan zodat je gebruik maakt van prepared statements:
<?php
$conn = new mysqli("localhost", "root", "", "testdb");
$username = $_POST['username'];
$password = $_POST['password'];
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
echo "Welkom!";
} else {
echo "Ongeldige login.";
}
?>
- Test of de SQL Injection nu nog werkt. Leg uit waarom het niet meer lukt.
๐ง Reflectie
- Waarom is SQL-injection zo gevaarlijk voor een website?
- Wat had de originele programmeur moeten doen om dit te voorkomen?
- Gebruik je op je eigen sites al veilige manieren om met invoer om te gaan?
๐ค Inleveren
- Maak twee screenshots:
- Eรฉn van je geslaagde SQL-injection
- Eรฉn van je beveiligde code in actie (met foutmelding bij ongeldige login)
- Lever ook een korte toelichting en je reflectie in als .pdf of .txt
- Bestandsnamen:
sqlinjectie-.jpg
sqlinjectie-reflectie-.pdf
6 Cross-Site Scripting (XSS)
๐ฏ Leerdoelen
- Je weet wat Cross-Site Scripting (XSS) is en hoe het werkt.
- Je kunt zelf een XSS-aanval uitvoeren in een onveilige webpagina.
- Je kunt uitleggen hoe je je website kunt beschermen tegen XSS.
๐ก Uitleg
Wat is XSS?
Cross-Site Scripting (XSS) is een aanval waarbij een aanvaller kwaadaardige scripts (zoals JavaScript) invoert in een formulier of URL. Deze scripts worden dan uitgevoerd in de browser van een andere bezoeker.
Stel: je maakt een gastenboek waar mensen een berichtje kunnen achterlaten. Als je hun invoer niet goed filtert, kan iemand dit invoeren:
<script>alert('Ik ben gehackt!')</script>
Iedereen die daarna het gastenboek bezoekt, krijgt dan deze melding te zien โ het script wordt uitgevoerd alsof het van jouw site komt.
๐ ๏ธ Opdracht โ Voer een XSS-aanval uit
- Maak een PHP-bestand
gastenboek.php
met het volgende formulier en afhandelingscode:
<form method="post">
Naam: <input name="naam"><br>
Bericht: <textarea name="bericht"></textarea><br>
<input type="submit" value="Verstuur">
</form>
<?php
if ($_POST) {
echo "<h3>Bericht ontvangen:</h3>";
echo "<p>Van: " . $_POST['naam'] . "</p>";
echo "<p>" . $_POST['bericht'] . "</p>";
}
?>
- Voer nu als bericht het volgende in:
<script>alert('XSS test')</script>
- Wat gebeurt er?
๐ ๏ธ Vervolgopdracht โ Beveilig je formulier
- Pas de PHP-code aan zodat gebruikersinvoer wordt ge-escaped:
echo "<p>Van: " . htmlspecialchars($_POST['naam']) . "</p>";
echo "<p>" . htmlspecialchars($_POST['bericht']) . "</p>";
- Voer nogmaals het script in. Wat gebeurt er nu?
๐ง Reflectie
- Wat maakt XSS zo gevaarlijk voor je bezoekers?
- Wat is het verschil tussen
htmlspecialchars()
enstrip_tags()
in PHP? - Hoe zou jij in een groter project XSS voorkomen?
๐ค Inleveren
- Screenshot van de popup bij onveilige invoer
- Screenshot van veilige invoer na beveiliging
- Toelichting op je reflectie
- Bestandsnamen:
xss-aanval-.jpg
xss-veilige-versie-.jpg
xss-reflectie-.pdf
7 Social Engineering en Phishing
๐ฏ Leerdoelen
๐ก Uitleg
Wat is social engineering?
- Iemand belt je zogenaamd namens IT en vraagt om je wachtwoord.
- Een mailtje zegt dat je โdirect moet inloggenโ om je account te redden.
Wat is phishing?
Phishing is een vorm van social engineering waarbij iemand zich voordoet als een betrouwbare partij (zoals je bank, school of DigiD) om je inloggegevens of andere data te stelen.
Meestal gebeurt dit via e-mail of nepsites die lijken op de echte.
๐ ๏ธ Opdracht โ Herken phishing
- Bekijk 3 voorbeelden van phishingmails of nepsites. Gebruik bijv. de site fraudehelpdesk.nl.
- Beantwoord de volgende vragen:
- Wat valt je op aan de mail of site?
- Wat klopt er niet?
- Wat zou jij doen als je deze mail ontvangt?
๐ ๏ธ Opdracht โ Bouw een (veilige) nep-loginpagina
Maak een HTML-pagina met de opmaak van een bekende site (bv. Instagram, Facebook of je school), maar sla de invoer lokaal op of toon het resultaat in het scherm. Je gebruikt dit puur om de aanvalstechniek te begrijpen โ NIET om iemand mee te misleiden!
<form method="post">
Gebruikersnaam: <input name="username"><br>
Wachtwoord: <input type="password" name="password"><br>
<input type="submit" value="Login">
</form>
<?php
if ($_POST) {
echo "<p>Opgevangen gegevens:</p>";
echo "Gebruiker: " . $_POST['username'] . "<br>";
echo "Wachtwoord: " . $_POST['password'];
}
?>
- Maak je site herkenbaar door een waarschuwing toe te voegen dat het een oefening is.
๐ง Reflectie
- Waarom werken phishingaanvallen zo goed, denk je?
- Wat zou jij doen als je twijfelt aan een mail of site?
- Hoe zou je jouw ouders of opa/oma uitleggen hoe ze phishing kunnen herkennen?
๐ค Inleveren
- Een kort verslag van je analyse van 3 phishingvoorbeelden
- Een screenshot van je lokale oefen-phishingsite met zichtbaar ingevulde gegevens
- Reflectie op hoe je social engineering in het dagelijks leven herkent
- Bestandsnamen:
phishing-analyse-.pdf
phishingsite-.jpg
phishing-reflectie-.pdf
8 Brute Force-aanvallen en Loginbeveiliging
๐ฏ Leerdoelen
- Je weet wat een brute force-aanval is.
- Je kunt een eenvoudige loginpagina maken in PHP.
- Je begrijpt hoe je zo'n loginpagina kunt beveiligen tegen brute force-aanvallen.
๐ก Uitleg
Wat is een brute force-aanval?
Bij een brute force-aanval probeert een aanvaller heel veel verschillende wachtwoorden achter elkaar uit om zo toegang te krijgen tot een account. Als er geen beperking zit op het aantal pogingen, kan dit op den duur succes hebben.
Hoe bescherm je hiertegen?
Je kunt brute force-aanvallen voorkomen door bijvoorbeeld:
- Een limiet te stellen op het aantal pogingen
- Tijdelijk een gebruiker of IP-adres te blokkeren
- Captcha toe te voegen
- Logging bij te houden van mislukte pogingen
๐ ๏ธ Opdracht โ Maak een eenvoudige loginpagina
Maak een bestand login.php
met het volgende formulier:
<form method="post">
Gebruikersnaam: <input name="username"><br>
Wachtwoord: <input type="password" name="password"><br>
<input type="submit" value="Login">
</form>
Maak daarna een eenvoudige inlogcontrole in PHP:
<?php
session_start();
$gebruikersnaam = "admin";
$wachtwoord = "geheim";
if (!isset($_SESSION['pogingen'])) {
$_SESSION['pogingen'] = 0;
}
if ($_SESSION['pogingen'] >= 3) {
die("Te veel pogingen. Probeer het later opnieuw.");
}
if ($_POST) {
if ($_POST['username'] === $gebruikersnaam && $_POST['password'] === $wachtwoord) {
echo "Welkom!";
$_SESSION['pogingen'] = 0;
} else {
echo "Foutieve inlog.";
$_SESSION['pogingen']++;
}
}
?>
๐ ๏ธ Vervolgopdracht โ Extra beveiliging
- Voeg een vertraging toe met
sleep(1)
bij een mislukte poging. - Voeg logging toe aan een tekstbestand zodat je pogingen kunt terugzien.
๐ง Reflectie
- Waarom is het belangrijk om een limiet te stellen op het aantal inlogpogingen?
- Wat gebeurt er als je de sessiegegevens wist of in een andere browser werkt?
- Welke nadelen heeft deze eenvoudige beveiliging?
๐ค Inleveren
- Screenshot van de loginpagina
- Code van jouw
login.php
- Reflectie met antwoorden op bovenstaande vragen
- Bestandsnamen:
loginpagina-<jouw-naam>.jpg
login-php-<jouw-naam>.txt
login-reflectie-<jouw-naam>.pdf
9 Firewalls en automatische back-ups
๐ฏ Leerdoelen
- Je weet wat een firewall is en waarvoor die dient.
- Je kunt uitleggen waarom back-ups belangrijk zijn.
- Je leert hoe je automatische back-ups instelt op een WordPress-site.
๐ก Uitleg
Wat is een firewall?
Een firewall is een digitale poortwachter. Het controleert het verkeer tussen jouw computer (of server) en het internet, en houdt verdachte of gevaarlijke verbindingen tegen.
Firewalls beschermen tegen:
- Ongewenste toegang tot je server of computer
- Kwaadaardige software
- Netwerkaanvallen
Er zijn software-firewalls (zoals die in Windows of macOS) en hardware-firewalls (in routers of servers).
Wat zijn back-ups en waarom zijn ze belangrijk?
Een back-up is een kopie van je website of bestanden, die je kunt terugzetten als er iets misgaat. Redenen om back-ups te maken:
- Harde schijf crasht
- Website wordt gehackt
- Per ongeluk bestanden verwijderd
- Update maakt iets stuk
Met automatische back-ups voorkom je dat je dit handmatig moet doen.
๐ ๏ธ Opdracht 1 โ Installeer een firewall-plugin
- Log in op je WordPress-dashboard.
- Ga naar Plugins > Nieuwe plugin.
- Zoek op Wordfence Security (of een andere populaire firewall plugin).
- Installeer en activeer de plugin.
- Bekijk wat de plugin doet en of je al meldingen krijgt van verdachte activiteiten.
๐ ๏ธ Opdracht 2 โ Stel automatische back-ups in
- Ga naar Plugins > Nieuwe plugin.
- Zoek op UpdraftPlus (of een vergelijkbare plugin).
- Installeer en activeer de plugin.
- Ga naar het menu van de plugin en stel in dat er:
- Wekelijks een back-up wordt gemaakt
- Zowel bestanden als database worden opgeslagen
- De back-up lokaal of op Google Drive wordt opgeslagen
- Maak handmatig de eerste back-up en bekijk het resultaat.
๐ง Reflectie
- Wat zou er kunnen gebeuren als je site geen firewall heeft?
- Hoe vaak denk jij dat je back-ups zou moeten maken?
- Heb je nu meer vertrouwen in je site als er iets misgaat?
๐ค Inleveren
- Screenshot van de firewall-plugin instellingen
- Screenshot van de automatische back-up-instellingen of overzicht
- Reflectie met antwoorden op bovenstaande vragen
- Bestandsnamen:
firewall-plugin-<jouw-naam>.jpg
backup-instellingen-<jouw-naam>.jpg
firewall-backup-reflectie-<jouw-naam>.pdf
10 Encryptie โ een geheime boodschap kraken
๐ฏ Leerdoelen
- Je begrijpt wat encryptie is.
- Je weet waarom encryptie belangrijk is in de digitale wereld.
- Je leert een versleutelde boodschap herkennen en ontcijferen.
๐ก Uitleg
Wat is encryptie?
Encryptie is het versleutelen van een boodschap zodat alleen iemand met de juiste sleutel de boodschap kan lezen.
Een eenvoudige vorm is de Caesarversleuteling. Daarbij wordt elke letter vervangen door een andere letter, bijvoorbeeld 3 letters verder in het alfabet:
Hallo
wordt met sleutel 3 โ Kdoor
Waarom is encryptie belangrijk?
Encryptie beschermt je gegevens bij bijvoorbeeld:
- Het versturen van e-mails
- Bankieren op het internet
- Inloggen op websites
๐ ๏ธ Opdracht โ Kraak de geheime boodschap
Je hebt een versleutelde boodschap ontvangen die met een Caesarversleuteling is gecodeerd:
Khoor vwxghqw, jrhgh jhzhogljgh lq f\ehu vhfxulwb!
Probeer de originele boodschap te achterhalen. De boodschap is versleuteld met een vaste verschuiving. Je mag pen en papier gebruiken of een online Caesar-decoder zoals:
๐ ๏ธ Vervolgopdracht โ Maak zelf een versleuteling
Gebruik dezelfde methode (Caesarversleuteling) om zelf een geheime boodschap te maken. Geef de versleutelde versie aan een klasgenoot, zonder de sleutel. Kan jouw klasgenoot hem kraken?
๐ง Reflectie
- Hoe moeilijk was het om de versleuteling te kraken?
- Wat gebeurt er als iemand de sleutel niet weet?
- Denk je dat deze versleuteling veilig genoeg is voor gevoelige informatie?
๐ค Inleveren
- Screenshot van jouw gekraakte boodschap + de originele tekst
- Een zelfgemaakte geheime boodschap (versleuteld) + sleutel
- Reflectie met antwoorden op de vragen
- Bestandsnamen:
geheimbericht-kraken-<jouw-naam>.jpg
mijn-encryptie-<jouw-naam>.txt
encryptie-reflectie-<jouw-naam>.pdf
11 Hashing en wachtwoorden
๐ฏ Leerdoelen
- Je weet wat hashing is.
- Je begrijpt waarom wachtwoorden niet in gewone tekst opgeslagen mogen worden.
- Je leert hoe je met PHP een wachtwoord kunt hashen en controleren.
๐ก Uitleg
Wat is hashing?
Hashing is een manier om een stukje informatie (zoals een wachtwoord) om te zetten in een unieke, vaste code. Deze code kan niet zomaar worden terugvertaald naar het origineel.
Bijvoorbeeld: wachtwoord
wordt met een hashfunctie iets als:
5f4dcc3b5aa765d61d8327deb882cf99
Een goede hashfunctie zorgt ervoor dat het onmogelijk is om de originele tekst terug te vinden uit de hash.
Waarom is dat belangrijk?
Als iemand je database steelt waarin de wachtwoorden in gewone tekst staan, kunnen ze overal inloggen. Als ze gehasht zijn, is dat veel moeilijker.
Wat doet PHP?
In PHP gebruik je password_hash()
om een wachtwoord te versleutelen, en password_verify()
om te controleren of een ingevoerd wachtwoord klopt.
๐ ๏ธ Opdracht โ Probeer het zelf
- Maak een nieuw PHP-bestand aan:
hash-test.php
. - Voeg de volgende code toe en bekijk het resultaat in de browser:
<?php
$wachtwoord = \"supergeheim\";
$hash = password_hash($wachtwoord, PASSWORD_DEFAULT);
echo \"De hash is: \" . $hash;
$ingevoerd = \"supergeheim\";
if (password_verify($ingevoerd, $hash)) {
echo \"<br>Wachtwoord klopt!\";
} else {
echo \"<br>Wachtwoord klopt NIET!\";
}
?>
- Verander het ingevoerde wachtwoord in iets anders en bekijk opnieuw het resultaat.
๐ง Reflectie
- Wat gebeurt er als je twee keer
password_hash()
uitvoert op hetzelfde wachtwoord? - Waarom is dat eigenlijk goed?
- Wat zou er gebeuren als je wachtwoorden als gewone tekst opslaat in de database?
๐ค Inleveren
- Screenshot van het resultaat in je browser (2x: goed en fout wachtwoord)
- Reflectievragen in een apart bestand
- Bestandsnamen:
hash-test-uitkomst-<jouw-naam>.jpg
hashing-reflectie-<jouw-naam>.pdf