shinnokamui
Messages postés15Date d'inscriptionmardi 14 août 2007StatutMembreDernière intervention13 février 2010
-
21 juil. 2008 à 18:25
JoJo738
Messages postés1267Date d'inscriptionmercredi 7 juillet 2004StatutMembreDernière intervention29 juin 2010
-
22 juil. 2008 à 19:03
Bonjour,
J'ai encore quelques question sur la sécurité en PHP.
Jusqu'à présent, j'utilisais des variable sensibles (GET/POST/...) de type numériques, donc un simple "intval" suffisais à les protéger...
J'ai maintenant besoin de l'utilisation de variables type chaine de caractères. On m'a proposer sur ce forum d'utiliser des str_replace, avec tous les caractères malicieux remplacé par le vide. Le problème c'est qu'il est difficile de connaître tous ces caractères (avec en plus unicode etc.). J'ai donc pensé a faire l'inverse : copier uniquement les caractères valides avec une regex :
pysco68
Messages postés681Date d'inscriptionsamedi 26 février 2005StatutMembreDernière intervention21 août 20148 22 juil. 2008 à 09:34
bonjour,
de cette façon ton switch est relativement sur (enfin moi tout de suite je ne vois pas vraiment de façon d'exploiter ça (bon signe? )... les injections SQL ne peuvent qu'êtres exploitées si une variable récupèrée va directemenet sans vérification dans une requête, ce qui ne semble pas être le cas ici (enfin sauf si je me trompe, la requête dans les différentes pages (du moins dans nouvelles.php) est invariante (??)
Donc de mon point de vue rien de critique
Bonne journée!
<hr size="2" width="100%" />Developpement Web Yannic GraphiX | Mon CMS yArt et sa démo <hr size="2" width="10" />
JoJo738
Messages postés1267Date d'inscriptionmercredi 7 juillet 2004StatutMembreDernière intervention29 juin 20102 22 juil. 2008 à 10:14
Salut ^^
Je vais commencer par le Switch Le switch, étant une sorte de "if/else" vérifie les valeurs avec celle passé en paramètre ... donc, si ta variable n'est pas protégé, rien de grave ! Puisque si c'est une variable hacker, elle ne sera pas demandée dans le Switch, et donc ira dans default:
Toutefois, vérifie quand même l'existance de ta variable, c'est le minimum requis ;)
Dans ce cas là, je ferais ça :
$get_switch = isset($_GET['p']) ? urldecode($_GET['p']) : null; // On décode quand même les caratères spéciaux ;)
switch(strtolower($get_switch))
{
case '': break;
default : echo 'Vilain méchant !'; break;
}
Après, pour protéger ton code, il existe différentes manières :
<li> preg_replace('`[^a-zA-Z0-9]`', ' ', $var);
Quand tu as besoin d'une variable qui ne contient que des lettres et chifres, avec leur case (min/maj). Ca limite beaucoup ! Au pire, on peut rajouter certains caractères comme [^0-9A-Za-z_\+-]</li><li>htmlentities()et htmlspecialchars() Vont convertir (selon la focntion) certains ou tous les caractères spéciaux en leur équivalent Html. Permet de protèger efficassement.</li><li>addslashes() La protection minimum qu'il existe ... Permet d'ajouter des slashes pour éviter par exemple des Injections SQL ...</li><li>mysql_real_escape_string() The protection ! Permet d'éviter toute injecion SQL en convertissants les caractères qui doivent être encodés.
' SELECT bla, bla, bla FROM table WHERE bla = "' . mysql_real_escape_string($_GET['p']) . '" '; // if isset($_GET['p'])</li>
<hr />Si ma reponse te convient, merci de l'accepter !
shinnokamui
Messages postés15Date d'inscriptionmardi 14 août 2007StatutMembreDernière intervention13 février 2010 22 juil. 2008 à 12:36
Bonjour, et merci pour vos réponses :)
Donc pour le switch c'est bon, j'ai juste oublié de verifier si la variable existe :p Maintenant pour la fonction Regex :
En fait, j'utilisais déjà jusqu'à présent htmlspecialchars() et mysql_real_escape_string(), mais j'ai rencontré un problème : magic_code_gpc, qui ajoute automatiquement des "" si ON, ou pas si OFF. Le problème est qu'il faut vérifier ça sur chaque serveur, ce qui complique les choses.
Et je pari qu'il ne s'ajit pas du seul cas à connaitre, personnelement je suis débutant en PHP, et je pense qu'il y aura toujours des choses à savoir ; des évolutions avec les version à venir de PHP etc.
... qui marche à tous les coups, quel que soit les évolution a venir des fontions PHP, ou les connaissances techniques qui me manque. C'est sur que faire une Regex juste pour ça, ça doit ralentir la génération de la page, mais au moins avec cette fonction je suis tranquille, du moins je l'espère :p donc je voulais juste savoir si c'est vraiment sure dans 100% des cas (SQL, echo, etc.)
Sinon tu peux aussi passer tes variables via $_SESSION plus dur a modifier si on ne s'y connait pas malgrès ce que l'on peut penser $_SESSION contient des failles de sécurité.
Pour ton switch je peux te proposer une autre solution :
if(file_exists($chemin))
require_once $chemin;
else
require_once 'chemin par defaut';
}
else
require_once 'chemin par defaut';
Cordialement Banban
-------------------------------------------------------------------------->
Developpement sous MAC
Firefox - Safarie - Internet Explorer - Opéra
Mon site pro : www.wubart.net
Mon site perso : www.mafiacity.fr
Vous n’avez pas trouvé la réponse que vous recherchez ?
JoJo738
Messages postés1267Date d'inscriptionmercredi 7 juillet 2004StatutMembreDernière intervention29 juin 20102 22 juil. 2008 à 18:19
Hello ^^
Petite alternative à ton code, beaucoup plus sur ;) (mais le './tondossier/' permet une protection optimale ;)
Note : Quand tu fais une include, vérifie toujours que le fichier existe sur le serveur, c'st à dire avoir au moins un './' . $url_fichier (quand c'est dynamique ) ex : file_exists('./' . $url_fichier)
Ah concernant les foncitons html*() : http://fr.php.net/htmlentities (par exemple), tu peux spécifier le Quote_style
<caption>Constantes disponibles pour <tt class= \\"parameter\\">quote_style</tt></caption><colgroup></colgroup>----
Constante |Description |----
<tt>ENT_COMPAT</tt>, Convertit les guillemets doubles, et ignore les guillemets simples., ----
<tt>ENT_QUOTES</tt>, Convertit les guillemets doubles et les guillemets simples., ----
<tt>ENT_NOQUOTES</tt>, Ignore les guillemets doubles et les guillemets simples.
banbanfr
Messages postés132Date d'inscriptiondimanche 8 janvier 2006StatutMembreDernière intervention15 février 2011 22 juil. 2008 à 18:22
include_once plutot mais sinon ton code est mieux :)
Cordialement Banban
-------------------------------------------------------------------------->
Developpement sous MAC
Firefox - Safarie - Internet Explorer - Opéra
Mon site pro : www.wubart.net
Mon site perso : www.mafiacity.fr
JoJo738
Messages postés1267Date d'inscriptionmercredi 7 juillet 2004StatutMembreDernière intervention29 juin 20102 22 juil. 2008 à 19:03
Mouef,
include_once n'est pas vraiment approprié pour ce genre d'include ...
Là on inclu un fichier dynamiquement, donc, logiquement on l'inclu à un endroit bien précis et une seule fois. Biensur, à l'intérieur de celui ci, et si jamais on inclus des fichiers annexes (class, fonctions, ...), là, on utilisera les (include|require)_once()
^__^
<hr />Si ma reponse te convient, merci de l'accepter !