Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Apprendre à développer un site web avec PHP et MySQL
  3. Sécurité
Extrait - Apprendre à développer un site web avec PHP et MySQL Exercices pratiques et corrigés (5e édition)
Extraits du livre
Apprendre à développer un site web avec PHP et MySQL Exercices pratiques et corrigés (5e édition) Revenir à la page d'achat du livre

Sécurité

Failles XSS

Une faille XSS (Cross Site Scripting) consiste à exécuter du code HTML, JavaScript ou VBScript à l’insu du webmaster.

Il existe deux sortes de XSS.

1. XSS non permanent

Ce type de faille peut se trouver lorsque vous appelez une page PHP avec des informations passées dans L’URL.

Par exemple, vous appelez la page get_recoit.php avec en paramètre nom=Jean :

http://127.0.0.1/get_recoit.php?nom=Jean

Dans la page get_recoit.php, le code suivant :

<?php 
   echo $_GET['nom']; 
?> 

Affiche :

Jean

Maintenant, si l’utilisateur remplace Jean par :

<script>alert('Bonjour')</script> 

La page get_recoit.php ouvre une pop-up affichant "Bonjour". En effet, le navigateur exécute le JavaScript généré par l’instruction echo $_GET[’nom’];

Dans ce cas, le code intrusif n’est qu’une alerte, mais l’utilisateur pourrait mettre un code pour lire vos cookies, rediriger vers une autre URL…

Pour empêcher cela, les navigateurs ont souvent activé la sécurité XSS par défaut qui prévient qu’un script se trouve dans l’URL et donc ne l’exécute pas.

Cependant, vous ne pouvez pas connaître à l’avance la configuration du navigateur de l’utilisateur, donc il vaut mieux empêcher ces scripts en ajoutant...

Droits sur la base de données

Lorsque vous vous connectez à la base de données en tant que "root", vous avez tous les droits. Donc lorsque vous ouvrez une connexion dans une page PHP en tant que root, vous pouvez être victime d’une injection SQL pouvant supprimer des données ou même une table complète !

Pour éviter ceci, vous pouvez créer des utilisateurs dans votre base de données qui n’auront que des droits limités puis vous connecter avec ceux-ci dans votre code PHP. Ainsi, quoi que l’utilisateur fasse, il ne pourra jamais supprimer des données.

Pour créer un utilisateur, il faut sélectionner votre base de données dans phpMyAdmin puis cliquer sur l’onglet Privilèges. L’objectif est d’ajouter un utilisateur ayant seulement des droits en lecture.

Cliquez sur le lien Ajouter un compte d’utilisateur. Entrez le nom "lit_seulement" dans la zone du nom et "123" dans la zone du mot de passe. Ensuite, cochez uniquement SELECT dans la zone des données.

images/10RI01V5.png

Cliquez sur le bouton Exécuter.

images/09RI03N4.png
images/09RI02N4.png

Ensuite, lorsque vous vous connectez à votre base de données dans une page PHP n’effectuant que de la lecture, utilisez le compte "lit_seulement".

La chaîne de connexion n’est plus :

<?php 
// Connexion à la base de données 
$base...

Injection SQL (addslashes)

L’injection SQL est le fait d’injecter un code SQL tapé par un utilisateur malveillant. Ce code permet de se loguer sans connaître le mot de passe, d’afficher tous les mots de passe ou même de détruire complètement votre table.

Pour effectuer ceci, l’utilisateur se sert d’un formulaire demandant un login et mot de passe, par exemple. Lorsqu’il clique sur le bouton de validation, vous vérifiez si la personne a un login et un mot de passe correct avec une requête du type :

<?php 
$login = $_POST['login']; 
$password = $_POST['mot_de_passe']; 
$sql = "SELECT * FROM Personne WHERE login='".$login."' 
AND password='".$password."'"; 
?> 

Si la requête retourne une ligne, c’est que la personne existe en base de données et donc que vous pouvez la connecter.

Si l’utilisateur ne saisit pas de vrais login et mot de passe, mais qu’il tape dans le champ login ’toto’ et dans le champ mot_de_passe : ’ OR 1=1 OR ’, la requête SQL devient :

$sql = "SELECT * FROM Personne WHERE login='toto' AND password='' 
OR 1=1 OR ''"; 

Le code OR 1=1 est toujours vrai donc la requête retourne toutes les lignes de la table Personne. Vous pouvez croire que la personne existe vraiment...

Vérification de la session

La session permet de stocker en mémoire un objet tant que l’utilisateur est connecté à votre site web. Prenez l’exemple d’un site avec une page permettant de se loguer avant d’arriver sur les autres pages de votre site qui sont page1.php, page2.php…

Dans votre page de login, vous vérifiez si la personne existe en base de données avant de rediriger sur page1.php. Mais rien n’empêche la personne de taper directement http://www.monsite.fr/page1.php pour arriver directement sur cette page sans être identifié. Effectivement, il faut que cette personne connaisse le nom de la page PHP mais souvent les noms de vos pages sont explicites : login.php, affichage.php, forum.php.

Pour remédier à ce problème, vous pouvez utiliser les sessions. Lorsque la personne est identifiée, vous stockez son identifiant en session puis il suffit de vérifier si la session est renseignée sur chaque page de votre site web.

Ainsi, dans toutes les pages PHP de votre site (sauf la page de connexion qui met en session l’identifiant), vous avez :

<?php 
session_start(); 
if (!isset($_SESSION['identifiant'])) { 
   //redirection sur la page de connexion 
   header("Location:connexion.php"); 
} 
?> 

Performances

1. PHP 7

Pour rappel, PHP est utilisé par 78 % de tous les sites web, mais encore 30 % de ces sites utilisent toujours PHP 5.6. La plupart des sites web sont en PHP 7.4, qui était déjà en moyenne 50 % plus rapide que PHP 5.6.

Comme le montre le graphique ci-dessous de Kinsta, PHP 8.1 est en moyenne 10 % plus rapide que PHP 7.2 dans les différents CMS et frameworks les plus utilisés.

images/10RI03V5.png

Ce deuxième graphique montre que sous WordPress, PHP  8.2 exécute 30 % de requêtes par seconde en plus que PHP 7.2, qui lui-même était deux fois plus rapide que son prédécesseur PHP 5.6.

images/10RI04V5.png

De plus, MySQL 8 est jusqu’à deux fois plus rapide que MySQL 5.7, surtout lorsqu’il y a beaucoup d’utilisateurs et de requêtes par seconde.

images/10RI05V5.png

2. Utilisation d’AST

PHP 7 ajoute AST (Abstract Syntax Tree, ou arbre syntaxique abstrait) permettant une représentation intermédiaire du code pendant la compilation. Il permet la mise en œuvre de syntaxes qui n’auraient pas été possibles avec un procédé de compilation en un seul passage (comme Uniform Variable Syntax par exemple). Ce nouveau procédé de compilation explique en partie l’amélioration des performances de PHP 7.

Les avantages sont :

  • Une performance accrue donc...