Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/04/2008, 11h15   #1
Rédacteur
 
Avatar de Halleck
 
Développeur PHP & Architecte logiciel
Inscription : mars 2003
Messages : 563
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Loiret (Centre)

Informations professionnelles :
Activité : Développeur PHP & Architecte logiciel

Informations forums :
Inscription : mars 2003
Messages : 563
Points : 1 379
Points : 1 379
Par défaut [Sécurité] fonction protéger une chaine

Bonjour tout le monde,

j'essaye de faire une fonction pour protéger les injections lors d'une saisie formulaire, mais je galère un peu, je commence à me perdre

J'ai grisé les lignes qui selon moi étaient des doublons, mais je ne suis sûr de rien

J'ai fait beaucoup de copier-coller, des tutos de sécurité de developpez, et aussi de la doc PHP, donc fouillis :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
 
/**
 * protéger une chaine de caractère des injections, SQL OU NON
 * @param string chaine bah la chaine - non null
 * @param string précise s'il s'agit de protéger une chaine en vue d'une insertion dans une base de données : oui : <> null et <> 0; non : nul ou 0
 * @param string corr si différent de null, corrige au lieu de supprimer : oui : <> null et <> 0; non : nul ou 0
 * @return string la chaine protégée / génére l'erreur - fontion alert_erreur()
*/
function str_protege($chaine,$sql=0,$corr=0)
{
    if (is_string(@$chaine) & isset($chaine)) {
 
 
    	$chaine = trim($chaine);
 
			// éviter attaques dos : désactivé
		//$chaine = escapeshellcmd($chaine);
        //$chaine = escapeshellarg($chaine);			
		//$chaine = htmlentities($chaine, ENT_QUOTES, 'ISO-8859-1');
 
 
 
        	// éviter le javascript
        $aAllowedTags = array();
        $aDisabledAttributes = array('onabort', 'onactivate', 'onafterprint', 'onafterupdate',
		 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 
		 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 
		 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 
		 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavaible', 
		 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 
		 'ondrag', 'ondragdrop', 'ondragend', 'ondragenter', 'ondragleave', 
		 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 
		 'onfilterupdate', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 
		 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 
		 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 
		 'onmousemove', 'onmoveout', 'onmouseover', 'onmouseup', 'onmousewheel', 
		 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 
		 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 
		 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 
		 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload');
        	if (empty($aDisabledAttributes))
			{ 
				$chaine =  strip_tags($chaine, implode('', $aAllowedTags));
			} else {
				$chaine =  preg_replace('/<(.*?)>/ie', "'<' . preg_replace(array('/javascript:[^\"\']*/i', '/(" . implode('|', $aDisabledAttributes) . ")[ \\t\\n]*=[ \\t\\n]*[\"\'][^\"\']*[\"\']/i', '/\s+/'), array('', '', ' '), stripslashes('\\1')) . '>'", strip_tags($chaine, implode('', $aAllowedTags)));
 
			}
 
 
        	// éviter caracs non autorisés en sql, insérer les quotes
		if($sql != 0) { 
			$chaine = strip_tags($chaine);
			$chaine = mysql_real_escape_string($chaine); 
		} else {
 
 
			// désactivé car fait dans le preg_replace
			//if (!get_magic_quotes_gpc()) { $chaine = addslashes($chaine); } 
 
 
			// échapper les cractères php \ + * ? [ ^ ] $ ( ) { } = ! < > | :
			//$chaine = preg_quote($chaine);
 
			if(isset($corr) & @$corr != '' & $corr != 0) 
			{
				$chaine = htmlspecialchars($chaine, ENT_QUOTES, 'ISO-8859-1');
			} else
			{
				$chaine = strip_tags($chaine);
			}
 
 
 
		}
 
 
		// bloquer le script en cas d'attaque
        $chaine = str_replace(';', '&#x3B', $chaine);         
        return $chaine;
 
 
    } else {
 
        alert_erreur('TYPE INCCORECT',__line__,__file__);
 
    }
}

résultat :

Code :
echo str_protege('mot1<mot2mot3<? echo "jjj"; ?>mot4?mot5"mot6\'mot7');
=> mot1
Code :
echo str_protege('mot1?mot2mot3<? echo "jjj"; ?>mot4?mot5"mot6\'mot7');
=> mot1?mot2mot3mot4?mot5"mot6'mot7

Dans le cas 2, la chaine s'arrête au < . Est-elle tronquée ou bien le code derrière est-il lu et executé?

Dans le cas 2, même question pour "<? echo "jjj"; ?> ?


Pfiouuu ! Dur ! Merci d'avance pour votre aide
__________________
Zend PHP Certified Engineer
tutoriels : tutos PHP, Web & SEO blog : blog.lepine.pro
membre de l'AFUP (Association des Utilisateurs de PHP)
Halleck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2008, 13h27   #2
Modérateur
 
Avatar de Rakken
 
Inscription : août 2006
Messages : 1 208
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 208
Points : 1 138
Points : 1 138
Et si tu te contentais d'écrire un truc du genre :
Code :
echo htmlentities($str, ENT_QUOTES);
?
__________________
Rakken

Oneira, un monde imaginaire d'Heroic Fantasy.

Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/
Rakken est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2008, 13h40   #3
Rédacteur
 
Avatar de Halleck
 
Développeur PHP & Architecte logiciel
Inscription : mars 2003
Messages : 563
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Loiret (Centre)

Informations professionnelles :
Activité : Développeur PHP & Architecte logiciel

Informations forums :
Inscription : mars 2003
Messages : 563
Points : 1 379
Points : 1 379
il me manquerait la protection de la base de données + la protection contre les scripts javascript + le choix de remplacer / supprimer les balises contrôlées.

J'étais parti là-dessus au départ mais ça m'a paru trop faible.
__________________
Zend PHP Certified Engineer
tutoriels : tutos PHP, Web & SEO blog : blog.lepine.pro
membre de l'AFUP (Association des Utilisateurs de PHP)
Halleck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2008, 14h42   #4
Futur Membre du Club
 
Inscription : janvier 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 42
Points : 16
Points : 16
il y a une fonction qui pourrait te permettre de faire ce que tu veux :

strip_tags — Supprime les balises HTML et PHP d'une chaîne:

string strip_tags ( string $str [, string $allowable_tags ] )

Pour la base de données il ne te reste plus qu'à utiliser des requêtes préparés
Aprés il te reste le javascript à supprimer dans les balises autorisés.
Jorael est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2008, 14h46   #5
Rédacteur
 
Avatar de Halleck
 
Développeur PHP & Architecte logiciel
Inscription : mars 2003
Messages : 563
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Loiret (Centre)

Informations professionnelles :
Activité : Développeur PHP & Architecte logiciel

Informations forums :
Inscription : mars 2003
Messages : 563
Points : 1 379
Points : 1 379
elle est déjà dans le code plus haut

merci de votre aide. Ce qu'il me manque ce n'est pas tant les fonctions qu'une bonne compréhension de leurs effets. Et savoir ce que devient le "<?php echo "jjj"; ?> du code m'aiderait beaucoup je pense, enfin j'espère
__________________
Zend PHP Certified Engineer
tutoriels : tutos PHP, Web & SEO blog : blog.lepine.pro
membre de l'AFUP (Association des Utilisateurs de PHP)
Halleck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2008, 14h48   #6
Membre Expert
 
Avatar de darkstar123456
 
Inscription : mars 2008
Messages : 1 180
Détails du profil
Informations personnelles :
Âge : 28
Localisation : Belgique

Informations forums :
Inscription : mars 2008
Messages : 1 180
Points : 1 357
Points : 1 357
Envoyer un message via Skype™ à darkstar123456
Code php :
1
2
 
if (is_string(@$chaine) & isset($chaine))
Condition incorrecte... tu n'as pas doublé le &

correction:
Code php :
1
2
 
if (is_string(@$chaine) && isset($chaine))

Bon... je continue de lire le code plus loin... ^^


EDIT : Pour le reste, je pense qu'une bonne utilisation de strip_tags() & htmlspecialchars() devrait suffire et alléger ton code
darkstar123456 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2008, 16h41   #7
Modérateur
 
Avatar de Rakken
 
Inscription : août 2006
Messages : 1 208
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 208
Points : 1 138
Points : 1 138
Citation:
Et si tu te contentais d'écrire un truc du genre :

Code :
echo htmlentities($str, ENT_QUOTES);
Citation:
il me manquerait la protection de la base de données + la protection contre les scripts javascript + le choix de remplacer / supprimer les balises contrôlées.

J'étais parti là-dessus au départ mais ça m'a paru trop faible.
Hummm... non.
En fait, ca te transforme tout les caractères un peu vicieux (genre < > ' " é è et autres joyeusetée) en truc du genre &lt; &gt; ...
Donc c'est protégé, et plutot bien en fait. L'avantage, c'est également que si le gars écrit "<coucou>", eh bien a l'écran, on verra bien s'afficher "<coucou>", mais en base, ce qui est stocké est "&lt;coucou&gt;" ce qui est tout a fait sur. Les <? ou <script></script> ne sont donc jamais interprété, puisque le caractère "<" n'arrive jamais en base, il est traduit avant. Et il n'arrive jamais a la page html, c'est &lt; qui est affiché.
__________________
Rakken

Oneira, un monde imaginaire d'Heroic Fantasy.

Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/
Rakken est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2008, 14h12   #8
Membre expérimenté
 
Avatar de mathieugamin
 
Inscription : octobre 2006
Messages : 572
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : octobre 2006
Messages : 572
Points : 562
Points : 562
Salut
Tu peux ajouter la fonction mysql_real_escape_string($variable) pour ta base.

C'est généralement performant
__________________
GAMIN !!!!
_______________________________________________
PHP 5.2 | Apache 2 | MySQL 5 | WinXP Pro | Mac OSX
mathieugamin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2008, 20h23   #9
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Utiliser PDO (ou une autre abstraction) qui permet (souvent) d'utiliser des paramètres incluant des fonctions de protection contre l'injection SQL. Idéal pour les fainéants...
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 08h45   #10
Membre expérimenté
 
Avatar de mathieugamin
 
Inscription : octobre 2006
Messages : 572
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : octobre 2006
Messages : 572
Points : 562
Points : 562
Citation:
Envoyé par jml94 Voir le message
Utiliser PDO (ou une autre abstraction) qui permet (souvent) d'utiliser des paramètres incluant des fonctions de protection contre l'injection SQL. Idéal pour les fainéants...
Oui c'est vrai !
Pourquoi ré-inventer la roue ?
PDO fait déjà tout cela !
__________________
GAMIN !!!!
_______________________________________________
PHP 5.2 | Apache 2 | MySQL 5 | WinXP Pro | Mac OSX
mathieugamin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 08h58   #11
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
Citation:
Envoyé par mathieugamin Voir le message
Pourquoi ré-inventer la roue ?
J'y vois 2 raisons :

* Ma roue c'est ma roue, pas la roue de quelqu'un d'autre ! (Tu ne convoitera pas la roue de ton voisin)
* La roue du voisin c'est une roue de tracteur, avec rainures profondes de 5cm alors que moi je veux juste une roue de trottinette ;o)
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 09h07   #12
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Citation:
Envoyé par Fladnag Voir le message
J'y vois 2 raisons :

* Ma roue c'est ma roue, pas la roue de quelqu'un d'autre ! (Tu ne convoitera pas la roue de ton voisin)
* La roue du voisin c'est une roue de tracteur, avec rainures profondes de 5cm alors que moi je veux juste une roue de trottinette ;o)
* Michelin fabrique des roues depuis des lustres, et a une horde de chercheurs qui ont testé le truc. Avant que ton pneu en pelure de Babybel ne soit du même niveau, ily a pas mal de sueur et de tests à passer.

* Quand on est dans le caca, même avec de l'élan, c'est pas facile de s'en sortir en trottinette...

Plus sérieusement, j'entends tes arguments, mais ils ne s'appliquent que dans très peu de cas : grosses applis propriétaires avec des specs techniques particulières et de gros besoin d'optimisation.
Mais dans la plupart des cas rencontrés ici, à savoir des sites webs souvent petits, c'est pas utile de fabriquer ta trottinette à réaction, non ?
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 09h22   #13
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
Bon, j'ai pas donné tout mes arguments, mais si tu veux que je sois sérieux je peux ^^

Exemple concret : Pourquoi est-ce que je n'aime pas phpbb et que je ne l'installerais jamais sur mon site ?

* Des failles sont trouvées de temps en temps, parce que le code est libre et parce qu'il évolue. Choses bonnes en soi mais au niveau sécurité c'est une plaie
* Même si beaucoup de choses ont été faites dans les dernières versions sur les perfs, ca reste une usine a gaz.
* La customisation ne remplace pas une vraie interface ad hoc totalement différente

Sinon on peux aussi dire que :
* Si personne ne cherche a recoder ce qui existe, dans 10 ans plus personne ne saura le coder...
* Coder dans une optique de sécurité permet de se poser les bonnes questions (est-ce que cette variable est filtrée ? un cookie est il sur ? un utilisateur malveillant peut il modifier cette donnée ? etc...) et d'apprendre... a développer un code plus sécurisé, ou a corriger un code existant ou il reste une faille.
* Personnellement, je n'ai pas confiance en mon garagiste... alors que je le vois... alors l'ingénieur de michelin que j'ai jamais vu... Pour certaines choses je n'ai pas le choix. Mais quand je l'ai, je préfère me fier a ce que je fais.

Je posterais ici ce soir (si j'y pense ^^) une classe que j'ai développée et qui gère toutes les variables (GET/POST/SESSION/FILE) et toutes leurs utilisations (HTML, SQL, donnée "brute")
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 11h07   #14
Modérateur
 
Avatar de Rakken
 
Inscription : août 2006
Messages : 1 208
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 208
Points : 1 138
Points : 1 138
Et puis après, les roues des autres ne sont pas forcement tout a fait ronde. J'ai vu cité PDO juste au dessus par exemple.
Quelqu'un a déjà essayé d'utiliser pdo avec oracle ? Personnellement, ca a été la seule fois de ma vie ou j'ai réussi à faire un "segmentation fault" (erreur bien connue des codeurs en C) en php.
Et si on veut utiliser des CLOB, alors là, c'est le drame absolu... Mais voila, l'appli de base était faite pour mysql, alors le choix de pdo mysql a été tout a fait interessant, avec l'optique "et en plus, ca va marcher tout seul sous oracle, ou presque).
Un truc maison, on aurait pu l'adapter là... ben il a fallut faire avec, et les clob sont devenu des blobs, avec toutes les stupidités d'implémentation que ca entraine...
Vive les roues de tracteur quand on veut rouler sur une piste cyclable...
__________________
Rakken

Oneira, un monde imaginaire d'Heroic Fantasy.

Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/
Rakken est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 12h03   #15
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Citation:
Envoyé par Rakken Voir le message
Et puis après, les roues des autres ne sont pas forcement tout a fait ronde. J'ai vu cité PDO juste au dessus par exemple.
Quelqu'un a déjà essayé d'utiliser pdo avec oracle ? Personnellement, ca a été la seule fois de ma vie ou j'ai réussi à faire un "segmentation fault" (erreur bien connue des codeurs en C) en php.
Et si on veut utiliser des CLOB, alors là, c'est le drame absolu... Mais voila, l'appli de base était faite pour mysql, alors le choix de pdo mysql a été tout a fait interessant, avec l'optique "et en plus, ca va marcher tout seul sous oracle, ou presque).
Un truc maison, on aurait pu l'adapter là... ben il a fallut faire avec, et les clob sont devenu des blobs, avec toutes les stupidités d'implémentation que ca entraine...
Vive les roues de tracteur quand on veut rouler sur une piste cyclable...
Je suis d'accord là-aussi, mais si vous utilisez Oracle je doute fort que nous soyons dans un cadre de petit développement. Je me trompe ?
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 18h32   #16
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
Comme prévu, voila une p'tite classe que j'ai fait y a quelques mois.

Il y a quelques restrictions toutefois :
* développée pour php 5
* ne transforme que les variables venant d'un tableau super global, donc pas une variable locale qu'on aurait définie dans le script... faudrait la modifier un peu pour ca ;o)

Le code est assez gros mais il doit y avoir 50% de commentaires

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
<?php
/**
* @description
		Gestion des variables pour scripts PHP
		Fonctionnalités :
		- Echappement automatique de l'antislash ajouté par magic_quotes_gpc si activé
		- Sources gérées en entrée : GET, POST, COOKIE, FILES
		- Destinations gérées en sortie : SQL, HTML, RAW
		- Formatage de la variable selon le type de sortie
		- gestion des variables tableau (array)
		- Cache des variables pour optimisation
 
		Utilisation : 
		$Input = new In();
		echo $Input->G->RAW->id; // affiche $_GET['id'] sans modification
		echo $Input->P->HTML->truc; // affiche $_POST['truc'] pour une utilisation dans une balise html (htmlentities)
		echo $Input->C->SQL->login; // affiche $_COOKIE['login'] pour une utilisation dans une requete sql (mysql_real_escape_string)
		echo $Input->F->RAW->nomFichier; // affiche $FILES['nomFichier']; sans modification
* @author	Fladnag
* @date		2007/12/29
*/
class In {
	/**
		PUBLIC
	**/
 
	// les variables suivantes sont des instances de In également, mais elles contiennent plus d'informations.
	// L'instance principale contient les 4 instances suivantes, une pour chaque tableau super global.
	// Chaque instance de tableau contient ensuite 3 instances correspondant aux variables d'apres, 
	// une pour chaque mode de sortie autorisé.
	public $G;	// pour $_GET
	public $P;	// pour $_POST
	public $C;	// pour $_COOKIE
	public $F;	// pour $_FILES
 
	// instances de In qui n'existent que dans les instances definies au dessus.
	public $RAW;	// donnee brute : stripslashes si magic_quotes_gpc
	public $HTML;	// pour affichage dans une balise html
	public $SQL;	// pour utilisation dans une requete SQL
 
	/**
		PRIVATE
	**/
	private $content;				// contient le tableau super global de l'instance
	private $isMagicQuotesGPC;		// indique si l'option magic_quotes_gpc est activee dans php.ini
	private $nomTableau;			// le nom du tableau super global de l'instance
	private $nomFunction = NULL;	// le nom de la fonction locale a appliquer pour mettre en forme une variable de l'instance
	private $cache=array();			// cache de variable pour ne pas calculer 2 fois la fonction de mise en forme
 
	/**
	* @description	Le constructeur doit etre appelé sans parametre. Il s'auto appelle ensuite 
	*				avec plusieurs parametres pour construire l'arborescence d'objets necessaire
	* @author		Fladnag
	* @date			2007/12/29
	* @param		$tab					Le nom du tableau super global
	* @param		$magic_quotes_gpc		TRUE si cette option est activee dans php
	* @param		$nomFunction			le nom de la fonction interne a utiliser pour formater une variable simple
	*/
	public function __construct($tab=NULL, $magic_quotes_gpc=FALSE, $nomFunction=NULL) {
		if ($tab===NULL) {
			$magic_quotes_gpc=(get_magic_quotes_gpc()==1);
			$this->G = new In('_GET', $magic_quotes_gpc);
			$this->P = new In('_POST', $magic_quotes_gpc);
			$this->C = new In('_COOKIE', $magic_quotes_gpc);
			$this->F = new In('_FILES', $magic_quotes_gpc);
		} elseif ($nomFunction === NULL) {
			$this->SQL = new In($tab, $magic_quotes_gpc, 'formatSQL');
			$this->RAW = new In($tab, $magic_quotes_gpc, 'formatRAW');
			$this->HTML = new In($tab, $magic_quotes_gpc, 'formatHTML');
		} else {
			$this->nomTableau = $tab;
			global $$tab;
			$this->content=$$tab;
			$this->isMagicQuotesGPC = $magic_quotes_gpc;
			$this->nomFunction=$nomFunction;
		}
	}
 
	/**
	* @description	Permet l'acces a une variable par son nom sans le connaitre a l'avance.
	* @author		Fladnag
	* @date			2007/12/29
	*/
	public function __get($var) {
		$key=$this->nomFunction.'/'.$var;
		if (!isset($this->cache[$key])) {
			if (!isset($this->content[$var])) {
				echo('La variable ['.$var.'] n\'est pas definie dans le tableau $'.$this->nomTableau);
				exit;
			}
			$this->cache[$key] = $this->format($this->content[$var]);
		}
		return $this->cache[$key];
	}
 
	/**
		PRIVATE
	**/
 
	/**
	* @description	Formate une chaine en tenant compte de l'option magic_quotes_gpc et retourne la chaine "brute"
	* @author		Fladnag
	* @date			2007/12/29
	*/
	private function formatRAW ($var) {
		if ($this->isMagicQuotesGPC) {
			$var=stripslashes($var);
		}
		return $var;
	}
 
	/**
	* @description	Formate une chaine pour une utilisation dans une balise html
	* @author		Fladnag
	* @date			2007/12/29
	*/
	private function formatHTML($var) {
		return htmlentities($this->formatRAW($var));
	}
 
	/**
	* @description	Formate une chaine pour une utilisation dans une requete SQL
	* @author		Fladnag
	* @date			2007/12/29
	*/
	private function formatSQL($var) {
		return @mysql_real_escape_string($this->formatRAW($var));
	}
 
	/**
	* @description	Formate une variable tel que determine dans l'instance actuelle.
	* @author		Fladnag
	* @date			2007/12/29
	*/
	private function format(&$var) {
		if (is_scalar($var)) {
			$var = $this->{$this->nomFunction}($var);
		} elseif (is_array($var)) {
			array_walk($var, array($this, 'format'));
		}
		return $var;
	}
}
 
//Tests :
//mysql_connect('localhost', 'root', '');
//$In=new In();
//var_dump($In->G->HTML->id);
//var_dump($In->G->RAW->truc);
//var_dump($In->G->SQL->truc);
 
?>
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h53.


 
 
 
 
Partenaires

Hébergement Web