"proteger" les variables dans du SQL

11 réponses
AuteurMessage

Bool |
Modérateur

Photo de Bool

Inscrit le : 09/05/2005

# Le 10/05/2007 à 14:45

Hello,

je mets ici une partie d'un bout de code que j'utilise depuis des années pour être certain de ne pas oublier de protéger des variables utilisées dans une requête SQL.

Ce n'est là qu'une petite partie du code, mais il y a l'essentiel.

Le principe, pour exécuter une requête je fais uniquement :

$res = query( "update matable set un_champ = ?
where autre_champ = ?
and encore_un <> ?",
array( $valeur1, $valeur2, $valeur3 ) );


Ici les 3 variables $valeurX vont être automatiquement échapées, puis remplacées dans la requête.

Le bout de code en question :
function query( $requete, $params )
{
// à définir : $sql_handle

if( count( $params ) > 0 )
{
$search = array();
$replace = array();

$count = 0;
foreach( $params as $idx => $value )
{
if( $value === NULL )
$value = 'NULL';
elseif( is_string( $value ) )
$value = '\''.mysql_real_escape_string( $value, $sql_handle ).'\'';
elseif( is_bool( $value ) )
$value = (int) $value;

$token = '¤¤'.($count++).'¤¤';
$requete = preg_replace( '#\\?#', $token, $requete, 1 );
$search[] = $token;
$replace[] = $value;
}

$requete = str_replace( $search, $replace, $requete );
}

if( ! $result = @ mysql_query( $requete, $sql_handle ) )
{
// traitement de l'erreur
// [...]
}

return $result ;
}


Voilà. En espérant que cela en aide quelques uns.


PS : évidement ce n'est utile qu'en remplacement de "mysql_query" ; pas avec les autres extensions.

daevel : infogérance et conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

LePhasme | Guillaume
Membre

Photo de LePhasme

Inscrit le : 09/05/2005

# Le 10/05/2007 à 15:13

Houla ca c'est du truc de pro ;-)
Merci Bool :!

Paris Apartments RentalsOuvrir dans une nouvelle fenetre Avertisseur Autonome de FumeeOuvrir dans une nouvelle fenetre ViadeoOuvrir dans une nouvelle fenetre

Bool | Olivier
Modérateur

Photo de Bool

Inscrit le : 09/05/2005

# Le 14/05/2007 à 14:22

Pas bete effectivement.

Par contre pas besoin de debug_backtrace : __FILE__ et __LINE__ suffisent

daevel : infogérance et conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

LePhasme | Guillaume
Membre

Photo de LePhasme

Inscrit le : 09/05/2005

# Le 14/05/2007 à 14:23

J'ai rien compris dob tu peux expliciter davantager?

Paris Apartments RentalsOuvrir dans une nouvelle fenetre Avertisseur Autonome de FumeeOuvrir dans une nouvelle fenetre ViadeoOuvrir dans une nouvelle fenetre

Bool | Olivier
Modérateur

Photo de Bool

Inscrit le : 09/05/2005

# Le 14/05/2007 à 14:32

dob : ah oki, je pensais que tu ajoutais ça dans l'appelant. Encore plus interessant alors.

daevel : infogérance et conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

LePhasme | Guillaume
Membre

Photo de LePhasme

Inscrit le : 09/05/2005

# Le 14/05/2007 à 14:44

Ah super, j'ai compris merci bcp.
Ca peut en effet se reveler interessant, fallait y penser ;-)

Paris Apartments RentalsOuvrir dans une nouvelle fenetre Avertisseur Autonome de FumeeOuvrir dans une nouvelle fenetre ViadeoOuvrir dans une nouvelle fenetre

Julgates | Julien
Administrateur

Photo de Julgates

Inscrit le : 09/03/2005

# Le 14/05/2007 à 14:49

Il est trop fort le dob, il a des ailes qui poussent

Shopping Time NetworkOuvrir dans une nouvelle fenetre - Founder / CTO

TomPascal | Pascal
Membre

Photo de TomPascal

Inscrit le : 08/11/2006

# Le 14/05/2007 à 15:38

Très bonne idée en effet... Je sais que je vais devoir mettre à jour ma classe DB.inc.php moi aussi ;)
Merci.

Archipel WebOuvrir dans une nouvelle fenetre Conception, réalisation, référencement de sites internet.

Rano | Jean
Modérateur

Photo de Rano

Inscrit le : 13/04/2005

# Le 14/05/2007 à 15:45

ah pas con, merci

Chambres d'hote tavelOuvrir dans une nouvelle fenetre
Séjours en provenceOuvrir dans une nouvelle fenetre
Forum mariageOuvrir dans une nouvelle fenetre

tonguide | Jeremy
Modérateur

 

Inscrit le : 09/05/2005

# Le 14/05/2007 à 16:07

PDO ne fait pas déjà ça ?

$pdo->prepare("INSERT INTO table (champ1, champ2) VALUES (:champ1, :champ2)");

ou, au choix,

$pdo->prepare("INSERT INTO table (champ1, champ2) VALUES (?, ?)");

puis bindParam() ou execute(array());

http://fr2.php.net/pdoOuvrir dans une nouvelle fenetre

Bool | Olivier
Modérateur

Photo de Bool

Inscrit le : 09/05/2005

# Le 14/05/2007 à 17:47

tonguide :

Bool a dit :
[...]
PS : évidement ce n'est utile qu'en remplacement de "mysql_query" ; pas avec les autres extensions.



PDO n'est pas (encore) disponible partout, tout comme l'extension mysqli.

daevel : infogérance et conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

tonguide | Jeremy
Modérateur

 

Inscrit le : 09/05/2005

# Le 14/05/2007 à 17:50

Ok chef

Répondre

Vous ne pouvez pas participer au forum, car votre inscription n'a pas été validée. Pour vous faire valider en tant que Membre, cliquez ici.

© MHN - Tous droits réservés | CNIL N°844440 | 24/11/2024 18:54:08 | Généré en 8.26ms | Contacts | Mentions légales |