Full address book with PHP/Mysql & Security

Dev Full address book with PHP/Mysql & Security

  •  Thread starter
  •  Admin
  • Objectif:

    Créer un carnet d'adresses en PHP et MySQL, inclus la gestion des utilisateurs, la sécurité, la manipulation de données, et une interface utilisateur.

    On vous explique comment vous pouvez le faire, y compris la création d'un formulaire de connexion et d'enregistrement sécurisés avec reCAPTCHA, ainsi qu'un calculateur de force du mot de passe.

    Structure du Projet

    ```
    /carnet_adresse/
    |-- index.php
    |-- login.php
    |-- register.php
    |-- contacts.php
    |-- logout.php
    |-- db.php
    |-- header.php
    |-- footer.php
    |-- style.css
    |-- password_strength.js
    |-- recaptcha.php (inclure la clé secrète)
    ```

    1. Fichier de Configuration et Connexion à la Base de Données (`db.php`)

    PHP:
    [/B]```php
    <?php
    $servername = "localhost";
    $username = "root";
    $password = ""; // Remplacez par votre mot de passe
    $dbname = "carnet_adresse";
    
    // Création de la connexion
    $conn = new mysqli($servername, $username, $password, $dbname);
    
    // Vérifie la connexion
    if ($conn->connect_error) {
        die("Erreur de connexion: " . $conn->connect_error);
    }
    ?>
    ```

    2. En-tête et Pied de Page (`header.php` et `footer.php`)

    *header.php*

    PHP:
    [/B]
    <!DOCTYPE html>
    <html lang="fr">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" href="style.css">
        <title>Carnet d'adresses</title>
    </head>
    <body>
        <header>
            <h1>Carnet d'adresses</h1>
            <nav>
                <a href="index.php">Accueil</a>
                <a href="login.php">Connexion</a>
                <a href="register.php">S'inscrire</a>
                <a href="contacts.php">Contacts</a>
                <a href="logout.php">Déconnexion</a>
            </nav>
        </header>

    *footer.php*
    PHP:
    [/B]
    
        <footer>
            <p>© 2023 Carnet d'adresses</p>
        </footer>
    </body>
    </html>
    ```

    3. Page d'Accueil (`index.php`)


    PHP:
    [/B]<?php include 'header.php'; ?>
    
    <h2>Bienvenue dans votre carnet d'adresses</h2>
    <p>Veuillez vous connecter ou vous inscrire pour commencer !</p>
    
    <?php include 'footer.php'; ?>


    4. Formulaire de Connexion (`login.php`)


    PHP:
    [/B]<?php
    session_start();
    include 'db.php';
    include 'header.php';
    
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
        $email = $conn->real_escape_string($_POST['email']);
        $password = $_POST['password'];
    
        // Recherche de l'utilisateur
        $query = "SELECT * FROM users WHERE email='$email'";
        $result = $conn->query($query);
    
        if ($result->num_rows > 0) {
            $user = $result->fetch_assoc();
            // Vérification du mot de passe
            if (password_verify($password, $user['password'])) {
                $_SESSION['user_id'] = $user['id'];
                header("Location: contacts.php");
                exit();
            } else {
                $error = "Mot de passe invalide.";
            }
        } else {
            $error = "Aucun utilisateur trouvé.";
        }
    }
    ?>
    
    <h2>Connexion</h2>
    <form method="post" action="">
        <label>Email:</label>
        <input type="email" name="email" required>
        <br>
        <label>Mot de passe:</label>
        <input type="password" name="password" required>
        <br>
        <button type="submit">Se connecter</button>
    </form>
    <?php if (isset($error)) echo "<p style='color:red;'>$error</p>"; ?>
    
    <?php include 'footer.php'; ?>

    5. Formulaire d'Inscription (`register.php`)


    PHP:
    [/B]<?php
    session_start();
    include 'db.php';
    include 'header.php';
    
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
        $email = $conn->real_escape_string($_POST['email']);
        $password = $_POST['password'];
        $password_hash = password_hash($password, PASSWORD_DEFAULT);
       
        // Vérification ReCAPTCHA
        $recaptchaResponse = $_POST['g-recaptcha-response'];
        $secretKey = "votre_clé_secrète"; // Remplacez par votre clé secrète
        $response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=$secretKey&response=$recaptchaResponse");
        $responseKeys = json_decode($response, true);
    
        if(intval($responseKeys["success"]) !== 1) {
            $error = "Veuillez confirmer que vous n'êtes pas un robot.";
        } else {
            // Insertion de l'utilisateur
            $query = "INSERT INTO users (email, password) VALUES ('$email', '$password_hash')";
            if ($conn->query($query) === TRUE) {
                header("Location: login.php");
                exit();
            } else {
                $error = "Erreur: " . $conn->error;
            }
        }
    }
    ?>
    
    <h2>S'inscrire</h2>
    
    <form method="post" action="">
        <label>Email:</label>
        <input type="email" name="email" required>
        <br>
        <label>Mot de passe:</label>
        <input type="password" name="password" id="password" required onkeyup="checkPasswordStrength()">
        <span id="password-strength"></span>
        <br>
        <div class="g-recaptcha" data-sitekey="votre_clé_site"></div>
        <button type="submit">S'inscrire</button>
    </form>
    <?php if (isset($error)) echo "<p style='color:red;'>$error</p>"; ?>
    
    <script src='https://www.google.com/recaptcha/api.js'></script>
    <script src="password_strength.js"></script>
    
    <?php include 'footer.php'; ?>


    6. Gestion de contacts (`contacts.php`)


    PHP:
    [/B]<?php
    session_start();
    if (!isset($_SESSION['user_id'])) {
        header("Location: login.php");
        exit();
    }
    
    include 'db.php';
    include 'header.php';
    
    // Ajout et mise à jour de contact ici
    
    // Exemple : Afficher les contacts
    $result = $conn->query("SELECT * FROM contacts WHERE user_id = " . $_SESSION['user_id']);
    ?>
    
    <h2>Mes Contacts</h2>
    <table>
        <tr>
            <th>ID</th>
            <th>Nom</th>
            <th>Email</th>
            <th>Actions</th>
        </tr>
        <?php while ($contact = $result->fetch_assoc()): ?>
        <tr>
            <td><?php echo $contact['id']; ?></td>
            <td><?php echo $contact['name']; ?></td>
            <td><?php echo $contact['email']; ?></td>
            <td>
                <a href="edit_contact.php?id=<?php echo $contact['id']; ?>">Éditer</a>
                <a href="delete_contact.php?id=<?php echo $contact['id']; ?>">Supprimer</a>
            </td>
        </tr>
        <?php endwhile; ?>
    </table>
    
    <?php include 'footer.php'; ?>


    7. Calculateur de Force du Mot de Passe (`password_strength.js`)

    JavaScript:
    [/B]
    function checkPasswordStrength() {
        var password = document.getElementById("password").value;
        var strengthText = document.getElementById("password-strength");
        var strength = 0;
       
        if (password.length > 7) strength++;
        if (password.match(/[a-z]/)) strength++;
        if (password.match(/[A-Z]/)) strength++;
        if (password.match(/[0-9]/)) strength++;
        if (password.match(/[\W_]/)) strength++;
    
        switch (strength) {
            case 0:
            case 1:
                strengthText.innerHTML = "<span style='color:red;'>Très faible</span>";
                break;
            case 2:
                strengthText.innerHTML = "<span style='color:orange;'>Faible</span>";
                break;
            case 3:
                strengthText.innerHTML = "<span style='color:yellow;'>Moyenne</span>";
                break;
            case 4:
            case 5:
                strengthText.innerHTML = "<span style='color:green;'>Forte</span>";
                break;
        }
    }

    8. Style CSS (`style.css`)

    CSS:
    [/B]
    body {
        font-family: Arial, sans-serif;
        line-height: 1.6;
        margin: 0;
        padding: 0;
    }
    
    header {
        background: #333;
        color: #fff;
        padding: 10px 0;
        text-align: center;
    }
    
    nav a {
        color: #fff;
        padding: 10px;
        text-decoration: none;
    }
    
    nav a:hover {
        background: #555;
    }
    
    footer {
        text-align: center;
        padding: 10px 0;
        background: #333;
        color: #fff;
        position: absolute;
        bottom: 0;
        width: 100%;
    }
    
    table {
        width: 100%;
        border-collapse: collapse;
    }
    
    table, th, td {
        border: 1px solid #dddddd;
    }
    
    th, td {
        padding: 8px;
        text-align: left;
    }
    ```

    9. Déconnexion (`logout.php`)


    PHP:
    [/B]
    <?php
    session_start();
    session_destroy();
    header("Location: index.php");
    exit();
    ?>


    Réglages de la Base de Données

    Vous devrez créer une base de données MySQL avec les tables nécessaires (`users`, `contacts`). Voici un exemple de requêtes SQL pour créer ces tables.

    PHP:
    [/B]
    CREATE DATABASE carnet_adresse;
    
    USE carnet_adresse;
    
    CREATE TABLE users (
        id INT(11) AUTO_INCREMENT PRIMARY KEY,
        email VARCHAR(100) NOT NULL,
        password VARCHAR(255) NOT NULL
    );
    
    CREATE TABLE contacts (
        id INT(11) AUTO_INCREMENT PRIMARY KEY,
        user_id INT(11) NOT NULL,
        name VARCHAR(100) NOT NULL,
        email VARCHAR(100) NOT NULL,
        FOREIGN KEY (user_id) REFERENCES users(id)
    );
    ```

    Conclusion

    Ce projet est un bon exemple d'un carnet d'adresses de base utilisant PHP et MySQL. Vous pouvez l'étendre avec des fonctionnalités supplémentaires, y compris la validation plus poussée des formulaires, le tri et le filtrage des contacts, ainsi que des fonctionnalités de messagerie. Veillez à toujours garder la sécurité à l'esprit, en particulier lors de la manipulation de données utilisateurs.

    EnjoyCoding :)
     
    Last edited:
    Back
    Top