Page 1 sur 1

Sécurisation des variables POST et GET ... presque bon

Posté : 23 août 2012, 16:44
par gigipop
Bien le bonjour,

Je viens voir car je bute sur un problème.

Je souhaites sécuriser l’ensemble de mes variables POST et GET en une seule fois.
J'ai trouvé pour cela ce site.

je fais donc :
$_ = array_map('mysql_real_escape_string', array_map('htmlentities', array_merge($_GET, $_POST)));
Cela fonctionne très bien, sauf dans un cas; je m'explique :

Avec un formulaire qui contient des champs qui lors de l'envoi sont passé par un tableau, j'obtiens cette erreur :
Warning: htmlentities() expects parameter 1 to be string, array given in /Applications/MAMP/...config.php on line 6

Auriez-vous une solution ou un début de piste ?
Merci beaucoup !

Re: Sécurisation des variables POST et GET ... presque bon

Posté : 23 août 2012, 16:45
par gigpop
le site ... : http://blog.idleman.fr/?p=628

merci

Re: Sécurisation des variables POST et GET ... presque bon

Posté : 24 août 2012, 08:07
par Mazarini
Je pense que tu est obligé de faire une fonction récursive qui fait la modification que tu veux dans le cas général et qui s'appelle dans le cas d'un array.

Re: Sécurisation des variables POST et GET ... presque bon

Posté : 24 août 2012, 12:12
par Lirio
Il faut regarder du côté de la fonction array_walk_recursive.
Quelque chose du genre :
$globals = $_POST + $_GET;

/**
 * Fonction de rappel
 * Parfois, on ne peut pas utiliser directement htmlentities.
 */
function clear(&$input, $key)
{
    $input = htmlentities($input);
}

$result = array_walk_recursive($globals, 'clear');

Re: Sécurisation des variables POST et GET ... presque bon

Posté : 25 août 2012, 21:52
par gigipop
Merci beaucoup, voilà comment je procède finalement :
public function securizeVariables( $isAdmin = false ) {

		$this->isAdmin = $isAdmin;

		global $_;

		$_ = array();

		foreach($_POST as $key=>$val) {

		if( is_array($val) ) {
				$val = $this->copyTab($val);
			} else { 
				$val = $this->protectVar($val);
			}

			$_[$key]=$val;
		}

		foreach($_GET as $key=>$val) {

			if( is_array($val) ) {
				$val = $this->copyTab($val);
			} else {
				$val = $this->protectVar($val);
			}

			$_[$key]=$val;
		}
	}

	private function protectVar( $val ) {

		if($this->isAdmin) {
			$val = mysql_escape_string( $val );
		} else {
			$val = mysql_escape_string( htmlentities($val, ENT_QUOTES, "UTF-8") );
		}
	
		return $val;
	}

	private function copyTab($tab)
	{
	    $tmp = array();
	    foreach($tab as $val)
	    {
	         if(is_array($val))
	             $tmp[] = $this->copy_tab($val);
	         else
	             $tmp[]= $val = $this->protectVar($val);
	    }
	    return $tmp;
	}

Re: Sécurisation des variables POST et GET ... presque bon

Posté : 26 août 2012, 04:14
par AB
ATTENTION, IL NE FAUT PAS UTILISER HTMLENTITIES POUR ENREGISTRER DES DONNEES DANS UNE BDD. C'est une fausse bonne idée. Il faut utiliser htmlentities (ou de préférence htmlspecialchars) uniquement à l'affichage.

Re: Sécurisation des variables POST et GET ... presque bon

Posté : 26 août 2012, 11:31
par Gigipop
Merci, mais alors comment empêcher l insertion de balise script en base de donnée ?

Re: Sécurisation des variables POST et GET ... presque bon

Posté : 26 août 2012, 16:06
par AB
Merci, mais alors comment empêcher l insertion de balise script en base de donnée ?
En quoi est-ce gênant ?