Sécurité : Différence entre versions

De OviWiki
Aller à : navigation, rechercher
(Filtrez toutes les données externes)
 
(23 révisions intermédiaires par 5 utilisateurs non affichées)
Ligne 3 : Ligne 3 :
 
A vous de prouver leur validité.
 
A vous de prouver leur validité.
  
* Vérifier que la variable contient ce que vous attendez
+
Vérifier que la variable contient ce que vous attendez :
  
Utiliser ''intval'' si vous attendez un entier
+
* Utiliser ''intval'' si vous attendez un entier
  
Utiliser ''strval'' si vous attendez une chaîne
+
* Utiliser ''strval'' si vous attendez une chaîne
  
etc ...
+
* etc ...
  
 
<pre>
 
<pre>
Ligne 19 : Ligne 19 :
  
  
* Initialiser vos variables:
+
* Initialiser vos variables :
Code incorrect:
+
Code incorrect :
  
 
<pre>
 
<pre>
Ligne 29 : Ligne 29 :
 
// utilisation de $var
 
// utilisation de $var
 
</pre>
 
</pre>
Code correct:
+
Code correct :
 
<pre>
 
<pre>
 
$var = 0;
 
$var = 0;
Ligne 47 : Ligne 47 :
  
 
===Protection des variables de sorties ===
 
===Protection des variables de sorties ===
* '''Vers le navigateur''':
+
* '''Vers le navigateur''' :
 
*: Les variables à destination du navigateur doivent être protégées, utiliser la fonction :
 
*: Les variables à destination du navigateur doivent être protégées, utiliser la fonction :
 
*: '''''bab_toHtml()''''' ( voir [[Règles de codage#Protection des variables de sorties]] )
 
*: '''''bab_toHtml()''''' ( voir [[Règles de codage#Protection des variables de sorties]] )
*: Utiliser '''''urlencode()''''' pour les url.
+
*: Utiliser '''''urlencode()''''' pour les paramètres d'url.
  
 
* '''Vers la base de données''':
 
* '''Vers la base de données''':
**Toujours placer les données entre apostrophes quelque soit le type.
+
**Toujours placer les données entre apostrophes, quel que soit le type.
 
*: Exemple: '''select * from table where id='2''''
 
*: Exemple: '''select * from table where id='2''''
 
**Toujours utiliser db_escape_string() pour protéger les variables passées dans les requêtes SQL.
 
**Toujours utiliser db_escape_string() pour protéger les variables passées dans les requêtes SQL.
 
*:Exemple : select id from table where id_user=\''''''.$babDB->db_escape_string($var).'''''\';
 
*:Exemple : select id from table where id_user=\''''''.$babDB->db_escape_string($var).'''''\';
**Ou la méthode quote() qui permet de traiter les tableaux
+
**Ou la méthode quote() qui permet de sérialiser la variable si c'est un tableau
 
*:Exemple : select id from table where id_user=IN('''''.$babDB->quote($var).''''');
 
*:Exemple : select id from table where id_user=IN('''''.$babDB->quote($var).''''');
  
  
=== Affichage des messages de debug ===
+
====Javascript====
Utiliser la fonction bab_debug() ( Voir .[[Règles de codage#Debug]] )
+
  
 +
Lorsque c'est possible, il faut éviter d'utiliser '''innerHTML''', préférer les syntaxes : '''.appendChild(document.createTextNode(label));'''
 +
 +
=== Affichage des messages de debug ===
 +
Utiliser la fonction '''bab_debug()''' ( Voir .[[Règles de codage#Debug]] )
  
=== Configuration du serveur APACHE de développement ===
+
=== Configuration du serveur de développement ===
 
Le serveur de développement doit être configuré pour reporter les erreurs.
 
Le serveur de développement doit être configuré pour reporter les erreurs.
  
Ligne 73 : Ligne 76 :
 
</pre>
 
</pre>
  
On peut aussi inclure ces directives dans le fichier index.php du site:
+
On peut aussi inclure ces directives dans le fichier index.php du site :
  
 
<pre>
 
<pre>
Ligne 79 : Ligne 82 :
 
ini_set('display_errors', true);
 
ini_set('display_errors', true);
 
</pre>
 
</pre>
 
  
 
=== Les addons ===
 
=== Les addons ===
Dans chaque fichier, le premier fichier à inclure est base.php:
+
Dans chaque fichier, le premier fichier à inclure est "base.php" :
 
<pre>
 
<pre>
 
/************************************************************************
 
/************************************************************************
Ligne 97 : Ligne 99 :
 
une seule instruction: '''exit;'''
 
une seule instruction: '''exit;'''
  
Comme ceci:
+
Comme ceci :
 
<pre>
 
<pre>
 
<?php
 
<?php
Ligne 114 : Ligne 116 :
  
 
=== Chargement de fichiers ===
 
=== Chargement de fichiers ===
L'extension des fichiers chargés l'utilisateur sur le serveur doit être filtrée.
+
L'extension des fichiers chargés par l'utilisateur sur le serveur doit être filtrée.
 
On ne doit pas permettre de charger des fichiers php, js, sh, asp, ....
 
On ne doit pas permettre de charger des fichiers php, js, sh, asp, ....
 +
 
D'une manière générale tout fichier qui peut être exécuté sur le serveur ne doit pas être chargé.
 
D'une manière générale tout fichier qui peut être exécuté sur le serveur ne doit pas être chargé.
  
Sinon, s'il faut le faire, le fichier doit être stocké sur le serveur en transformant le nom afin de masquant l'extension.
+
Sinon, s'il faut le faire, le fichier doit être stocké sur le serveur en transformant le nom afin de masquer l'extension.
  
De plus les fichiers chargés sur le serveur ne doivent pas être accessibles à l'utilisateur.
+
De plus, les fichiers chargés sur le serveur ne doivent pas être accessibles à l'utilisateur.
  
=== Les titres de page ===
+
Un fichier temporaire ne doit pas être ouvert directement, les seules fonctions autorisées pour manipuler un fichier temporaire en provenance de l'utilisateur sont '''move_uploaded_file()''' et '''is_uploaded_file()'''
Pour les titres de page il est préférable d'utiliser ''$babBody->setTitle()'' si le titre est du texte brut
+
car la transformation en html est intégrée dans la fonction.
+
  
Pour les messages d'erreur il est préférable d'utiliser ''$babBody->addError()'' au lieu de ''$babBody->msgerror''.
+
=== Les titres de page et messages d'erreurs ===
 +
Pour les titres de page, il est préférable d'utiliser ''$babBody->setTitle()'' si le titre est du texte brut car la transformation en html est intégrée dans la fonction.
  
La fonction s'appelle ''addError'' car la prochaine version des skins permettra la gestion des messages d'erreurs
+
Pour les messages d'erreurs, il est préférable d'utiliser ''$babBody->addError()'' au lieu de ''$babBody->msgerror''.
multiples, pour le moment les messages d'erreurs sont séparés par des retours à la ligne.
+
  
 +
La fonction s'appelle ''addError'' car la prochaine version des skins permettra la gestion des messages d'erreurs multiples. Pour le moment, les messages d'erreurs sont séparés par des retours à la ligne.
  
 
=== Modifications fonctionnelles apportées sur ovidentia 6.1.0 ===
 
=== Modifications fonctionnelles apportées sur ovidentia 6.1.0 ===
  
liste des modifications fonctionnelles pour les corrections de sécurité qui peuvent entraîner des dysfonctionnements :
+
Liste des modifications fonctionnelles pour les corrections de sécurité qui peuvent entraîner des dysfonctionnements :
  
* Les donnés de la variable $_SESSION ne sont plus intégrés dans les variables globales
+
* Les données de la variable $_SESSION ne sont plus intégrées dans les variables globales
* Les donnés de la variable $_FILES ne sont plus intégrés dans les variables globales
+
* Les données de la variable $_FILES ne sont plus intégrées dans les variables globales
* L'authentification par cookie à été modifiée
+
* L'authentification par cookie a été modifiée
  
=== Sécuriser une installation d'ovidentia ===
+
=== Sécuriser une installation d'Ovidentia ===
  
Rendre ovidentia plus sécurisé avec le paramétrage :
+
Rendre Ovidentia plus sécurisé avec le paramétrage :
  
 
* Activer le filtre de l'éditeur WYSIWYG dans les options du site
 
* Activer le filtre de l'éditeur WYSIWYG dans les options du site
 
* register_globals off
 
* register_globals off
 
* magic_quotes off
 
* magic_quotes off
 +
* error_reporting E_NONE
 
* $babNTauth ne doit pas être activé dans config.php
 
* $babNTauth ne doit pas être activé dans config.php
 +
 +
Dans le php.ini :
 +
* display_errors = OFF
 +
* display_startup_errors=OFF
 +
* log_errors = On
 +
* error_log = /var/log/php.log

Version actuelle en date du 2 novembre 2009 à 16:52

Filtrez toutes les données externes

Toutes les données en entrée doivent être considérées comme invalides. A vous de prouver leur validité.

Vérifier que la variable contient ce que vous attendez :

  • Utiliser intval si vous attendez un entier
  • Utiliser strval si vous attendez une chaîne
  • etc ...
$total = intval( bab_pp('total', 0));

$name = strval( bab_pp('name', 0));


  • Initialiser vos variables :

Code incorrect :

if( .... )
{
$var = 1;
}
// utilisation de $var

Code correct :

$var = 0;
if( .... )
{
$var = 1;
}
// utilisation de $var

Register globals

Développer avec la directive register_globals à Off.

Et utiliser bab_rp(), bab_pp(), bab_gp() ( voir Règles de codage#Variables externes à PHP ( GET et POST ).

Utiliser les superglobals pour le reste: $_SESSION, $_COOKIE, etc...

Protection des variables de sorties

  • Vers la base de données:
    • Toujours placer les données entre apostrophes, quel que soit le type.
    Exemple: select * from table where id='2'
    • Toujours utiliser db_escape_string() pour protéger les variables passées dans les requêtes SQL.
    Exemple : select id from table where id_user=\'.$babDB->db_escape_string($var).\';
    • Ou la méthode quote() qui permet de sérialiser la variable si c'est un tableau
    Exemple : select id from table where id_user=IN(.$babDB->quote($var).);


Javascript

Lorsque c'est possible, il faut éviter d'utiliser innerHTML, préférer les syntaxes : .appendChild(document.createTextNode(label));

Affichage des messages de debug

Utiliser la fonction bab_debug() ( Voir .Règles de codage#Debug )

Configuration du serveur de développement

Le serveur de développement doit être configuré pour reporter les erreurs.

error_reporting = E_ALL
display_errors = On

On peut aussi inclure ces directives dans le fichier index.php du site :

ini_set('error_reporting', E_ALL);
ini_set('display_errors', true);

Les addons

Dans chaque fichier, le premier fichier à inclure est "base.php" :

/************************************************************************
 * OVIDENTIA http://www.ovidentia.org                                   *
 ************************************************************************
 * Copyright (c) 2003 by CANTICO ( http://www.cantico.fr )              *
...
************************************************************************/
include_once 'base.php';
....

Ce fichier est à créer dans le même répertoire s'il le faut et doit contenir une seule instruction: exit;

Comme ceci :

<?php
/************************************************************************
 * OVIDENTIA http://www.ovidentia.org                                   *
 ************************************************************************
 * Copyright (c) 2003 by CANTICO ( http://www.cantico.fr )              *
 *                                                                      *
....
************************************************************************/
exit;
?>

Ajouter un fichier index.html vide pour ne pas lister le répertoire.

Chargement de fichiers

L'extension des fichiers chargés par l'utilisateur sur le serveur doit être filtrée. On ne doit pas permettre de charger des fichiers php, js, sh, asp, ....

D'une manière générale tout fichier qui peut être exécuté sur le serveur ne doit pas être chargé.

Sinon, s'il faut le faire, le fichier doit être stocké sur le serveur en transformant le nom afin de masquer l'extension.

De plus, les fichiers chargés sur le serveur ne doivent pas être accessibles à l'utilisateur.

Un fichier temporaire ne doit pas être ouvert directement, les seules fonctions autorisées pour manipuler un fichier temporaire en provenance de l'utilisateur sont move_uploaded_file() et is_uploaded_file()

Les titres de page et messages d'erreurs

Pour les titres de page, il est préférable d'utiliser $babBody->setTitle() si le titre est du texte brut car la transformation en html est intégrée dans la fonction.

Pour les messages d'erreurs, il est préférable d'utiliser $babBody->addError() au lieu de $babBody->msgerror.

La fonction s'appelle addError car la prochaine version des skins permettra la gestion des messages d'erreurs multiples. Pour le moment, les messages d'erreurs sont séparés par des retours à la ligne.

Modifications fonctionnelles apportées sur ovidentia 6.1.0

Liste des modifications fonctionnelles pour les corrections de sécurité qui peuvent entraîner des dysfonctionnements :

  • Les données de la variable $_SESSION ne sont plus intégrées dans les variables globales
  • Les données de la variable $_FILES ne sont plus intégrées dans les variables globales
  • L'authentification par cookie a été modifiée

Sécuriser une installation d'Ovidentia

Rendre Ovidentia plus sécurisé avec le paramétrage :

  • Activer le filtre de l'éditeur WYSIWYG dans les options du site
  • register_globals off
  • magic_quotes off
  • error_reporting E_NONE
  • $babNTauth ne doit pas être activé dans config.php

Dans le php.ini :

  • display_errors = OFF
  • display_startup_errors=OFF
  • log_errors = On
  • error_log = /var/log/php.log