Skip to main content

Create Safe Code - SQL Injection

We gaan een eenvoudige login maken en we gaan zien hoe je een eenvoudige login kunt omzeilen. Hiervoor gaan we SQL injection gebruiken. De opdracht is om deze login te maken en dan zodanig aan te passen dat de login veilig is en niet meer kan wordnen omzeild.

Maak een database met usernaem en wachtwoord en maak een eenvoudige login.

De database kan wordne aangemaakt met script dat je hier kunt downloaden.

form.html

Maak een html pagina met een login form. Het form moetbegint alsmet:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Login</title> </head> <body> <h1>Login</h1> <form class="" action="login.php" method="post"> <table><tr>en <td>Userheeft ID</td>twee <td><inputinvoer type="text"velden name="user"een id=""></td>user <td>wachtwoord</td>en <td><inputwachtwoord.

type="text"

De name="wachtwoord"php id=""></td>code </tr></table>is <p><inputhieronder type="submit"toegevoegd. value="login"></p>De </form>login </body>maakt </html>gebruik

van een een include. De code van de include waarin een verbinding met de database wordt gemaakt staat hieronder ook. let op dat je nog wel de database parameters moet invullen.

login.php

<?php

include "includes/db.php";

echo "User:".$_POST['user']."<br>";
echo "Wachtwoord:".$_POST['wachtwoord']."<br>";

$user=$_POST['user'];
$wachtwoord=$_POST['wachtwoord'];

$myConn = new DB;
$query = "SELECT * FROM login where username='$user' and wachtwoord='$wachtwoord'";
$result = $myConn->executeSQL($query);

if ( $result != 0 ) {
    echo "<br> Login as $user <br>";
} else {
    echo "<br> Invalid login! <br>";
}

?>

db.php

<?php

include// Define DB Params
define("DB_HOST", "includes/db.php"localhost");
echodefine("DB_USER", "User:".$_POST['user']."<br>");
echodefine("DB_PASS", "Wachtwoord:".$_POST['wachtwoord']."<br>");
$user=$_POST['user']define("DB_NAME", "login");

$wachtwoord=$_POST['wachtwoord'];class DB{
	protected $myConndbh;
	protected $stmt;
    protected $resultSet;

	public function __construct(){
		$this->dbh = new DB;PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USER, DB_PASS);
        $querythis->resultSet=[];
	}

	public function executeSQL($query){
        $this->stmt = "SELECT * FROM login where username='$user' and wachtwoord='this->dbh->prepare($wachtwoord'"query);
		$result = $myConn-this->executeSQL($query)stmt->execute();
        	if (! $resultresult) !{
           		 die('<pre>Oops, Error execute query '.$query.'</pre><br><pre>'.'Result code: '.$result.'</pre>');
       		 }
			 $this->resultSet = $this->stmt->fetchAll(PDO::FETCH_ASSOC);
       		return count($this->resultSet);
	}

    public function getRow(){
	if (count($this->resultSet) >0 ) {
			echoreturn "<brarray_shift($this-> Login as $user <br>"resultSet);
        } else {
			echoreturn "<br> Invalid login! <br>";0;
        }
    }


}

$DB = new DB;

?>

Create de database met het script dat hier rechts staat.

Test of de login werkt.

Voer dan als wachtwoord ' OR '1'='1 in. Kijk wat er gebeurt en en leg uit wat er gebeurt. Hoer heet deze techniek?

Opdracht

Maak de code zodanig veilig dat het truuckje wat hier boven is beschreven niet meer werkt.

--