Structurer son site

Structurer son code

Les enjeux

Structurer son code permet de :

- Garder une bonne lisibilité

- Simplifier la maintenance

- Réduire le nombre de bugs

- Réduire la quantité de code à écrire

Les problèmes classiques

Lors de la création d'un site, on rencontre souvent les trois mêmes problèmes  :

- Ré-écriture du même code

- Code difficile à lire

- Failles de sécurités

Heureusement, PHP offre des fonctionnalités capables de résoudre ces différents problèmes.

Utiliser include

Dont Repeat Yourself

Le principe du D.R.Y est de ne pas ré-écrire le même code plusieurs fois.

Ré-écrire du code :

- Augmente le risque de bug

- Rend plus complexe la modification

- Rend la maintenance plus complexe

- Fait travailler plus pour un résultat moins bon

Parties communes d'un site

Dans un site web, certaines parties sont souvent communes à plusieurs pages :

- Le head

- Le header

- Le menu

- Le footer

- La sidebar

Pour éviter de répéter le code, on peut écrire chacune de ces partis dans un fichier dédié, et inclure ces fichiers dans la page finale grâce à la fonction include.

Organiser le code

Quand on inclus les différentes parties d'une page, on se retrouve avec beaucoup de fichiers.

Pour ne pas se perdre dans la masse, on a intérêt à regrouper toutes les parties à inclure dans un dossier.

Souvent, on nomme ce dossier "incs".

Bloquer l'accès aux incs

Les fichiers dans le dossier ./incs ne sont pas des pages. Elles ne sont pas destinées à être accessible directement aux utilisateurs.

Il faut donc interdire aux utilisateurs l'accès à ces pages depuis internet, sans bloquer l'accès pour les autres scripts PHP.

On va donc demander directement au serveur de ne pas autoriser les utilisateurs à accéder aux fichiers dans ./incs.

Pour cela, on créer un fichier .htaccess dans le dossier ./incs, avec le contenu suivant :

deny from all

Regrouper les fonctions

Séparer les différentes logiques

Dans une application, on peut souvent trouver plusieurs niveaux de traitement.

Couche de traitement :

Comment l'application va traiter les données. Quelles règles elle va appliquer.

Couche d'accès :

Comment l'application va accéder aux données. 90% du temps, c'est la liaison à la base de données.

Couche de présentation :

La présentation correspond à la façon dont les données sont présentées à l'utilisateur.

Organiser la communication

Pour avoir une application qui fonctionne bien, il faut définir clairement quelle couche va discuter avec quelle couche.

Accès

Présentation

Traitement

Deux groupes de fonctions

Dans une application, on peut presque toujours séparer les fonctions en deux groupes au moins.

Les outils :

Ce sont des fonctions qui servent à effectuer des tâches de traitement souvent simples mais utilisées suffisamment régulièrement  pour êtres factorisées.

L'accès aux données :

Ce sont des fonctions qui servent à récupérer les données à traiter/afficher. Souvent, mais pas toujours, depuis une base.

En terme de code, cela signifie que nous avons intérêts à séparer les deux types de fonctions dans deux fichiers distincts.

Nous allons donc créer un fichier tools.php et un fichier datas.php. Le tout dans un dossier functions.

functions

tools.php

datas.php

Inclure les fonctions

Pour pouvoir utiliser les fonctions, il faudra inclure ces deux fichiers. Les fonctions peuvent êtres utilisées à tout moment, il faut donc les inclure en premier.

Par conséquent, on sait que chaque page du site devra commencer par les lignes suivantes :

<?php
    require_once('./functions/tools.php');
    require_once('./functions/datas.php');

Organiser une page

Structurer la page

Pour rendre le code lisible, on a toujours intérêts à séparer les différentes couches de l'application.

Sans framework, les couches de traitement et de présentation sont mélangées.

Pour limiter ce mélange et rendre le code plus lisible et maintenable, il est possible d'adopter une technique très simple : toujours écrire la couche de traitement au début du fichier.

Concrètement, tout le code PHP qui récupére des données, effectue des traitements, gère des données envoyées par l'utilisateur sera situé dans un bloc PHP au tout début du fichier.

L'ensemble de l'affichage du HTML et des données sera fait dans la suite du fichier, majoritairement en dehors de bloc PHP.

Page

Couche de traitement PHP

Couche de présentation HTML

Affichage de variables PHP

Exemple de code

Imaginons une page qui récupère des utilisateurs sous forme de tableau, et qui dois afficher un tableau HTML avec email, mot de passe et date de naissance.

Voyons un exemple de code qui ne sépare pas le traitement et la présentation, et un exemple avec la séparation.

Sans séparation.

<?php
    //Include functions
    include('./functions/tools.php');
    include('./functions/datas.php');

    //include head & header
    include('./incs/head.php');
    include('./incs/header.php');

    echo '<h1>Mes utilisateurs</h1>';

    echo '
    <table>
        <tr>
            <th>Email</th>    
            <th>Password</th>
            <th>Date naissance</th>
        </tr>';

    $users = get_users();

    foreach ($users as $user)
    {
        echo '
        <tr>
            <td>' . $user['email'] . '</td>
            <td>' . $user['password'] . '</td>
            <td>' . $user['birthdate'] . '</td>
        </tr>';   
    }

    echo '
    </table>';

    include('./footer.php');
?>

Avec séparation.

<?php
    //Include functions
    include('./functions/tools.php');
    include('./functions/datas.php');


    //Traitement
    $users = get_users();
?>

    //include head & header
<?php include('./incs/head.php'); ?>
<?php include('./incs/header.php'); ?>

<h1>Mes utilisateurs</h1>

<table>
    <tr>
        <th>Email</th>    
        <th>Password</th>
        <th>Date naissance</th>
    </tr>

    <?php foreach ($users as $user) { ?>
        <tr>
            <td><?php echo $user['email']; ?></td>
            <td><?php echo $user['password']; ?></td>
            <td><?php echo $user['birthdate']; ?></td>
        </tr>
    <?php } ?>

</table>

<?php
    include('./footer.php');
?>

Écrire du HTML avec PHP

Générer du HTML proprement

De façon générale, nous séparons le HTML du PHP au maximum. Cependant, nous avons souvent besoin d'afficher des données de façon dynamique.

Pour cela, la règle est simple : écrire le maximum de code en HTML. Utiliser autant que possible les tags PHP.

Écrire de façon lisible

Afficher une variable :

<p><strong>Nom : </strong><?php echo $name; ?></p>

Utiliser une condition :

<?php if ($age < 18) { ?>
    <p>Ce site est interdit aux moins de 18 ans !</p>
<?php } else { ?>
    <p>Bienvenu sur le site !</p>
<?php } ?>

Utiliser une boucle :

<?php foreach ($users as $user) { ?>
    <p><strong>Pseudo : </strong><?php echo $user['pseudo']; ?></p>
<?php } ?>

Éviter les failles de sécurité

Les failles XSS

Une faille XSS (Coss Site Scripting),  c'est une faille de sécurité qui consiste à injecter des données interprétables par un navigateur dans une page web.

Le plus souvent, il s'agit d'injecter du code Javascript dans une page.

Les failles XSS peuvent permettre de voler des cookies, modifier le HTML, voler des données, faire des requêtes, rediriger l'utilisateur vers une autre page, etc.

Comment se produit une faille XSS

Quand nous affichons une variable en PHP, nous faisons confiance aux données. Si la donnée viens de l'utilisateur, celui-ci peut y mettre ce qu'il veut.

Dans ce cas, l'utilisateur peut fournir des données dangereuses (par exemple du javascript), et quand nous afficherons la donnée, nous créerons une faille XSS !

Comment se protéger des attaques XSS ?

Pour se protéger des attaques XSS, la solution est assez simple : s'assurer que l'on affiche pas du code.

Vérifier que des données ne contiennent pas de code est TRÈS compliqué ! La solution la plus simple ? Échapper tous les caractères HTML !

Ça tombe bien, PHP a une fonction pour ça, htmlspecialchars.

Pour se protéger des failles XSS, à chaque fois que vous afficher des données utilisateur VOUS DEVEZ utilisez htmlspecialchars.

Code dangereux

<?php echo $user['pseudo']; ?>

Code sécurisé

<?php echo htmlspecialchars($user['pseudo']); ?>

Quelques particularités

Si vous devez afficher la chaîne dans une balise HTML déjà existante, vous devrez rajouter un flag ENT_QUOTES dans htmlspecialchars.

La protection XSS doit se faire au moment de l'affichage. Pas au moment de la réception des données.

Faille d'affichage = protection d'affichage.

<p style="<?php echo htmlspecialchars($style, ENT_QUOTES); ?>">Some string</p>

Architecture finale

Structurer son site

By plebweb

Structurer son site

  • 579