begin process at 2008 05 12 09:40:15
1 170 182 membres
85 nouveaux aujourd'hui
13 956 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SECURITÉ PROTECTION AUTOMATIQUE CONTRE MAGICQUOTE ET REGISTER_GLOBALS


Information sur la source

Catégorie :Sécurité & Cryptage Classé sous : sécurité, Magic quote, Register global, pirate, hacker Niveau : Débutant Date de création : 28/03/2008 Date de mise à jour : 30/03/2008 12:56:27 Vu : 2 067

Note :
Aucune note

Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note


Description

Voila cette petite source préviens des danger de configuration de certains serveurs.
Il suffit d'inclure ce fichier en haut de chaque page (pas au milieu) pour se protéger.

Source

  • <?php
  • //FONTION DE PROTECTION DES QUOTES
  • function Protege_Quote(&$valeur,$cle){
  • if(is_array($valeur)){
  • array_walk ($valeur, 'Protege_Quote');
  • }else{
  • $valeur=stripslashes($valeur);
  • }
  • }
  • //FAILLES CORRIGEES EN VERSION 6
  • if(version_compare(PHP_VERSION,'6.0.0','<')==1){
  • //PROTECTION CONTRE LE REGISTER GLOBAL
  • if (@ini_get('register_globals')) {
  • foreach ($_REQUEST as $clef => $valeur){
  • unset($GLOBALS[$clef]);
  • }
  • }
  • //PROTECTION CONTRE LES MAGIC QUOTE
  • if(get_magic_quotes_gpc()){
  • array_walk ($_POST, 'Protege_Quote');
  • array_walk ($_GET, 'Protege_Quote');
  • array_walk ($HTTP_COOKIE_VARS, 'Protege_Quote');
  • array_walk ($_COOKIE, 'Protege_Quote');
  • }
  • }
  • ?>
<?php
//FONTION DE PROTECTION DES QUOTES
function Protege_Quote(&$valeur,$cle){
	if(is_array($valeur)){
		array_walk ($valeur, 'Protege_Quote');
	}else{
		$valeur=stripslashes($valeur);
	}
}
//FAILLES CORRIGEES EN VERSION 6
if(version_compare(PHP_VERSION,'6.0.0','<')==1){
	//PROTECTION CONTRE LE REGISTER GLOBAL
	if (@ini_get('register_globals')) {
	  foreach ($_REQUEST as $clef => $valeur){
	    unset($GLOBALS[$clef]);
	    
	  }
	 }
	 //PROTECTION CONTRE LES MAGIC QUOTE
	if(get_magic_quotes_gpc()){
		
		array_walk ($_POST, 'Protege_Quote');
		array_walk ($_GET, 'Protege_Quote');
		array_walk ($HTTP_COOKIE_VARS, 'Protege_Quote');
		array_walk ($_COOKIE, 'Protege_Quote');
	}
}
?>

Conclusion

Je mets cette source surtout à titre d'information.
28 mars 2008 14:57:00 :
28/03/2006 -- Optimisation
28 mars 2008 14:57:44 :
28/03/2008 -- OPtimisation
28 mars 2008 15:06:25 :
Correction d'un petit bug
30 mars 2008 12:44:47 :
Amélioration de la source (mions de bug)
30 mars 2008 12:56:27 :
Correction d'une faute d'orthographe
  • signaler à un administrateur
    Commentaire de neigedhiver le 28/03/2008 13:37:55

    Salut,

    L'idée est bonne.

    Cependant, au lieu d'utiliser des boucles while pas vraiment optimisées, tu devrais plutôt utiliser array_walk() : une fonction native, donc écrite en C, sera forcément plus performante que des boucles en PHP.
    Et puis... au lieu d'une boucle pour supprimer toutes les clés de $GLOBALS, pourquoi ne pas, tout simplement redéfinir $GLOBALS ?
    $GLOBALS = array();
    Le résultat ne serait-il pas le même ?
    D'un coup, je me demande : le résultat de la directive register_globals est surtout de créer des variables portant le nom des clés des tableaux $_GET, $_POST, $_COOKIE.
    Je pense qu'il faut donc surtout détruire ces variables :

    Par exemple, http://www.mondomaine.tld/index.php?argument=valeur&truc=bidule

    Avec register_globals à on, PHP va automatiquement créer les deux variables :
    - $argument dont la valeur est 'valeur'
    - $truc dont la valeur est 'bidule'

    Ce sont ces variables qu'il faut détruire avant l'exécution du script.

    Le tableau $GLOBALS permet d'accéder aux variables définies dans le contexte global depuis un contexte protégé (fonction, classe, etc) : ce n'est pas là que réside le manque de sécurité...

    Pour comparer la version, tu peux utiliser version_compare() qui sert à ça.

  • signaler à un administrateur
    Commentaire de TheWeasel47 le 28/03/2008 14:46:27

    OK merci beacoup!
    Je note les modification et je corrige par contre je n'ai pas compris l'histoire du global?
    Que dois je faire exactement?

  • signaler à un administrateur
    Commentaire de codefalse le 28/03/2008 15:10:55 administrateur CS

    De plus j'ajouterai que tu peux en profiter pour obliger un meilleur usage du code, par exemple supprimer $HTTP_COOKIE_VARS et les autres du même type, afin de forcer l'utilisateur à utiliser $_COOKIE, $_GET, etc

    Apres pour pousser le vice, ce qui serait tip top, ce serait une fonction ou tu lui dit la valeur que tu veux, quel genre (get, post, cookie), quel type (int, bool, etc) et optionnellement uen valeur par défaut, genre :

    tonurl.php?exemple1=salut

    dans ton code :

    $mavar = getVar ('get', 'exemple1', 'string', 'valeurvide');
    // Comme ca $mavar aura "salut" si salut existe et est un bien un string. et parsé s'il le faut
    Tu peux aussi pousser encore plus en proposant des expreg à la place du typage, etc

    Mais bon ca obligerai à modifier tout un code qui existe déjà !

  • signaler à un administrateur
    Commentaire de neigedhiver le 28/03/2008 15:28:54

    Re,

    @codefalse : ce que tu lui proposes c'est plus que la sécurité dans le cas de register_globals à on... C'est pas vraiment le but de sa source, il me semble.
    Non pas que l'idée soit mauvaise, juste que c'est, à mon sens, complètement différent...

    Sinon, pour globals...

    Quand register_globals est à on, PHP crée des variables portant le nom des index des tableaux superglobaux, comme je te l'ai expliqué plus haut. Il le fait en respectant un ordre précis (fixé par la directive variables_order : http://fr.php.net/manual/fr/ini.core.php#ini.variables-order )

    Le tableau $GLOBALS ne représente pas une faille de sécurité, s'il est correctement utilisé, contrairement à register_globals à on, qui nécessite tout un tas de précautions particulières et qui n'est pas vraiment compatible avec la permissivité de php quant aux déclarations de variables.

    En gros, inutile de vider le tableau $GLOBALS : mieux vaut supprimer les variables enregistrées par register_globals. Au lieu de :
    unset($GLOBALS[$valeur]);

    contente toi de :
    unset($valeur);

    $GLOBALS contient une référence à chaque variable définie dans le contexte global (en dehors d'une fonction ou d'une classe). Là, tu es dans le contexte global, lors de l'exécution de ton script (un fichier inclus reste dans le même contexte que la ligne qui l'inclut) : autant supprimer la variable, tout simplement.

  • signaler à un administrateur
    Commentaire de malalam le 28/03/2008 19:05:57 administrateur CS

    Hello,

    la "protection" contre register_globals à on ne sert strictement à rien, là.
    $_GLOBALS et register_globals n'ont aucun rapport.
    Avec ce code, si register_globals est à on, et que j'ai une variable $_GET['toto'], si je fais echo $toto, cela marchera très bien. Ce qui ne marchera plus, c'est de faire echo $_GLOBALS['toto'].

    De plus, une protection contre cette configuration de php.ini est inutile. Pourquoi ? Parce que ce n'est pas la configuration en elle-même qui va vraiment poser problème, c'est d'utiliser ses possibilités dans les codes.
    Si on a register_globals à on, et que l'on utilise les bons tableaux $_POST, $_GET etc...on n'aura aucun soucis. Si tant est que l'on ait pris la bonne habitude de ne jamais utiliser à la fois $_GET['toto'] et une variable "normale" s'appelant aussi $toto. Cela permet de se prémunir contre toute attaque XSS ciblant les requêtes GET ou POST, quelle que soit la configuration de php.
    Bref, dans tous les cas, le problème viendra du code, pas de la configuration.

    Quant à get_magic_quotes_gpc(), le code existe depuis très longtemps sur ce site, en fait. Et ça tient plus du snippet (donc de codyx.org) que du code source, à mon avis. Et puis il y a des oublis dans le conception de ton code : $HTTP_POST_VARS, $HTTP_GET_VARS...

  • signaler à un administrateur
    Commentaire de coucou747 le 29/03/2008 11:35:52

    <input type="text" name="truc[]" />
    <input type="text" name="truc[]" />

    je doute que ca fonctionne pour ce genre de trucs...

  • signaler à un administrateur
    Commentaire de malalam le 29/03/2008 11:43:05 administrateur CS

    Il suffit de troquer array_walk pour array_walk_recursive.

  • signaler à un administrateur
    Commentaire de malalam le 29/03/2008 16:02:27 administrateur CS

    Ceci dit dit c'est juste : le code est mal pensé décidément. A revoir.

  • signaler à un administrateur
    Commentaire de TheWeasel47 le 29/03/2008 20:09:59

    Yes alors je note :
    -array_walk() récursif
    -register global à modifier

    Par contre coucou747 je ne comprends pas ta remarque.

    Pour ce qui est de l'utilisation du code, simplement. Tout le monde à débuter en php et tout le monde a codé (avec du code pourris)  des applications web qui tournent encore, donc ce genre de fichier permettent de "protéger" ces applications sans tout avoir à re-coder.
    Merci des commentaires.
    TheWeasel47

  • signaler à un administrateur
    Commentaire de coucou747 le 29/03/2008 20:22:12

    Souvent, quand on fait une liste de checkbox, ou qu'on fait un "groupe" de champs qui vont ensemble, on utilise plus de simples noms dans l'attribut name des input, on ajoute des crochets voir des "clefs" dans ces crochets, et array_walk ne fouille qu'une dimension de ton tableau.
    avec des champs comme ca :
    <input type="text" name="truc[]" />
    <input type="text" name="truc[]" />

    ton $_POST aura l'air de :
    array(
    truc => array(
    [0]=>"valeur premier input"
    [1]=>"valeur second input"
    )
    )

    et avec un array_walk non recursif, tu te trouves a appliquer addslashes sur $_POST['truc'], qui est un array, ca peut poser quelques problemes :)

    avec certaines versions de php, il existait un caractere chinois invalide utf, j'ai jamais reussi a reproduire la faille par contre... j'imagine que ma version de php est trop recente pour ca
    plus de doc a ce sujet ici :
    http://www.haypocalc.com/blog/index.php/2008/01/26/124-failles-securite-unicode
    ca explique que beaucoup utilisent souvant mysql_real_escape_string, a la place de addslashes.


    si tu veux vraiment simuler un global_register a off, il te faudrait alors faire des choses comme :
    foreach ($_REQUEST as $clef => $valeur){ unset($$clef); }
    mais le probleme, c'est sur une url du style : page.php?$_GET=truc ca risquerait de donner un comportement etonnant

  • signaler à un administrateur
    Commentaire de codefalse le 30/03/2008 14:02:35 administrateur CS

    A mon avis le probleme doit se traiter au cas par cas et ne peut-etre utilisé. Ca va dépendre du code de la personne, et de comment il s'y prends.

Ajouter un commentaire

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Boutique

Boutique de goodies CodeS-SourceS