Filtrage en PHP

Les vérifications dans les formulaires HTML5 et en JavaScript sont valables uniquement côté client. Pour des raisons de sécurité, il faut réeffectuer complètement toutes les vérifications côté serveur. PHP met pour cela à la disposition des programmeurs tout un ensemble de filtres. La première des vérifications consiste à bien prendre en compte les caractères spéciaux.

Gestion des caractères spéciaux:

Les « magic quotes »:

Avant PHP 5.4, une directive concernant ces magic quotes existait. Si dans le fichier de configuration de PHP, la directive magic_quotes_gpc etait activée, PHP modifiait automatiquement certaines entrées de formulaires en procédant à des protections de certains caractères spéciaux par des insertion de « backslashes ». Par exemple

  • les caractères accentués

  • les apostrophes

  • les backslashes

Un peu à la manière de la fonction addslashes().

Cette protection était destinée à préparer les données avant des requêtes SQL pour empêcher une éventuelle injection SQL. Ce comportement automatique est toutefois parfois gênant si on veut simplement réafficher les chaines saisies et non pas les utiliser dans des requêtes SQL. En outre, on ne veut pas toujours protéger les chaines de la même façon selon l’usage qu’on veut en faire par la suite.

On peut vouloir dans certains cas, protéger des chaines par exemple:

  • htmlspecialchars() pour éviter des injections de code HTML

  • PDO::quote() pour se protéger d’injections SQL

<?php
  $pdo = new PDO('sqlite:./tmp/mydb.sqlite');
  $string = 'Orléans';
  print "Chaîne sans quotes: $string\n";
  print "Chaîne avec quotes: " . $pdo->quote($string) . "\n";

Cela ne vous dispense pas d’utiliser les PreparedStatement vus précédemment.

Les filtres PHP :

Les plus directs à utiliser sur les formulaires sont basés sur la fonction filter_input() avec en paramètre INPUT_GET ou INPUT_POST Voici quelques exemples typiques:

<?php
    $entier = filter_input(INPUT_POST, 'var1', FILTER_SANITIZE_NUMBER_INT);

    $url = filter_input(INPUT_POST, 'var2', FILTER_VALIDATE_URL);

    if (!filter_input(INPUT_GET, "email",  FILTER_VALIDATE_EMAIL))
        echo("Email non valide");
    else echo("Email valide");
    ?>

On peut aussi filtrer des carctères spéciaux:

<?php
$search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
$search_url = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_ENCODED);
echo "Vous avez recherché $search_html.\n";
echo "<a href='?search=$search_url'>Nouvelle recherche.</a>";
?>