SQL Procédural -> Sécurisation

Mammouth du PHP | 985 Messages

09 avr. 2010, 08:39

En procédural, contre les injections SQL il existe la fonction mysql_real_escape_string() mais on peut renforcer la sécurité en utilisant les variables SQL.

Exemple:
$email = mysql_real_escape_string($email); // Pour MYSQL
$password = mysql_real_escape_string($password); // Pour MYSQL

$email = mysqli_real_escape_string($email); // Pour MYSQLI
$password = mysqli_real_escape_string($password); // Pour MYSQLI

$requete1 = "SELECT @email := '$email', @pass := '$password'";
$requete2 = "SELECT `email` FROM `table` WHERE `email` = @email AND `password` = @pass";
En attendant de passer à la programmation objet :)
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Eléphant du PHP | 121 Messages

19 avr. 2010, 23:42

Je pense qu'il est surtout grand temps de passer à PDO à moins d'être encore dans PHP4 jusqu'au cou.
$query = $db->prepare('SELECT email FROM `table` WHERE email = ? AND `password` = ?');
var_dump($query->execute(array($email, $pasword)->fetchAll());
Adieu *real_escape_string ! Tu peux aller te reposer au côté de magic_quotes, addslash() et autres horreurs. Sans rancunes.

ViPHP
AB
ViPHP | 5818 Messages

20 avr. 2010, 03:17

A noter qu'en mode procédural mysqli_real_escape_string() doit avoir deux paramètres dont le premier est un identifiant de lien retourné par la fonction mysqli_connect() ou par la fonction mysqli_init() et le second est la chaîne de caractères à échapper. Et c'est le même principe pour mysqli_query().

Mammouth du PHP | 985 Messages

20 avr. 2010, 11:51

Je pense qu'il est surtout grand temps de passer à PDO à moins d'être encore dans PHP4 jusqu'au cou.
Sans rancunes.
Oui oui , on connait PDO, merci :wink:

Mais le sujet est SQL procédural.

D'ailleurs le terme exact serait surtout les requêtes préparées au lieu de simplement parler de PDO.
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 5462 Messages

20 avr. 2010, 13:26

Je pense qu'il est surtout grand temps de passer à PDO à moins d'être encore dans PHP4 jusqu'au cou.
Sans rancunes.
Oui oui , on connait PDO, merci :wink:

Mais le sujet est SQL procédural.

D'ailleurs le terme exact serait surtout les requêtes préparées au lieu de simplement parler de PDO.
ouai, en procédural on peux aussi faire des requête préparer autant avec mysql qu'avec mysqli :wink:

Eléphant du PHP | 121 Messages

20 avr. 2010, 17:35

Pardon :oops: ça me fait toujours de la peine quand on parle de vieux machins. PDO FTW ! ;-)

ViPHP
ViPHP | 5462 Messages

20 avr. 2010, 17:47

mysqli est plus complet que PDO_MYSQL

Eléphant du PHP | 121 Messages

20 avr. 2010, 19:18

Complet ? Comme quoi ?

Ce que j'aime chez PDO c'est évidement son orientation objet, mais surtout l'abstraction des toutes ces vilaines API avec lesquelles ont devait autrefois jongler. J'utilise deux types de base de données dans mon CMS (MySQL et SQLite) et je suis bien content de pas avoir à me soucier de l'API, c'est la même pour tout le monde (même s'il faut un peu de magie pour les requêtes...).

Ho, regardes, tu me fais parler de PDO ;-)

PS: Et les exceptions ! On ne parle pas assez des exceptions.

ViPHP
AB
ViPHP | 5818 Messages

20 avr. 2010, 19:39

PS: Et les exceptions ! On ne parle pas assez des exceptions.
Sans doute parce que mysql est tellement performant que ça marchait pratiquement aussi bien avant :wink:
et surtout la gestion des erreurs peut se faire autrement.

Je te rejoins pour dire que l'énorme avantage de PDO est de pouvoir changer assez facilement de type de bdd,
mais pour le reste, sans rentrer dans la polémique, pour un usage courant y'a pas de quoi sauter au plafond :)

ViPHP
ViPHP | 2291 Messages

20 avr. 2010, 20:16

Je pense qu'il est surtout grand temps de passer à PDO à moins d'être encore dans PHP4 jusqu'au cou.
$query = $db->prepare('SELECT email FROM `table` WHERE email = ? AND `password` = ?');
var_dump($query->execute(array($email, $pasword)->fetchAll());
Adieu *real_escape_string ! Tu peux aller te reposer au côté de magic_quotes, addslash() et autres horreurs. Sans rancunes.
Salut,
Sauf erreur de ma part, cette technique est plus sûre que celle proposer par dr@ke, cependant toutes les interfaces de base de donnée n'en disposent pas et donc il faudra utiliser la méthode de dr@ke ou utilisé des procédure stockées.
De plus ta technique à un impact non négligeable sur les performance surtout quand la requête n'est utiliser qu'une seule fois.
Non seulement le code php est plus long, mais en plus la séparation de la préparation et l'exécution de celle-ci coûte plus cher au serveur.

A+ :)
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

ViPHP
ViPHP | 5462 Messages

20 avr. 2010, 20:52

Complet ? Comme quoi ?
mysqli est full compatible mysql > 4.1, et a le droit a la gestion des statistiques avec mysqli_get_cache_stats(), mysqli_get_client_stats(), mysqli_get_connection_stats()

Eléphant du PHP | 121 Messages

27 avr. 2010, 10:48

Tu veux dire que tu peux utiliser des fonctions non documentées totalement obscures ? ;-)

ViPHP
ViPHP | 5462 Messages

27 avr. 2010, 10:52

Tu veux dire que tu peux utiliser des fonctions non documentées totalement obscures ? ;-)
t'es anglophobe ?
sinon ta le droit aux requêtes multiples aussi avec mysqli_multi_query :wink:

Mammouth du PHP | 672 Messages

27 avr. 2010, 11:48

Tu veux dire que tu peux utiliser des fonctions non documentées totalement obscures ? ;-)
t'es anglophobe ?
Même en étant anglophone, ça reste des fonctions non documentées :
Page PHP sur mysqli_get_client_stats()
This function is currently not documented; only its argument list is available.
#-o

Mammouth du PHP | 985 Messages

27 avr. 2010, 12:49

Tout ceci est hors-sujet :roll:

Ce n'est tout de même pas compliqué de comprendre que le sujet est la sécurisation d'une requête Mysql en mode procédural...
Le titre du sujet ainsi que son introduction sont pourtant, d'après moi, plutôt claires.

J'ai mis cette information car je la trouvais intéressante et peu documentée sur le net.

Cette information ne vient d'ailleurs pas de moi mais de mes lectures, et pour être précis dans le livre:
http://www.amazon.fr/Securite-PHP-MySQL ... 212121148/

J'en ai profité pour en faire un petit exemple plus concret.

Donc le sujet n'est pas quelle est la meilleur méthode à utiliser, mais juste:
Voici une méthode intéressante et peu connue...
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.