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

gigipop
Invité n'ayant pas de compte PHPfrance

23 août 2012, 16:44

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 !

gigpop
Invité n'ayant pas de compte PHPfrance

23 août 2012, 16:45

le site ... : http://blog.idleman.fr/?p=628

merci

ViPHP
ViPHP | 2577 Messages

24 août 2012, 08:07

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.

Eléphanteau du PHP | 34 Messages

24 août 2012, 12:12

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');
These lines the last endeavor,
To find the missing lifeline.

gigipop
Invité n'ayant pas de compte PHPfrance

25 août 2012, 21:52

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;
	}

ViPHP
AB
ViPHP | 5818 Messages

26 août 2012, 04:14

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.

Gigipop
Invité n'ayant pas de compte PHPfrance

26 août 2012, 11:31

Merci, mais alors comment empêcher l insertion de balise script en base de donnée ?

ViPHP
AB
ViPHP | 5818 Messages

26 août 2012, 16:06

Merci, mais alors comment empêcher l insertion de balise script en base de donnée ?
En quoi est-ce gênant ?