Explorar o código

Ajout d'une proposition de solution pour le TP4

akrah %!s(int64=6) %!d(string=hai) anos
pai
achega
32f69e26c0

+ 71 - 0
correction/TP4/adduser.php

@@ -0,0 +1,71 @@
+<?php
+/******************************************************************************
+ * On démarre la session
+ */
+session_start();
+
+// On reset les messages
+unset($_SESSION['message']);
+
+/******************************************************************************
+ * On vérifie que la méthode HTTP utilisée est bien POST
+ */
+if ($_SERVER['REQUEST_METHOD'] != 'POST')
+{
+    header('Location: signup.php');
+    exit();
+}
+
+// On vérifie qu'on a bien reçu les données en POST
+if ( !isset($_POST['login'],$_POST['password'],$_POST['confirm']) )
+{
+    $_SESSION['message'] = "Some POST data are missing.";
+    header('Location: signup.php');
+    exit();
+}
+
+// On les sécurise les données POST.
+$login = htmlspecialchars($_POST['login']);
+$password = htmlspecialchars($_POST['password']);
+$confirm = htmlspecialchars($_POST['confirm']);
+
+if ( $password !== $confirm )
+{
+    $_SESSION['message'] = "The two passwords differ.";
+    header('Location: signup.php');
+    exit();
+}
+
+/******************************************************************************
+ * On inclut le fichier contenant la définition de la classe User
+ */
+require_once('models/User.php');
+
+//On crée l'utilisateur
+$user = new User($login,$password);
+
+try {
+    // On crée l'utilisateur dans la BDD
+    $user->create();
+}
+catch (PDOException $e) {
+    // Si erreur lors de la création de l'objet PDO
+    // (déclenchée par MyPDO::pdo())
+    $_SESSION['message'] = $e->getMessage();
+    header('Location: signup.php');
+    exit();
+}
+catch (Exception $e) {
+    // Si erreur durant l'exécution de la requête
+    // (déclenchée par le throw de $user->create())
+    $_SESSION['message'] = $e->getMessage();
+    header('Location: signup.php');
+    exit();
+}
+
+/******************************************************************************
+ * Si tout est ok, on indique que le compte est crée et on se rend sur signin.php
+ */
+$_SESSION['message'] = "Account created! Now, signin.";
+header('Location: signin.php');
+exit();

+ 68 - 0
correction/TP4/authenticate.php

@@ -0,0 +1,68 @@
+<?php
+/******************************************************************************
+ * On démarre la session
+ */
+session_start();
+
+// On reset les messages
+unset($_SESSION['message']);
+
+/******************************************************************************
+ * On vérifie que la méthode HTTP utilisée est bien POST
+ */
+if ($_SERVER['REQUEST_METHOD'] != 'POST')
+{
+    header('Location: signin.php');
+    exit();
+}
+
+// On vérifie qu'on a bien reçu les données en POST
+if ( !isset($_POST['login'],$_POST['password']) )
+{
+    $_SESSION['message'] = "Some POST data are missing.";
+    header('Location: signin.php');
+    exit();
+}
+
+// On les sécurise les données POST.
+$login = htmlspecialchars($_POST['login']);
+$password = htmlspecialchars($_POST['password']);
+
+/******************************************************************************
+ * On inclut le fichier contenant la définition de la classe User
+ */
+require_once('models/User.php');
+
+//On crée l'utilisateur
+$user = new User($login,$password);
+
+try {
+    // On vérifie qu'il existe dans la BDD
+    if ( !$user->exists() )
+    {
+        $_SESSION['message'] = 'Wrong login/password.';
+        header('Location: signin.php');
+        exit();
+    }
+}
+catch (PDOException $e) {
+    // Si erreur lors de la création de l'objet PDO
+    // (déclenchée par MyPDO::pdo())
+    $_SESSION['message'] = $e->getMessage();
+    header('Location: signin.php');
+    exit();
+}
+catch (Exception $e) {
+    // Si erreur durant l'exécution de la requête
+    // (déclenchée par le throw de $user->exists())
+    $_SESSION['message'] = $e->getMessage();
+    header('Location: signin.php');
+    exit();
+}
+
+/******************************************************************************
+ * Si tout est ok, on se connecte et se rend sur welcome.php
+ */
+$_SESSION['user'] = $login;
+header('Location: welcome.php');
+exit();

+ 80 - 0
correction/TP4/changepassword.php

@@ -0,0 +1,80 @@
+<?php
+/******************************************************************************
+ * On démarre la session
+ */
+session_start();
+
+// On reset les messages
+unset($_SESSION['message']);
+
+/******************************************************************************
+ * On vérifie que l'utilisateur est connecté
+ */
+if ( !isset($_SESSION['user']) )
+{
+    header('Location: signin.php');
+    exit();
+}
+
+/******************************************************************************
+ * On vérifie que la méthode HTTP utilisée est bien POST
+ */
+if ($_SERVER['REQUEST_METHOD'] != 'POST')
+{
+    header('Location: formpassword.php');
+    exit();
+}
+
+// On vérifie qu'on a bien reçu les données en POST
+if ( !isset($_POST['newpassword'],$_POST['confirmpassword']) )
+{
+    $_SESSION['message'] = "Some POST data are missing.";
+    header('Location: formpassword.php');
+    exit();
+}
+
+// On les sécurise les données POST.
+$login           = $_SESSION['user'];
+$newpassword     = htmlspecialchars($_POST['newpassword']);
+$confirmpassword = htmlspecialchars($_POST['confirmpassword']);
+
+// On s'assure que les 2 mts de passes corrspondent
+if ( $newpassword != $confirmpassword )
+{
+    $_SESSION['message'] = "Error: passwords are different.";
+    header('Location: formpassword.php');
+    exit();
+}
+
+/******************************************************************************
+ * On inclut le fichier contenant les informations de connexion à la BDD
+ */
+ require_once('models/User.php');
+
+ //On crée l'utilisateur
+ $user = new User($login);
+
+try {
+    $user->changePassword($newpassword);
+}
+catch (PDOException $e) {
+    // Si erreur lors de la création de l'objet PDO
+    // (déclenchée par MyPDO::pdo())
+    $_SESSION['message'] = $e->getMessage();
+    header('Location: formpassword.php');
+    exit();
+}
+catch (Exception $e) {
+    // Si erreur durant l'exécution de la requête
+    // (déclenchée par le throw de $user->changePassword())
+    $_SESSION['message'] = $e->getMessage();
+    header('Location: formpassword.php');
+    exit();
+}
+
+/******************************************************************************
+ * Si tout est ok, on retourne sur welcome.php
+ */
+$_SESSION['message'] = "Password successfully updated.";
+header('Location: welcome.php');
+exit();

+ 56 - 0
correction/TP4/deleteuser.php

@@ -0,0 +1,56 @@
+<?php
+/******************************************************************************
+ * On démarre la session
+ */
+session_start();
+
+// On reset les messages
+unset($_SESSION['message']);
+
+/******************************************************************************
+ * On vérifie que l'utilisateur est connecté
+ */
+if ( !isset($_SESSION['user']) )
+{
+    header('Location: signin.php');
+    exit();
+}
+
+$login = $_SESSION['user'];
+
+/******************************************************************************
+ * On inclut le fichier contenant la définition de la classe User
+ */
+require_once('models/User.php');
+
+//On crée l'utilisateur
+$user = new User($login);
+
+// Création de l'objet PDO
+try {
+    // On crée l'utilisateur dans la BDD
+    $user->delete();
+}
+catch (PDOException $e) {
+    // Si erreur lors de la création de l'objet PDO
+    // (déclenchée par MyPDO::pdo())
+    $_SESSION['message'] = $e->getMessage();
+    header('Location: welcome.php');
+    exit();
+}
+catch (Exception $e) {
+    // Si erreur durant l'exécution de la requête
+    // (déclenchée par le throw de $user->create())
+    $_SESSION['message'] = $e->getMessage();
+    header('Location: welcome.php');
+    exit();
+}
+
+/******************************************************************************
+ * Si tout est ok, on détruit la session et retourne sur signin.php
+ */
+session_destroy();
+session_start();
+$_SESSION['message'] = "Account successfully deleted.";
+header('Location: signin.php');
+exit();

+ 31 - 0
correction/TP4/formpassword.php

@@ -0,0 +1,31 @@
+<?php
+    session_start();
+    if ( !isset($_SESSION['user']) )
+    {
+        header('Location: signin.php');
+        exit();
+    }
+?>
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta charset="utf-8">
+		<title>Change password</title>
+	</head>
+	<body>
+		<h1>Change password</h1>
+		<form action="changepassword.php" method="post">
+			<label for="newpassword">New password</label>         <input type="password" id="newpassword"     name="newpassword"     required>
+			<label for="confirmpassword">Confirm password</label> <input type="password" id="confirmpassword" name="confirmpassword" required>
+			<input type="submit" value="Change my password">
+		</form>
+		<p>
+			Go back to <a href="welcome.php">Home</a>.
+		</p>
+        <?php if ( isset($_SESSION['message']) && !empty($_SESSION['message']) ) { ?>
+        		<section>
+        			<p><?= $_SESSION['message']; ?></p>
+        		</section>
+        <?php } ?>
+	</body>
+</html>

+ 89 - 0
correction/TP4/models/User.php

@@ -0,0 +1,89 @@
+<?php
+
+require_once("MyPDO.php");
+
+class User
+{
+	private $_login;
+	private $_password;
+
+	private const USER_TABLE = "Users";
+
+	public function __construct( string $login, string $password = null )
+	{
+		$this->setLogin($login);
+		$this->setPassword($password);
+	}
+
+	public function login() : string
+	{
+		return $this->_login;
+	}
+
+	public function setLogin( string $login ) : void
+	{
+		$this->_login = $login;
+	}
+
+	public function password() : string
+	{
+		return $this->_password;
+	}
+
+	public function setPassword( ?string $password ) : void
+	{
+		$this->_password = $password;
+	}
+
+	public function exists() : bool
+	{
+		// 1. On prépare la requête $result
+		$result = MyPDO::pdo()->prepare('SELECT password FROM '.User::USER_TABLE.' WHERE user = :user');
+		// 2. On assigne $login au paramêtre :user
+	    $ok = $result->bindValue( ":user", $this->_login, PDO::PARAM_STR );
+		// 3. On exécute la requête $result
+	    $ok &= $result->execute();
+
+		if (!$ok)
+			throw new Exception("Error: user access in DB failed.");
+
+		// 4. On vérifie que l'utilisateur a été trouvé et que son mot de passe
+		//    correspond à celui de l'attribut $this->_password
+		$user = $result->fetch(PDO::FETCH_ASSOC);
+		return $user && password_verify($this->_password,$user['password']);
+	}
+
+	public function create() : void
+	{
+		$result = MyPDO::pdo()->prepare('INSERT INTO '.User::USER_TABLE.'(user,password) VALUES (:user,:password)');
+	    $ok =  $result->bindValue( ":user", $this->_login, PDO::PARAM_STR );
+	    $ok &= $result->bindValue( ":password", password_hash($this->_password,PASSWORD_DEFAULT), PDO::PARAM_STR );
+	    $ok &= $result->execute();
+
+		if ( !$ok )
+			throw new Exception("Error: user creation in DB failed.");
+	}
+
+	public function changePassword( string $newpassword ) : void
+	{
+		$result = MyPDO::pdo()->prepare('UPDATE '.User::USER_TABLE.' SET password=:password WHERE user=:login');
+		$ok =  $result->bindValue(':login',    $this->_login, PDO::PARAM_STR);
+		$ok &= $result->bindValue(':password', password_hash($newpassword,PASSWORD_DEFAULT), PDO::PARAM_STR);
+		$ok &= $result->execute();
+
+		if ( !$ok || $result->rowCount() != 1 )
+			throw new Exception("Error: password updating failed.");
+
+		$this->setPassword($newpassword);
+	}
+
+	public function delete() : void
+	{
+		$result = MyPDO::pdo()->prepare('DELETE FROM '.User::USER_TABLE.' WHERE user = :login');
+		$ok =  $result->bindValue(':login', $this->_login, PDO::PARAM_STR);
+		$ok &= $result->execute();
+
+		if ( !$ok || $result->rowCount() != 1 )
+			throw new Exception("Error while deleting your account.");
+	}
+}

+ 5 - 0
correction/TP4/models/bdd.php

@@ -0,0 +1,5 @@
+<?php
+
+const SQL_DSN      = 'mysql:host=mysql.iutrs.unistra.fr;dbname=W31;charset=utf8';
+const SQL_USERNAME = '';
+const SQL_PASSWORD = '';

+ 26 - 0
correction/TP4/signin.php

@@ -0,0 +1,26 @@
+<?php
+	session_start();
+?>
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta charset="utf-8">
+		<title>Signin</title>
+	</head>
+	<body>
+		<h1>Signin</h1>
+		<form action="authenticate.php" method="post">
+			<label for="login">Login</label>       <input type="text"     id="login"    name="login"    required autofocus>
+			<label for="password">Password</label> <input type="password" id="password" name="password" required>
+			<input type="submit" value="Signin">
+		</form>
+		<p>
+			If you don't have an account, <a href="signup.php">signup</a> first.
+		</p>
+<?php if ( isset($_SESSION['message']) && !empty($_SESSION['message']) ) { ?>
+		<section>
+			<p><?= $_SESSION['message']; ?></p>
+		</section>
+<?php } ?>
+	</body>
+</html>

+ 4 - 0
correction/TP4/signout.php

@@ -0,0 +1,4 @@
+<?php
+    session_start();
+    session_destroy();
+    header('Location: signin.php');

+ 27 - 0
correction/TP4/signup.php

@@ -0,0 +1,27 @@
+<?php
+	session_start();
+?>
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta charset="utf-8">
+		<title>Signup</title>
+	</head>
+	<body>
+		<h1>Signup</h1>
+		<form action="adduser.php" method="post">
+			<label for="login">Login</label>              <input type="text"     id="login"    name="login"    required autofocus>
+			<label for="password">Password</label>        <input type="password" id="password" name="password" required>
+			<label for="confirm">Confirm password</label> <input type="password" id="confirm"  name="confirm"  required>
+			<input type="submit" value="Signup">
+		</form>
+		<p>
+			If you already have an account, <a href="signin.php">signin</a>.
+		</p>
+<?php if ( isset($_SESSION['message']) && !empty($_SESSION['message']) ) { ?>
+		<section>
+			<p><?= $_SESSION['message']; ?></p>
+		</section>
+<?php } ?>
+	</body>
+</html>

+ 31 - 0
correction/TP4/welcome.php

@@ -0,0 +1,31 @@
+<?php
+	session_start();
+	if ( !isset($_SESSION['user']) )
+	{
+        header('Location: signin.php');
+        exit();
+	}
+?>
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <title>My account</title>
+    </head>
+    <body>
+        <p>
+			Hello <?= $_SESSION['user']; ?> !<br>
+			Welcome on your account.
+		</p>
+		<ul>
+			<li><a href="changepassword.php">Change password.</a></li>
+			<li><a href="deleteuser.php">Delete my account.</a></li>
+		</ul>
+        <p><a href="signout.php">Sign out.</a></p>
+    </body>
+	<?php if ( isset($_SESSION['message']) && !empty($_SESSION['message']) ) { ?>
+			<section>
+				<p><?= $_SESSION['message']; ?></p>
+			</section>
+	<?php } ?>
+</html>