......@@ -11,6 +11,8 @@
echo '<form action="formEtAffiche.php" method="get">
<label for="nom">Saisir un commentaire</label>
<textarea name="commentaire" rows="5" cols="40"></textarea>
<input type="text" required name="nom">
<input type="submit" value="Envoyer">
</form>';
if (isset($_REQUEST['commentaire'])) {
......
......@@ -40,7 +40,7 @@ echo "Hello, " . $name . "!";
<input type="email" name="input_email" placeholder="email">
<TextArea name="input_longtext">Lorem ipsum dolor sit amet</TextArea>
---
+++
## Différant type d'input
### Boutons
......@@ -58,7 +58,7 @@ echo "Hello, " . $name . "!";
</form>
---
+++
## Différant type d'input
### Séléction
......@@ -74,7 +74,8 @@ echo "Hello, " . $name . "!";
<label for="checkbox2">Check me too</label>
<input type="checkbox" id="checkbox2" />
---
+++
## Différant type d'input
### Séléction
......@@ -91,7 +92,8 @@ echo "Hello, " . $name . "!";
<label for="radio2">Option 2</label>
<input type="radio" id="radio2" value="option2" />
---
+++
## Différant type d'input
### Séléction
......@@ -119,7 +121,7 @@ echo "Hello, " . $name . "!";
</datalist>
</form>
---
+++
## Différant type d'input
### Séléction
......@@ -210,3 +212,81 @@ formEtAffiche.php
### DAMN VULNERABLE WEB APPLICATION
<small>/!\ Interdiction d'installer cet outil sur les postes ou le serveur Docker de l'IUT /!\ </small>
<img src="../../img/dvwa.svg" style="height: 30vh" alt="accessibility text">
---
```php[6-7|15|17-22|32-35|51-56|60-70]
<?php
// process.php
// Sécurisation des données du formulaire en utilisant htmlspecialchars() pour éviter les failles XSS
// htmlspecialchars convertit les caractères spéciaux en entités HTML afin de neutraliser le code malveillant
$name = htmlspecialchars($_REQUEST['name'] ?? ''); // Récupère et nettoie le champ "name"
$email = htmlspecialchars($_REQUEST['email'] ?? ''); // Récupère et nettoie le champ "email"
// Tableau qui va stocker les messages d'erreur
$errors = [];
// --- VALIDATION DES DONNÉES ---
// Validation de la présence des données (Vérification que les champs obligatoires ne sont pas vides)
if (!empty($_REQUEST)) {
// Validation du champ 'name'
if (empty($name)) {
$errors[] = "Le champ 'Nom' est requis."; // Champ vide : ajout d'un message d'erreur
} elseif (strlen($name) < 3) {
// Validation de la longueur du nom (minimum 3 caractères)
$errors[] = "Le nom doit contenir au moins 3 caractères.";
}
// Validation du format de l'adresse e-mail (assure que l'e-mail soumis est dans un format valide)
if (empty($email)) {
$errors[] = "Le champ 'Email' est requis."; // Champ vide : ajout d'un message d'erreur
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
// filter_var avec l'option FILTER_VALIDATE_EMAIL valide le format de l'email
$errors[] = "L'adresse e-mail est invalide."; // Si le format n'est pas correct, ajout d'une erreur
}
// Si aucune erreur n'est détectée, le traitement des données peut continuer (par exemple, stockage en base de données)
if (empty($errors)) {
echo "Bonjour, " . $name . "! Votre e-mail est " . $email . ".";
}
}
// --- AFFICHAGE DES ERREURS ET DU FORMULAIRE ---
// Le formulaire est affiché, soit initialement, soit après une soumission avec des erreurs
echo '<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Formulaire</title>
</head>
<body>';
// Affichage des erreurs s'il y en a
if (!empty($errors)) {
foreach ($errors as $error) {
// Affiche chaque message d'erreur en rouge
echo "<p style='color:red;'>Erreur : " . $error . "</p>";
}
}
// Affichage du formulaire
// Les valeurs saisies par l'utilisateur sont réinjectées dans les champs du formulaire grâce à l'attribut 'value'
echo '<form action="process.php" method="get">
<label for="name">Nom:</label>
<input type="text" name="name" id="name" value="' . $name . '" required>
<br>
<label for="email">Email:</label>
<input type="email" name="email" id="email" value="' . $email . '" required>
<br>
<button type="submit">Envoyer</button>
</form>';
echo '</body></html>';
```
# MVC
## Modele Vue Controller
---
### Arborescence du projet
```txt
project_root/
├── app/
├── config/
│ └── config.php
└── public/
```
---
### Arborescence du projet
#### /public
```txt
public/
├── index.php
├── print_hello.php
└── css/
└── style.css
```
---
### Arborescence du projet
#### /public/print_hello.php
```php
<?php
require_once '../app/controllers/HelloWorldController.php';
(new HelloWorldController())->index();
?>
```
---
### Arborescence du projet
#### /app
```txt[]
app/
├── controllers/
├── entities/
├── repositories/
├── services/
├── trait/
├── views/
└─ core/
```
---
### Arborescence du projet
#### /app/controllers
```php[1-4|6-10|12-15|17-20|22-25]
require_once '../app/core/Controller.php';
require_once '../app/services/HelloService.php';
class HelloWorldController extends Controller
{
private HelloService $helloService;
public function __construct()
{
$this->helloService = new HelloService();
}
public function index():void
{
$this->view('hello_world', $this->helloService->hello(), ['name' => 'Salim']);
}
public function indexJson():void
{
$this->json(['title' => $this->helloService->hello(), 'name' => 'Salim']);
}
public function redirectToJson()
{
$this->redirectTo('/json.php');
}
}
```
---
### Arborescence du projet
#### /app/entities et /app/repositories
##### Entities
- Classes représentant les tables de la base de données
##### Repositories
- Gestion des connexions à la base de données et exécution des requêtes SQL
---
### Arborescence du projet
#### /app/services
```php[]
<?php
class HelloService
{
public function hello()
{
return 'Hello World!';
}
}
```
---
### Arborescence du projet
#### /app/trait
- Traits utilisés par les services ou les contrôleurs
---
### Arborescence du projet
#### /app/views
```php
public function index():void
{
$this->view('hello_world', $this->helloService->hello(), ['name' => 'Salim','errors'=>['Nom incorrect']]);
}
```
```php[]
<?php require '../app/views/_template/header.php'; ?>
<h1>Hello <?php echo $name; ?></h1>
<?php if (!empty($errors)): ?>
<?php foreach($errors as $error): ?>
<div class="alert alert-danger text-center" role="alert">
<?= $error; ?> //echo $error;
</div>
<?php endforeach; ?>
<?php endif; ?>
<?php require '../app/views/_template/footer.php'; ?>
```
---
### Arborescence du projet
#### /app/core/
```php[1|2|5-17|19-24|26-29]
abstract class Controller {
protected $viewPath = '../app/views/'; // Chemin vers les vues
protected function view(string $viewName, string $title = 'Titre de la page', array $data = [], $status = 200) {
$filePath = $this->viewPath . $viewName . '.php';
if (file_exists($filePath)) {
// Extraire les données pour qu'elles soient disponibles dans la vue comme des variables
extract($data);
http_response_code($status);
require $filePath;
} else {
throw new Exception("Vue non trouvée : " . $filePath);
}
}
protected function json($data, $status = 200) {
header('Content-Type: application/json');
http_response_code($status);
echo json_encode($data);
exit();
}
protected function redirectTo($url) {
header("Location: $url");
exit();
}
}
```
---
### Arborescence complète du projet :
| Rôle | Dossier |
|------------|------------------------------------------------------------|
| Modéle | - app/entities<br/> - app/repositories<br/> - app/services |
| Vue | - app/views |
| Controller | - app/controllers |
| Routes | - public |
## Les sessions
---
page1.php
```php
<?php
session_start();
$_SESSION['username'] = 'Jean';
?>
```
page2.php
```php
<?php
session_start();
echo $_SESSION['username']; // Affiche "Jean"
?>
```
---
page1.php
```php
// Sérialiser et stocker un objet utilisateur en session
session_start();
$user = new User("Jean", "Doe"); // Supposons que la classe User soit définie
$_SESSION['user'] = serialize($user);
?>
```
page2.php
```php
<?php
session_start();
$user = unserialize($_SESSION['user']);
echo $user->getFirstName(); // Affiche "Jean"
?>
```
---
```php[7-10|14-20|23-27]
<?php
class User {
// Ne pas stocker pour des raisons de sécurité
public function __construct(
private string $username;
private string $email;
private string $password;
) {}
// Contrôle des données à sérialiser
public function __serialize(): array {
return [
'username' => $this->username,
'email' => $this->email
]; // Exclut le mot de passe
}
// Restaure les données de l'objet lors de la désérialisation
public function __unserialize(array $data): void {
$this->username = $data['username'];
$this->email = $data['email'];
$this->password = ''; // Par sécurité, on ne restaure pas le mot de passe
}
}
```
Ce diff est replié.