Ga naar hoofdinhoud

Word de Developer (Fix-it Challenge)

Je hebt nu geleerd hoe je applicaties kunt slopen. Maar een echte expert weet ook hoe je ze moet bouwen. In deze finale uitdaging draaien we de rollen om. Jij bent de lead developer van een nieuwe webshop.

Hieronder staan drie stukjes code die je team heeft geschreven. Ze bevatten allemaal een kritiek lek. Kun jij ze fixen?


Opdracht 1: Command Injection Fixen​

Je teamlid schreef deze code om een server te herstarten via de webinterface:

$server = $_POST['server_name'];
shell_exec("reboot " . $server);

De Fout: De gebruiker kan server1; rm -rf / typen. Jouw Taak: Hoe fix je dit zonder een blacklist te gebruiken?

Details

Tip Denk aan whitelisting. Als je alleen een beperkt aantal servernamen hebt (bijv. 'web1', 'web2'), kun je die in een lijst zetten.

Oplossing

Gebruik een whitelist van toegestane namen:

$allowed = ['web1', 'web2', 'db1'];
$server = $_POST['server_name'];

if (in_array($server, $allowed)) {
shell_exec("reboot " . $server);
} else {
echo "Onbekende server!";
}

Opdracht 2: SQL Injection Fixen​

Dit script haalt producten op uit de database:

$prod_id = $_GET['id'];
$db->query("SELECT * FROM products WHERE id = " . $prod_id);

De Fout: De $prod_id wordt direct in de query geplakt. Jouw Taak: Wat is de professionele manier om dit op te lossen (die we zagen bij het Impossible level)?

Details

Tip Zoek naar de term Prepared Statements.

Oplossing

Gebruik Prepared Statements (geparamatriseerde queries). De database krijgt eerst de query met een vraagteken, en daarna pas de data. De data kan de query dan nooit meer "verbreken".

$stmt = $pdo->prepare('SELECT * FROM products WHERE id = :id');
$stmt->execute(['id' => $_GET['id']]);
$user = $stmt->fetch();

Opdracht 3: XSS Fixen​

Dit script begroet de ingelogde gebruiker:

$name = $_GET['name'];
echo "<h1>Welkom, " . $name . "!</h1>";

De Fout: Als $name gelijk is aan <script>alert(1)</script>, wordt het script uitgevoerd. Jouw Taak: Hoe zorg je ervoor dat de browser de tekst alleen laat zien in plaats van uitvoert?

Details

Tip Er is een PHP functie die speciale tekens zoals < verandert in veilige codes zoals &lt;.

Oplossing

Gebruik htmlspecialchars(). Dit zet gevaarlijke HTML-tekens om in hun onschadelijke variant.

$name = $_GET['name'];
echo "<h1>Welkom, " . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . "!</h1>";

Reflectie: De Gouden Regel​

Gefeliciteerd! Je hebt de basis van veilige softwareontwikkeling onder de knie. Als je ÊÊn ding moet onthouden van deze hele cursus, laat het dan dit zijn:

Vertrouw NOOIT op invoer van de gebruiker. Behandel elke tekst, elk bestand en elk verzoek dat van buitenaf komt als potentieel gevaarlijk.

Wat ga je nu doen?

  • Ga terug naar de Challenges en probeer nog eens een High level te halen zonder de tip.
  • Bekijk de Cheatsheet voor een overzicht van alle commando's.
  • Of begin aan de cursus Fullstack Development om zelf veilige apps te gaan bouwen!