Page 1 sur 1

php et poka yoké

Posté : 25 août 2008, 14:23
par yuuzhantar
Bonjour

j'ai récemment lu un très bon article sur la sécurité poka yoké
http://www.nexen.net/articles/dossier/1 ... a-yoke.php

et j'ai décidé de mettre mon site à la poka yoké

en suivant l'exemple donné dans l'article, je suis en train d'écrire trois type de fonctions

- les fonctions de test
- les fonction pour obtenir des valeurs 'exactes'
- les fonctions pour filtrer

quand je dis 'valeurs exactes' c'est à dire que si on demande un int et qu'on en reçoit un c'est bon, sinon on génère une exception

et les fonctions de filtrage qui servent par exemple à récupérer un int dans une chaine

je voulais vous demander à première vue ce que vous en pensiez et si vous me conseillez de continuer dans cette direction

je n'ai pas fait toutes les fonctions, ceci est une ébauche

merci
<?php

class filtre implements ArrayAccess
	{
	protected $donnees;
	protected $bdd;
	
	function __construct($donnees)
		{
		global $bdd;
		
		if (!is_array($donnees)) 
			{
			throw new Exception ('[EXCEPTION] : une action non conforme a étée effectuée');
			}
		
		$this->donnees=$donnees;
		$this->bdd=&$bdd;
		}
	
	/****************************************************************************
	implementation de l'interface ArrayAcces
	****************************************************************************/
	function offsetExists($offset)
		{
		return (isset ($this->donnees[$offset]));    
		}
	
	function offsetSet($offset,$value)
		{
		throw new Exception ("You cannot extract information from an instance 
		of Filter as if it were an array");
		}
	
	function offsetDelete($offset)
		{
		throw new Exception ("You cannot extract information from an instance 
		of Filter as if it were an array");
		}
	
	function offsetGet($offset)
		{
		throw new Exception ("You cannot extract information from an instance 
		of Filter as if it were an array");
		}
	
	/****************************************************************************
	fonction de test
	****************************************************************************/
	function is_int($offset)
		{
		return preg_match('`^[0-9]+$',$this->donnees[$offset]);
		}
		
	function is_float($offset)
		{
		return preg_match('`^[0-9]+\.[0-9]+$',$this->donnees[$offset]);
		}
		
	function is_numeric($offset)
		{
		return preg_match('`(^[0-9]+$)|(^[0-9]+\.[0-9]+$)',$this->donnees[$offset]);
		}
		
	function is_alpha($offset)
		{
		return preg_match('`^[a-zA-Z]+$',$this->donnees[$offset]);
		}
		
	function is_string($offset)
		{
		if($this->donnees[$offset]==strip_tags($this->donnees[$offset]))
			{
			return preg_match('`^[a-zA-Z0-9 &é\"\'\(-è_çà\)=~#\{\[\|\`\\\^@\]\}\^\$ù\*!:;,¨£µ%§/\.\?¤\.\+-/*\<\>ÀÁÂÃÄÅ
			àáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ]+$`',$this->donnees[$offset]);
			}
		else
			{
			return false;
			}
		}
		
	function is_text($offset)
		{
		if($this->donnees[$offset]==strip_tags($this->donnees[$offset]))
			{
			return preg_match('`^[a-zA-Z0-9 &é\"\'\(-è_çà\)=~#\{\[\|\`\\\^@\]\}\^\$ù\*!:;,¨£µ%§/\.\?¤\.\+-/*\<\>ÀÁÂÃÄÅ
			àáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ(\n)(\t)(\r)]+$`',$this->donnees[$offset]);
			}
		else
			{
			return false;
			}
		}
		
	function is_alphanum($offset)
		{
		return preg_match('`^[a-zA-Z0-9]+$',$this->donnees[$offset]);
		}
		
	function is_array($offset)
		{
		return is_array($this->donnees[$offset]);
		}
		
	function is_object($offset)
		{
		return is_object($this->donnees[$offset]);
		}
		
	function is_resource($offset)
		{
		return is_resource($this->donnees[$offset]);
		}
		
	function is_html($offset)
		{
		return preg_match('`^[a-zA-Z0-9 &é\"\'\(-è_çà\)=~#\{\[\|\`\\\^@\]\}\^\$ù\*!:;,¨£µ%§/\.\?¤\.\+-/*\<\>ÀÁÂÃÄÅ
		àáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ(\n)(\t)(\r)]+$`',$this->donnees[$offset]);
		}
		
	function is_bool($offset)
		{
		return preg_match('`(^true$)|(^false$)|(^0$)|(^1$)`',$this->donnees[$offset]);
		}
		
	function is_sql($offset)
		{
		if($offset==mysql_real_escape_string($offset,$bdd))
			{
			return true;
			}
		else
			{
			return false;
			}
		}
		
	/****************************************************************************
	fonction de filtrage strict
	****************************************************************************/
	function get_int($offset)
		{
		if(isset($this->donnees[$offset])&&$this->is_int($this->donnees[$offset]))
			{
			return (int)$this->donnees[$offset];
			}
		else
			{
			
			}
		}
			
	function get_float($offset)
		{
		if(isset($this->donnees[$offset])&&$this->is_float($this->donnees[$offset]))
			{
			return (float)$this->donnees[$offset];
			}
		else
			{
			
			}
		}
	
	function get_alphanum($offset)
		{
		if(isset($this->donnees[$offset])&&$this->is_alphanum($this->donnees[$offset]))
			{
			return $this->donnees[$offset];
			}
		else
			{
			
			}
		}	
				
	function get_string($offset)
		{
		if(isset($this->donnees[$offset])&&$this->is_string($this->donnees[$offset]))
			{
			return $this->donnees[$offset];
			}
		else
			{
			
			}
		}
			
	/****************************************************************************
	fonction de filtrage souple
	****************************************************************************/
	
	function filtre_int($offset)
		{
		if(isset($this->donnees[$offset]))
			{
			return (int)$this->donnees[$offset];
			}
		else
			{
			
			}
		}
		
	function filtre_float($offset)
		{
		if(isset($this->donnees[$offset]))
			{
			return (float)$this->donnees[$offset];
			}
		else
			{
			
			}
		}
		
	function filtre_alphanum($offset)
		{
		if(isset($this->donnees[$offset]))
			{
			return 	return preg_replace('`[^a-zA-Z0-9]`','',$this->donnees[$offset]);
			}
		else
			{
			
			}
		}
		
	function filtre_string($offset)
		{
		if(isset($this->donnees[$offset]))
			{
			return preg_replace('`[^a-zA-Z0-9 &é\"\'\(-è_çà\)=~#\{\[\|\`\\\^@\]\}\^\$ù\*!:;,¨£µ%§/\.\?¤\.\+-/*\<\>ÀÁÂÃÄÅ
			àáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ`','',$this->donnees[$offset]);
			}
		else
			{
			
			}
		}
		
	function filtre_text($offset)
		{
		if(isset($this->donnees[$offset]))
			{
			return preg_replace('`[^a-zA-Z0-9 &é\"\'\(-è_çà\)=~#\{\[\|\`\\\^@\]\}\^\$ù\*!:;,¨£µ%§/\.\?¤\.\+-/*\<\>ÀÁÂÃÄÅ
			àáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ(\n)(\t)(\r)]`','',$this->donnees[$offset]);
			}
		else
			{
			
			}
		}
		
	/****************************************************************************
	modification de méthodes de base de la classe
	****************************************************************************/
	
	function __get($offset)
		{
		throw new Exception ("You cannot access members of an array 
		encapsulated by Filter directly");
		}
	
	function __set($offset, $value)
		{
		throw new Exception ("You cannot access members of an array 
		encapsulated by Filter directly");
		}
	}
?>

Posté : 30 août 2008, 15:05
par Sékiltoyai
Ya rien qui me choque, mis à part ton utilisation de la base de données. A savoir déjà que le global est à bannir, ca se remplace à la limite par une méthode et une propriété statique. Et il est totalement superflu d'assigner ta variable $bdd comme une référence vu qu'une ressource ne se duplique jamais, c'est en quelque sorte déjà une référence…
Ensuite, tu gagnerais à utiliser PDO ou bien un filtrage fait maison spécifique à ta base de données parce que même si tu insères des données ne venant pas de l'extérieur de ton script, l'utilisation des requêtes préparées est nécessaire voire indispensable…