Envoyé par _42_
Voir le message
Personnellement, je trouve ton code très minimaliste, voire trop ... J'explique !
Déjà, ta première ligne ne sécurise rien - strictement rien - et n'est intéressante que, et si seulement si, tous tes noms de scripts PHP sont écrits en minuscules.
C'est un prédicat de base, certes intéressant, mais qui dans certains contextes, est faux, voire nul et non advenu.
La deuxième ligne de code est, elle, plus intéressante ... mais au lieu de la fonction isset(), personnellement j'utilise !empty() ; ce que je ne comprends pas, par contre, c'est ton pattern de recherche dans la fonction preg_match ... étant donné que tu mets tout en minuscule, précédemment, il serait plutôt d'acabit de l'écrire ainsi : [a-z0-9], étant donné que tu n'auras jamais de lettre majuscule !
Rien à redire sur l'usage de file_exists, bien au-contraire, même si personnellement, je préfère utiliser la fonction require(), voire require_once()
Pour en revenir, à ta première ligne de code qui n'est en rien sécurisé, je partage ce bout de code que j'ai intégré dans mes anciens codes PHP - parce que, j'avoue cela commence à faire quelque temps, que je ne code plus PHP :
Sachant que normalement, actuellement PHP convertit le type de la valeur obtenue automatiquement ... quelque soit la variable et sa valeur obtenue, dans les contextes des tableaux superglobaux.
Comme on le lit, dans le code securiseVariables() - ci-dessus -, l'usage immodéré des filtres PHP est fait - laissons faire à PHP ce qu'il sait mieux faire que nos propres mimines, voire notre cerval :
https://secure.php.net/manual/fr/fun...filter-var.php
Et, on peut assurément faire mieux.
Personnellement, avant l'usage de la fonction file_exists(), je m'assurerais aussi que le fichier appelé est bien un fichier, et surtout qu'il appartient bien au propriétaire des scripts PHP hébergés - vérification par exemple avec getOwner(), dans le cadre de l'usage des fonctions SPL. Ça me semble un strict minimal !
Allez zou ... bon code, à tous.
Déjà, ta première ligne ne sécurise rien - strictement rien - et n'est intéressante que, et si seulement si, tous tes noms de scripts PHP sont écrits en minuscules.
C'est un prédicat de base, certes intéressant, mais qui dans certains contextes, est faux, voire nul et non advenu.
La deuxième ligne de code est, elle, plus intéressante ... mais au lieu de la fonction isset(), personnellement j'utilise !empty() ; ce que je ne comprends pas, par contre, c'est ton pattern de recherche dans la fonction preg_match ... étant donné que tu mets tout en minuscule, précédemment, il serait plutôt d'acabit de l'écrire ainsi : [a-z0-9], étant donné que tu n'auras jamais de lettre majuscule !
Rien à redire sur l'usage de file_exists, bien au-contraire, même si personnellement, je préfère utiliser la fonction require(), voire require_once()
Pour en revenir, à ta première ligne de code qui n'est en rien sécurisé, je partage ce bout de code que j'ai intégré dans mes anciens codes PHP - parce que, j'avoue cela commence à faire quelque temps, que je ne code plus PHP :
Code:
<?php function securiseSuperGlobals() { // securise superglobals arrays... //if( !empty( $GLOBALS ) ) $this->securiseVariables( $GLOBALS ); if( !empty( $_COOKIE ) ) $this->securiseVariables( $_COOKIE ); if( !empty( $_ENV ) ) $this->securiseVariables( $_ENV ); if( !empty( $_FILES ) ) $this->securiseVariables($_FILES); if( !empty( $_GET ) ) $this->securiseVariables($_GET); if( !empty( $_POST ) ) $this->securiseVariables($_POST); if( !empty( $_REQUEST ) ) unset($_REQUEST); if( !empty( $_SERVER ) ) $this->securiseVariables($_SERVER); if( !empty( $_SESSION ) ) $this->securiseVariables($_SESSION); } /* * @purpose: Securise variables * * */ function securiseVariables($array) { if(!empty($array) && is_array($array)) { foreach($array as $key => $value) { # Si c'est un tableau, récursion de la fonction, sinon filtre tags if(is_array($value)) { $this->securiseVariables($array[$key]); } // on peut très bien préférer l'usage de la fonction htmlentities(), par exemple, au lieu de strip_tags()... elseif(is_bool($value)) $array[$key] = filter_var(strip_tags($value), FILTER_VALIDATE_BOOLEAN); elseif(is_int($value)) $array[$key] = filter_var(strip_tags($value), FILTER_VALIDATE_INT); elseif(is_string($value)) $array[$key] = filter_var(strip_tags($value), FILTER_SANITIZE_STRING); } unset($key, $value); } } securiseSuperGlobals(); if( !empty( $page ) ) { file_exists( "pages/$page.php" ) && require_once( "pages/$page.php" ); } else { require_once "pages/include.php"; } ?>
Comme on le lit, dans le code securiseVariables() - ci-dessus -, l'usage immodéré des filtres PHP est fait - laissons faire à PHP ce qu'il sait mieux faire que nos propres mimines, voire notre cerval :
https://secure.php.net/manual/fr/fun...filter-var.php
Et, on peut assurément faire mieux.
Personnellement, avant l'usage de la fonction file_exists(), je m'assurerais aussi que le fichier appelé est bien un fichier, et surtout qu'il appartient bien au propriétaire des scripts PHP hébergés - vérification par exemple avec getOwner(), dans le cadre de l'usage des fonctions SPL. Ça me semble un strict minimal !
Allez zou ... bon code, à tous.
Sinon, on débat de la faille et de ces possibilités futur d'exploitation, car honnêtement ce tutoriel n'est pas complet pour moi, il s'arrête sur la première marche d'un escalier à franchir avec plusieurs pas, ou on reste dans la critique de "bout de code"?
Merci de la correction, fort utile pour ma part
Commentaire