Comment écrire des infusion/mod sécurisé ?
Publi� par WeDgEMasTeR le 25 mai 2007 à 12:20
Voici une traduction de l'article venant du site php-fusion.co.uk

Comment écrire des infusion/mod sécurisé ?
Nous savons que la sécurité de PHP-Fusion est très importante. Je veux décrire ici
comment écrire des infusions ou des mods sécurisé en employant les functions standards de PHP-Fusion.

1) droits d'utilisateur :
pour vérifier le niveau de l'utilisateur et des groupes utilisez toujours les constantes iGUEST, iUSER, iMEMBER, iADMIN, iSUPERADMIN, iUSER_RIGHTS, iUSER_GROUPS et les fonctions checkrights(), getuserlevel(), checkgroup(), groupaccess(). N'essayez pas d'écrire vos, 'meilleurs ', script de vérification ;)

2) appels de MySQL :
Employez toujours les fonctions de PHP-Fusion pour exécuter vos requêtes :
- dbquery() - pour envoyer une requête à mysql
- dbrows() - pour obtenir le nombre de lignes dans le résultat
- dbcount() - pour compter les données dans le résultat
- dbresult() - pour obtenir des données du résultat
- dbarray() - pour chercher une ligne de résultat comme array associative
- dbarraynum() - pour obtenir une ligne de résultat comme array énumérée

Ces functions sont suffisantes dans la plupart des cas.

NOTIFICATION : Rappelez-vous d'optimiser vos requêtes. Les serveurs n'aiment pas des milliers de reqêtes via un site ;)

3) $_post et $_get :
- rappelez-vous toujours de dépouiller (strip) les chaînes soumises à partir de code dangereux de HTML ou de PHP. Employez la fonction stripinput() avant de mettre quelque chose dans vos tables de mysql, comme :

$my_data = stripinput($POST['my_data ']).


Cette fonction remplacera les caractères applicables à leurs entités HTML.

- si votre la variable retournée par POST/GET devait être un nombre, alors utilisez la fonction isNum(). Si le nombre soumis est requis dans votre requête mysql alors utilisez le code comme ceci avant de mettre quelque chose dans votre table mysql :

if (!isNum($_POST['my_number '])) falback("index.php") ;


autrement :

$my_number = isNum($_POST['my_number ']) ? 22$_post['my_number
'] : # $$my_default_number>;


- ne soumettez jamais par l'intermédiaire de GET des données importantes comme des mots de passe
- essayez toujours d'opérer sur votre base de données mysql par l'intermédiaire des champs d'identification (ID fields). Il est plus facile de manipuler et de sécuriser. Il est plus facile de vérifier que la valeur est numérique (par l'intermédiaire de la fonction isNum()) que de parser la chaine et de tester si elle est sécurisée ou non.

4) l'autre truc :
- mettez toujours ce code au début de votre script d'admin d'infusion :
If (!checkrights("IP")) fallback("../index.php") ;


- mettez toujours ce code au début de votre manuscrit d'infusion (panel) :
if (!defined("IN_FUSION")) {header("Location:../../index.php") ; exit ; }


- mettez toujours ce code au début de votre include :
If (!defined("IN_FUSION")) {header("Location:../index.php") ;exit ; }


- vérifiez toujours les images téléchargées par l'intermédiaire de la fonction verify_image(). Rappelez-vous que quelques navigateurs (vous savez lesquels ;) peuvent exécuter des script JS dangereux par l'intermédiaire de tag HTML

- ne laissez pas les avertissements e_notice. Rappelez-vous de déclarer les variables avec des valeurs par défaut. Exemple sans déclaration :

$otherdata = 'a';
$data = array('b', 'c', 'd');
for ($i=0;$i
if ($otherdata==$data[$i]) $result = "OK";
}
$final_result = $result;


Le script ci-dessus causera l'avertissement d'un e_notice :
$result variable non défini à la ligne XXX.

Ci-dessous le bon code sans avertissements d'un e_notice :

$otherdata = 'a';
$data = array('b', 'c', 'd');
$result = "DEFAULT VALUE"; //that line fixes e_notice warning
for ($i=0;$i
if ($otherdata==$data[$i]) $result = "OK";
}
$final_result = $result;

------------------------------------
Cet article ne reprant pas toutes les failles de sécurité mais devrait vous aider à écrire des infusions ou mods plus sécurisés pour PHP-Fusion.


Traduction par castagnier.