Securit PHP

Fermé
jupiler - 11 déc. 2009 à 08:14
Impli Messages postés 235 Date d'inscription mardi 24 novembre 2009 Statut Membre Dernière intervention 18 août 2013 - 11 déc. 2009 à 10:55
Bonjour,

j'ai besoin d'un peu d'éclaircissement sur la sécurité PHP

voilà je souhaite sécurisé un formulaire en php mais c est un peu flou

par exemple j'ai

$var=mysql_real_escape_string(htmlspecialchars($_POST['var']));

dans quel cas utilisé mysql_real_escape_string ou htmlspecialchars ou htmlentities

Merci de votre aide
A voir également:

5 réponses

Pilow Messages postés 400 Date d'inscription vendredi 2 octobre 2009 Statut Membre Dernière intervention 23 décembre 2009 71
11 déc. 2009 à 08:25
Bonjour,

https://www.php.net/manual/fr/function.htmlentities.php
https://www.php.net/manual/fr/function.htmlspecialchars.php
https://www.php.net/manual/fr/function.mysql-real-escape-string.php

Tout dépend de ce que tu veux faire de tes chaines je pense, mais je ne suis pas encore PRO en sécurité php.

Exemple pour mysql_real_escape_string : Cette fonction doit toujours (avec quelques exceptions) être utilisée pour protéger vos données avant d'envoyer la requête à MySQL. Cela sécurise tes données avant leur insertion/traitement dans la base de données
1
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
11 déc. 2009 à 09:23
faire comme ça c'est le meilleur moyen pour oublier quelque chose

le mieux est de faire :

<?php
	
	function htmlSecure($string) {
		$string = htmlentities($string,ENT_QUOTES);
		$char = array(
			'='=>'&#61;',
			'%'=>'&#37;',
			'!'=>'&#33;',
			'_'=>'&#95;',
			'|' => '&#124;',
			'(' => '&#40;',
			')' => '&#41;',
			'{' => '&#123;',
			'}' => '&#125;',
			'[' => '&#91;',
			']' => '&#93;',
		);
		$string = strtr($string,$char);
		if ($stringSql = @mysql_real_escape_string($string))  return $stringSql;
		else return $string;
	}
	
	function protectArray($item) {
		if(is_array($item)) {
			$temp = array();
			foreach($item as $key => $a) {
				if(is_array($a)) $temp[$key] = protectArray($a);
				elseif(is_string($a)) $temp[$key] = htmlSecure($a);
				else $temp[$key] = $a;
			}
			return $temp;
		}
		elseif(is_string($item)) return htmlSecure($item);
		else return $item;
	}
	
	$_POST = protectArray($_POST);
	$_GET = protectArray($_GET);
	$_COOKIE = protectArray($_COOKIE);
	
?>


tu met ça en haut de toutes tes pages ou de l'index si tu fais tout dedans...

si tu utilise les données pour une base de donnée mysql il faut faire une connexion avant l'appel des fonctions pour que mysql_real_escape_string fonctionne...

et au moins là tu peux être certain que tu n'oublieras pas de protéger une variable !

et c'est vachement moins contraignant que de tapper a chaque fois tout ça !

si tu veux avoir accés à la variable sans quelle soit modifié il de suffit de faire
$var = html_entity_decode($var);
1
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
11 déc. 2009 à 10:49
et bien test !

déjà essaye de faire une injection avec ça

ensuite si tu inclus toutes tes pages dans l'index ou si tu inclus un fichier de fonctions au début de tes pages, tu n'as à le taper et à l'appeler qu'une fois

la fonction htmlSecure utilise htmlentites() et protège certain autres caractères même si il n'est pas forcément utile de tous les protéger...

ensuite elle appelle mysql_real_escape_string()

et protège la chaine contre les injection sql si une connexion sql à était établi

ensuite protectArray appelle cette fonction là en récursive et protège toutes les chaines dans les tableaux!

personnellement je ne l'ai tapé qu'une fois et je n'ai plus à me prendre la tête avec les injections.

je l'ai mis dans un fichier qui est appellé par l'index et toutes mes pages sont des inclusions dans l'index...

ensuite quand je disais que ça éviter de le taper à chaque fois voilà un exemple pour un formulaire de renseignement d'un espace membre par exemple

avec les fonction tu fais :

	$_POST = protectArray($_POST);
	$_GET = protectArray($_GET);
	$_COOKIE = protectArray($_COOKIE);


au début de ta page

sans ca donne :
$var = mysql_real_escape_string(htmlentities($_POST['presentation']));
$var = mysql_real_escape_string(htmlentities($_POST['mail']));
$var = mysql_real_escape_string(htmlentities($_POST['pays']));
$var = mysql_real_escape_string(htmlentities($_POST['sexe']));
$var = mysql_real_escape_string(htmlentities($_POST['annenaissance']));


ça revient au même sauf que la première solution fait tout toute seule et qu'elle protège certain autres caractères comme le % qui peux proser problème dans un WHERE en sql !

ensuite si il y a un oublis dans la fonction on a qu'à modifier cette fonction, ça prend 2 minutes plutôt que de rechercher toutes les lignes où elle a été appelée !

mais essayes de faire une injection en utilisant ça ! et encore plus XSS !
1
Impli Messages postés 235 Date d'inscription mardi 24 novembre 2009 Statut Membre Dernière intervention 18 août 2013 34
11 déc. 2009 à 09:51
Je vois pas en quoi ta fonction htmlSecure() protége ... Les failles XSS sont toujours là ...

Ton système est le meilleur moyen de faire une boulette ou de laisser une faille de sécurité ouverte.
PHP met à disposition des fonctions natives au langage pour protéger les sites, inutiles de faire nos propres fonctions (ou alors elles serviront juste à englober les fonctions existantes ou les raccourcir).


et c'est vachement moins contraignant que de tapper a chaque fois tout ça !
Et là encore, ça revient au même, dans tous les cas il doit toujours taper une fonction pour protéger ces données. Alors autant le faire avec un truc réellement efficace.



Pour répondre à la question d'origine :

htmlspecialchars(); -> Remplace une partie des caractères dans une chaîne qui pourraient être du code HTML. (&,',",<,>)

htmlentities(); -> La même chose que htmlspecialchars, sauf qu'elle remplace tous les caractères qui ont des équivalents HTML. De plus, il existe une fonction inverse, html_entity_decode();.

mysql_real_escape_string(); -> Protége des injections SQL. Les caractères commes les guillemets sont échappés avec un \. Ce qui évite qu'un malin modifie tes requêtes à la volée.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Impli Messages postés 235 Date d'inscription mardi 24 novembre 2009 Statut Membre Dernière intervention 18 août 2013 34
11 déc. 2009 à 10:55
Je n'avais pas fait gaffe au htmlentities(); dans ta fonction.

(ou alors elles serviront juste à englober les fonctions existantes ou les raccourcir).

C'est bien ce que je dis, ça peut seulement servir à raccourcir le noms des fonctions, et/ou à les englober.
Et je n'ai pas dit que ta fonction était sensible au injections, mais seulement aux XSS (avant que je vois le htmlentities).

Autant pour moi.
0