Bewijs Materiaal: Puntjes op de i

“Ik ben voor transparantie dus laat die hackers maar binnen”
 
Omschrijving
 
Applicatie die beveiligd is tegen kwaadwillende invoer en waarvan de code goed overdraagbaar is. Voorzien van minimaal de standaard beveiligingsaspecten: SSL verbinding, https, MD5, etc. Overdraagbaarheid door commentaar in code en een logische opbouw en structuur.
Bij de overdracht naar de opdrachtgever is nagedacht over de ondersteuning bij het in gebruik nemen van het product. Ook zijn alle functionaliteiten in de praktijk getoetst en is het product robuust genoeg om de praktijksituaties aan te kunnen.
 
Uitdagingen
  • Functies en kritieke onderdelen in code (onderdelen die niet in één oogopslag te verklaren zijn) zijn voorzien van comments. Hierbij wordt er gebruikt gemaakt van geldende conventies in de specifieke taal waarin gewerkt wordt.
  • Beveiliging op het web:
    • Alle gebruikersinvoer (bijv registratieformulier) wordt gevalideerd voor gebruik (bijv opslaan in database). Dit om zowel bewuste als onbewuste fouten te voorkomen.
    • Als data wordt opgeslagen is de manier van opslaan afgestemd op gevoeligheid van de data.
    • Je weet wat de volgende onderdelen betekenen en hoe je ertegen kunt beveiligen:
      • XSS
      • SQL Injections
  • Je bent in staat om een klantgerichte gebruikershandleiding op te leveren. Een installatiehandleiding is hier onderdeel van.

Bewijs Materiaal

  • Ik kan nu al mijn code in deze blog post plakken maar dat maakt de blogpost wel ontzettend lang en onoverzichtelijk in mijn opzicht. Dus als u het niet erg vindt laat ik dat wel zien tijdens de assesment. Ik heb wel eigenlijk voor alles wat ik met php heb gescreven comments gebruikt. Vooral omdat mijn leraar een keer feedback gaf op mijn code dat het er een beetje slordig uit zag en zonder comments. Sinds dien had ik heel mijn php code voor periode 2 voorzien van comments.
  • Mijn periode 2 website is voorzien van veel forms. Hierbij heb ik ervoor gezorgd dat als de user de benodigde invoer velden niet invult, dat de informatie niet in de database tabel terecht komt. Verder heb ik nog een code dat als er een user aangemaakt wordt dat de ingevulde wachtwoord echt overeen moet komen met de verify wachtwoord veld.
  • Mijn website van Periode 2 heeft maar 1 data gevoelige tabel, dat is de users tabel. Omdat de gebruikers van mijn website eerst moeten inloggen met hun username en wachtwoord heb ik voor veiligheid redenen de wachtwoorden van de users voordat ze geregistreerd zijn gehashed met protocool md5 zodat als de hackers toegang krijgen tot mijn database de hackers niet kunnen zien wat  de wachtwoorden zijn.
  • XSS is cross-side-scripting. Cross-side-scripting is                      client-sided-code die naar een onbeveiligde website wordt geïnjecteerd door bijvoorbeeld een formulier. Die code wordt gelezen door de website en voert de code uit. Dit kan ervoor zorgen kleine problemen of het kan juist grote problemen veroorzaken in de veiligheid risico. Ik kan XSS verkomen door met php htmlentities() te gebruiken of htmlspecialchars(). Voor Periode 2 heb ik htmlentities() gebruikt waar er informatie via mijn header werd gestuurd door een POST. htmlentities() zorgt ervoor dat alle characters die een html waarde hebben vervangen worden van de string met de niet-html equivalente characters.
  • SQL INJECTIONS is code die naar een database of tabel wordt gestuurd. Deze code kan je database manipuleren door de database of tabel instructies te geven die met de content te maken hebben. De database aanvaller kan ervoor zorgen dat je database gedropt wordt en om zulke nare situaties te voorkomen zijn er functies bedacht om dat tegen te gaan. De functie mysqli_real_escape_string() zorgt ervoor dat de speciale characters van de SQL code verwijdert worden van de string zodat de string geen SQL code meer is.
  • Ik heb een klantgerichte/admin gerichte gebruikers handleiding geschreven. Dit is een handleiding die alle functies uitlegt van de website. Verder is er ook de FAQ pagina die de rol uitvoert voor de normale niet admin users. Her is een link naar die handleiding QRP ADMIN handleiding.

UPDATE van de uitdagingen die misten volgens de feedback van de assessor.

Uitdaging1

  • Je weet wat de volgende onderdelen betekenen en hoe je ertegen kunt beveiligen:
    • XSS
    • SQL Injections

Bewijs1

  • Ik kan XSS verkomen door met php htmlentities() te gebruiken of htmlspecialchars(). Ik maak nu gebruik van htmlspecialchars() waar er informatie via mijn header werd gestuurd door een POST. htmlspecialchars() zorgt ervoor dat alle characters die een html waarde hebben, worden vervangen door een string met de niet-html equivalente characters.

Uitdagingen2

  • Wat gebeurt er als iemand ongeldige gegevens invoert.
  • Nu kan ik ook formulieren effectiever maken door gebruik te maken van functies zoals :
    filter_var($email, FILTER_VALIDATE_EMAIL)

Hiermee kan ik ervoor zorgen dat de ingevulde informatie in de form met de label ’email’ dat de email ook moet kloppen anders krijgt de gebruiker een foutmelding te zien. In mijn project was dit een van de weinige formulieren waar er ongeldige informatie ingevuld kon worden. Verder heb ik nog de index.php waarbij de gebruiker een wachtwoord moet invullen. Als dat niet klopt met de data van de database dan krijgt de gebruiker ook een fout melding te zien:

<?php
/* Start de sessie */
session_start();

/* Lege variabel om geen error te krijgen */
$message = '';
/* Als de form ingevuld is */
if (isset($_POST['submit'])){
    /* */
    require_once 'database.php';

    /* De username en password worden opgelsagen */
    $username= mysqli_real_escape_string($db,htmlspecialchars($_POST['username']));
    $password= md5($_POST['password']);

    /* De SQL code die ervoor zorgt dat alle informatie van de user opgehaald wordt */
    $sql= "SELECT * FROM users WHERE username = '$username'";
    $result= mysqli_query($db, $sql);

    /* Als er een resultaat is */
    if ($row= mysqli_fetch_assoc($result)) {

        /* Dan worden de ID, hash en admin waarde opgeslagen */
        $id= $row['id'];
        $hash = $row['password'];
        $isAdmin = $row['is_admin'];

        /* Als de wachtwoord met de hash overeen komt */
        if ($password === $hash) {
            $message = 'Login Succesful.';

            /* De id en admin waarde worden in de sessie opgeslagen */
            $_SESSION['id'] = $id;
            $_SESSION['is_admin'] = $isAdmin;

            /* Daarna wordt de user naar redirect.php gestuurd */
            header("Location: redirect.php");


        } else {
            $message = 'Login Failed.';
        }
    } else {
        $message = 'Login Failed';
    }
    /* De database connectie sluit */
    mysqli_close($db);
}
?>

En verder heb ik bij het updaten van een user en het aanmaken van een user op de website een code geschreven die ervoor zorgt dat het wachtwoord van het account twee keer moet worden ingevuld en daar moet het wachtwoord hetzelfde zijn bij de twee velden.

<?php
/**
 * haal de informatie indien nodig op
 * zet de nieuwe informatie in de tabel op de juiste plek als er de informatie al een plek (ID) had
 */
/* De php file die checkt of de user admin is */
require "session.php" ;

/* De php file die een connectie met de database maakt */
require_once 'database.php';

/* De ID wordt opgeslagen */
$id= $_GET['id'];

/* de SQL code die alle informatie over de user verzamelt door te zoeken op ID */
$sql = "SELECT * FROM users WHERE id= '$id'";
$result= mysqli_query($db, $sql);

$username ='';
$password ='';
$email    ='';
$company  ='';

/* Als de form doorlopen is en de wachtwoord overeen komt met de wachtwoord verificatie */
if(isset($_POST['submit']) && $_POST['verify'] === $_POST['password'] ){
    $ok=true;

    /* De username, wachtwoord, email company name, en hash worden opgeslagen */
    $username = mysqli_real_escape_string($db,htmlspecialchars($_POST['username']));
    $password = mysqli_real_escape_string($db,htmlspecialchars($_POST['password']));
    $email    = mysqli_real_escape_string($db,htmlspecialchars($_POST['email']));
    $company  = mysqli_real_escape_string($db,htmlspecialchars($_POST['company']));
    $hash= md5($password);

    /* De connectie met de database */
    require_once 'database.php';

    /* De SQL code die ervoor zorgt dat de user wordt geupdate */
    $sql = "UPDATE users SET username= '$username', password='$hash', email= '$email', company= '$company' WHERE id='$id'";
    $result= mysqli_query($db, $sql);

    /* De connectie wordt gesloten */
    mysqli_close($db);
    header("Location: mail.php?type=2&username=$username&password=$password");

    /* als er niks is ingevoerd dan verloopt die hierboven staande code niet*/
    if (!isset($_POST['username']) || $_POST['username']=== ""){
        $ok=false;
    }
    if (!isset($_POST['password']) || $_POST['password']=== ""){
        $ok=false;
    }
    if (!isset($_POST['verify']) || $_POST['verify']=== ""){
        $ok=false;
    }
    if (!isset($_POST['email']) || $_POST['email']=== ""|| !(filter_var($email, FILTER_VALIDATE_EMAIL)))){
        $ok=false;
    }
    if (!isset($_POST['company']) || $_POST['company']=== ""){
        $ok=false;
    }

}
/* Als er een resultaat is bij de eerste SQL code dan wordt dat hier opgeslagen en in de form verwerkt zodat de oude informatie op het scherm te zien is*/
if($row = mysqli_fetch_assoc($result)){
$rowusername = $row['username'];
$rowemail = $row['email'];
$rowcompany = $row['company'];
mysqli_close($db);
?>

Uitdaging 3

  • Je bent in staat om een klantgerichte gebruikershandleiding op te leveren. Een installatiehandleiding is hier onderdeel van.

BewijsMateriaal 3

  • Ik heb nu ook een admin gerichte Installatie Handleiding geschreven en een klantgerichte/admin gerichte gebruikers handleiding geschreven. Dit is een handleiding die alle functies uitlegt van de website. Verder is er ook de FAQ pagina die de rol uitvoert voor de normale niet admin users. Hier is een link naar die handleiding QRP ADMIN handleiding2.