Level 1/3: Dirty dirty input

Hidden input, can’t hide from me

Opdracht:
  1. Bekijk het formulier van de applicatie met de dev-tools van je browser.
  2. Pas met de dev-tools het hidden input veld aan van ‘red’ naar ‘blue’. Als je het formulier nu submit, zul je zien dat de PHP code niet door heeft dat het formulier is aangepast.
  3. Zorg dat je alleen als een gebruiker admin is hij zelf zijn kleur mag bepalen. Anders moet het altijd rood zijn. Gebruik hiervoor de userIsAdmin functie.
Uitwerking:

<body>
    <div class="body-container">
        <h1 class="heading">Gastenboek 'De lekkage'</h1>
        <form action="guestbook.php" method="post">
            Email: <input type="email" name="email"><br />
            Bericht: <textarea name="text" minlength="4"></textarea><br />
            <?php if (userIsAdmin($conn)) {
                echo "<input type=\"hidden\" name=\"admin\" value=" . $_COOKIE['admin'] . "\">";
                echo '<input type="color" value="red" name="color">';
            } ?>
            <input type="hidden" name="token" value="<?php echo $token; ?>">
            <input type="submit">
        </form>
        <hr />
        <?php
        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            $email = $_POST['email'];
            $text = $_POST['text'];
            $admin = isset($_POST['admin']) ? 1 : 0;
            if (userIsAdmin($conn)) {
                $color = $_POST['color'] ?? 'red';
            } else {
                $color = 'red';
            }
            $conn->query(
                "INSERT INTO `entries`(`email`, `color`, `admin`, `text`) 
                                        VALUES ('$email', '$color', '$admin', '$text');"
            );
        }

        $result = $conn->query("SELECT `email`, `text`, `color`, `admin` FROM `entries`");
        foreach ($result as $row) {
            print "<div style=\"color: " . $row['color'] . "\">Email: " . $row['email'];
            if ($row['admin']) {
                print '&#9812;';
            }
            print ": " . $row['text'] . "</div><br/>";
        }

        function userIsAdmin($conn)
        {
            if (isset($_COOKIE['admin'])) {
                $adminCookie = $_COOKIE['admin'];

                $result = $conn->query("SELECT cookie FROM `admin_cookies`");

                foreach ($result as $row) {
                    if ($adminCookie === $row['cookie']) {
                        return true;
                    }
                }
            }

            return false;
        }

        ?>
        <hr />
        <div class="disclosure-notice">
            <p>
                Hierbij krijgt iedereen expliciete toestemming om dit Gastenboek zelf te gebruiken voor welke doeleinden dan
                ook
            </p>
            <p>
                Onthoud dat je voor andere websites altijd je aan de principes van
                <a href="https://en.wikipedia.org/wiki/Responsible_disclosure" target="_blank" style="color: lightgray;">
                    Responsible Disclosure
                </a> wilt houden.
            </p>
        </div>
    </div>
</body>

Email validatie

Opdracht:
  1. Pas met de dev-tools van je browser het input type van het email veld aan.
  2. Verifieer dat je nu vrij bent om random tekst, dus geen email adres, op te slaan.
  3. Pas de PHP code aan om te controleren dat het echt een email adres is.
Uitwerking:


<body>
    <div class="body-container">
        <h1 class="heading">Gastenboek 'De lekkage'</h1>
        <form action="guestbook.php" method="post">
            Email: <input type="email" name="email"><br />
            Bericht: <textarea name="text" minlength="4"></textarea><br />
            <?php if (userIsAdmin($conn)) {
                echo "<input type=\"hidden\" name=\"admin\" value=" . $_COOKIE['admin'] . "\">";
                echo '<input type="color" value="red" name="color">';
            } ?>
            <input type="hidden" name="token" value="<?php echo $token; ?>">
            <input type="submit">
        </form>
        <hr />
        <?php
        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            $email = $_POST['email'];

            if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
                $text = $_POST['text'];
                $admin = isset($_POST['admin']) ? 1 : 0;
                if (userIsAdmin($conn)) {
                    $color = $_POST['color'] ?? 'red';
                } else {
                    $color = 'red';
                }
                $conn->query(
                    "INSERT INTO `entries`(`email`, `color`, `admin`, `text`) 
                                        VALUES ('$email', '$color', '$admin', '$text');"
                );
            } else {
                echo "geen valide email";
            }
        }

        $result = $conn->query("SELECT `email`, `text`, `color`, `admin` FROM `entries`");
        foreach ($result as $row) {
            print "<div style=\"color: " . $row['color'] . "\">Email: " . $row['email'];
            if ($row['admin']) {
                print '&#9812;';
            }
            print ": " . $row['text'] . "</div><br/>";
        }

        function userIsAdmin($conn)
        {
            if (isset($_COOKIE['admin'])) {
                $adminCookie = $_COOKIE['admin'];

                $result = $conn->query("SELECT cookie FROM `admin_cookies`");

                foreach ($result as $row) {
                    if ($adminCookie === $row['cookie']) {
                        return true;
                    }
                }
            }

            return false;
        }

        ?>
        <hr />
        <div class="disclosure-notice">
            <p>
                Hierbij krijgt iedereen expliciete toestemming om dit Gastenboek zelf te gebruiken voor welke doeleinden dan
                ook
            </p>
            <p>
                Onthoud dat je voor andere websites altijd je aan de principes van
                <a href="https://en.wikipedia.org/wiki/Responsible_disclosure" target="_blank" style="color: lightgray;">
                    Responsible Disclosure
                </a> wilt houden.
            </p>
        </div>
    </div>
</body>

Admin only!

Opdracht:
  1. Voeg het admin veld zelf toe via de dev-tools en verstuur het formulier.
  2. Observeer dat de php code hier geen enkel probleem mee heeft.
  3. Pas de php code aan zodat de admin status uit de database gehaald wordt in plaats van op user input te vertrouwen.
Uitwerking:

  
<body>
    <div class="body-container">
        <h1 class="heading">Gastenboek 'De lekkage'</h1>
        <form action="guestbook.php" method="post">
            Email: <input type="email" name="email"><br />
            Bericht: <textarea name="text" minlength="4"></textarea><br />
            <?php if (userIsAdmin($conn)) {
                echo '<input type="color" value="red" name="color">';
            } ?>
            <input type="hidden" name="token" value="<?php echo $token; ?>">
            <input type="submit">
        </form>
        <hr />
        <?php
        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            $email = $_POST['email'];

            if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
                $text = $_POST['text'];
                $admin = 0;
                $color = 'red';
                if (userIsAdmin($conn)) {
                    $admin = 1;
                    $color = $_POST['color'] ?? 'red';
                }
                $conn->query(
                    "INSERT INTO `entries`(`email`, `color`, `admin`, `text`) 
                                        VALUES ('$email', '$color', '$admin', '$text');"
                );
            } else {
                echo "geen valide email";
            }
        }

        $result = $conn->query("SELECT `email`, `text`, `color`, `admin` FROM `entries`");
        foreach ($result as $row) {
            print "<div style=\"color: " . $row['color'] . "\">Email: " . $row['email'];
            if ($row['admin']) {
                print '&#9812;';
            }
            print ": " . $row['text'] . "</div><br/>";
        }

        function userIsAdmin($conn)
        {
            if (isset($_COOKIE['admin'])) {
                $adminCookie = $_COOKIE['admin'];

                $result = $conn->query("SELECT cookie FROM `admin_cookies`");

                foreach ($result as $row) {
                    if ($adminCookie === $row['cookie']) {
                        return true;
                    }
                }
            }

            return false;
        }

        ?>
        <hr />
        <div class="disclosure-notice">
            <p>
                Hierbij krijgt iedereen expliciete toestemming om dit Gastenboek zelf te gebruiken voor welke doeleinden dan
                ook
            </p>
            <p>
                Onthoud dat je voor andere websites altijd je aan de principes van
                <a href="https://en.wikipedia.org/wiki/Responsible_disclosure" target="_blank" style="color: lightgray;">
                    Responsible Disclosure
                </a> wilt houden.
            </p>
        </div>
    </div>
</body>