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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
echo str_protege('mot1<mot2mot3<? echo "jjj"; ?>mot4?mot5"mot6\'mot7');
=> mot1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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