SIMPLE CLASSE POUR RÉCUPÉRER LES RÉSULTATS D'UNE REQUETE SQL

Signaler
Messages postés
6146
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
-
emanueledimauro
Messages postés
30
Date d'inscription
samedi 11 octobre 2008
Statut
Membre
Dernière intervention
13 avril 2011
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/53035-simple-classe-pour-recuperer-les-resultats-d-une-requete-sql

emanueledimauro
Messages postés
30
Date d'inscription
samedi 11 octobre 2008
Statut
Membre
Dernière intervention
13 avril 2011

Merci akh,

il y a une chose sur laquelle je suis vraiment d'accord... le fait de dissocier la partie client de la partie serveur et de laisser au serveur gérer les données et au client les manipuler via du simple IHM.

En Flash il y a une technique pas trop utilisée qui fait plus ou moins ça, mais à l'inverse : le flash remoting.
Il part du principe que coté serveur chacun choisi si mettre du php, du .NET, du java....

Il utilise donc un format d'échange (AMF) qui permet au client flash de piloter des classes distantes et de récupérer les datas renvoyés par les méthodes de classe.

Donc en gros je pense qu'il soit déjà bien performant, pas besoin d'aller plus loin....

J'ai utilisé ce système et c'est très bien. Pour certains développements il est fort nécessaire d'utiliser une logique IHM séparé de l'"intelligence" du serveur.

Mais je reste de l'opinion, qu'il soit pas complètement absurde de faire du sql sur du flash, mais ça dépend strictement du contexte.

Je prends tes exemples...

1) un logiciel de facturation en flash : chaque client a (évidement) une base de données différente, donc le problème ne se pose pas. Chacun peut attaquer que soit même. On donne juste le droit au SELECT, UPDATE, INSERT, DELETE...

2) Un logiciel collaboratif : ça serait au minimum pas prudent d'utiliser un système comme ça. Ou sinon on utilise ça pour toute la partie SELECT, et pour le reste (UPDATE, DELETE... ) on utilise la logique standard.

3) un jeu dans lequel les gens peuvent y inscrire leur score, un formulaire d'inscription à une newsletter, un formulaire de vote : pareil que le point N° 2

Donc voilà je suis d'accord sur le principe que ma méthode est bien délicate, et pas trop structurée. Je dois avouer que tes arguments sont quand même bien solides...
merci
Emanuele
cs_aKheNathOn
Messages postés
575
Date d'inscription
dimanche 23 décembre 2001
Statut
Membre
Dernière intervention
23 octobre 2012

Manu je ne pense pas que tu vois vraiment où je veux en venir... tu cherches à écrire du SQL dans ton flash et c'est là tout le problème, et cela ne se limite pas à la sécurité.
* Flash exécution côté client présentation (principe MVC)* PHP exécution côté serveur modèle / contrôleur

Pour faire simple, t'as pas trop le choix ... aucun framework ne permettrait d'embarquer la logique métier et le mapping côté client.

De plus, tu fais aujourd'hui du flash ... OK
Demain tu veux faire un petit soft en .NET en client lourd ... tu refais toutes les requêtes ?

La partie IHM (=côte client) est la partie la plus évolutive et la plus sujette aux évolutions techniques ... embarquer la logique métier ne servirais qu'à l'alourdir voire même t'obliger à la faire évoluer ou la ré-écrire en changeant de techno.

Maintenant côté code, rien ne t'empêche de faire la même chose que t'as fait style mysql.remplir(...); en version plus propre :

Ton service PHP retourne un array de valeurs, il est exposé style : http://domaine/services/MyService/GetItems.xml
(par exemple : le .xml indique qu'on attend du XML)

Ton SDK côté flash aurait un truc du style :
conn = SDK.Connect("http://domaine/");

Coté classes AS tu aurait une class de mapping :

class MyService {
... conn;
public MyService(conn) ...
ArrayList GetItems() {
return conn.Request("MyService", "GetItems");
}
}

Tu peux faire :
service = new MyService(conn);
ArrayList items = service.GetItems();

Ou bien tu te fais un helper pour reproduire ta fonction :
Helper.Assign(service.GetItems(), this);

C'est très schématique, mais cela te montre que plus tu as de niveaux d'abstractions et plus tu as moins à travailler.

Concernant l'attaque sur ton domaine : www.as-ql.org, tu dois t'assurer que l'attaque ne vient pas de l'intérieur.

Je te donne quelques exemples : tu fais un logiciel de facturation en flash, tu ne peux pas le proposer en SaaS (ou imagines sinon que les concurrents vont aller s'espionner entre eux).

Tu fais un logiciel collaboratif là encore tu peux pas, du moment où les utilisateurs n'ont pas tous les mêmes droits ou des droits restreints ta librairie n'est pas utilisable ...

Tu fais un jeu dans lequel les gens peuvent y inscrire leur score, tu fais un formulaire de d'inscription à une newsletter, un formulaire de vote ...etc...

Tu peux faire un très joli truc, fais les couches que j'ai décrit dans mon précédent message et puis rajoutes unes couche RAD comme tu l'as déjà fait pour ton framework ...

Bon courage pour la suite de tes dévs :)
emanueledimauro
Messages postés
30
Date d'inscription
samedi 11 octobre 2008
Statut
Membre
Dernière intervention
13 avril 2011

Merci aKheNathOn pour ton commentaire.
Le problème de fond que tu évoques et que tu as très bien ciblé est que au niveau de l'utilisateur, lui il a "plus de droits qu'il ne devrait" avoir.

Maintenant si je vois tes solutions il n'y a rien qui permettrait (sauf si je me trompe bien sur) d'écrire en dur les requêtes sur les *.as et au même temps d'améliorer ce gros problème de sécurité.

Et si tu dois écrire les requêtes ailleurs, par exemple dans des classes php, et en utilisant une passerelle AMF, on perd completement le principe même de ce que je voulais faire.

Je suis en train d'écrire des classe as3 qui sont vraiment simples et au même temps super puissantes. Par exemple tu fais

mysql.remplir("select nom, prenom from table where id=1",this);

et as va chercher sur this les composants nom et prenom. Il vérifie s'il s'agit d'un TextField ou d'un textarea et il remplace les valeurs.

Je pense qu'il soit pas possible (en fin je l'avoue) de sécuriser ce genre de système pour un usage l'utilisateur. Mais si le swf est derrière un htaccess, ou bien l'utilisateur mysql peut faire juste des selects, ou bien on a un superutilisateur que lui seul connait le mot de passe d'accés, alors dans ces contextes, ce système est très utile.

Ok il est un peu rigide, mais souvent on s'y perd en pensant à la sécurité, et on perd completement de vue nos objectifs.

Concernant mon défis, le site www.as-ql.org et encore là et personne a pu l'attaquer. J'ai envoyé un lien à pas mal de monde dans mon entourage, et pour l'instant ça tient.

Mais si on réfléchi un peu : sur un site Internet fait en flash très rarement on fait des utilisateurs
cs_aKheNathOn
Messages postés
575
Date d'inscription
dimanche 23 décembre 2001
Statut
Membre
Dernière intervention
23 octobre 2012

Hello Manu,

J'ai bossé sur quelque chose de très similaire (publié sur flashkod : http://www.flashkod.com/codes/CLASSE-LIAISON-REQUETTAGE-AVEC-SERVEUR-MYSQL-DISTANT-XSQL_38305.aspx) mais avec la notion de sécurité en moins compliqué, mais avec les mêmes failles qu'a relevé Peg.

Je pense comprendre un peu vos deux problématiques, et peut-être qu'un peu de retour sur mon expérience va t'éclairer.

A première vue Peg à l'air de chercher la petite bête mais en réalité il a tout à fait raison, c'est juste qu'il ne l'exprime pas assez clairement :

Je voulais faire du SQL dans du flash, comme j'aurais très bien pu le faire en ajax / javascript. Le problème peut ne pas se poser à première vue car l'utilisateur exécutant le code est identifié, donc un guest ne peut pas nuire.

Le problème se pose à deux niveaux :

- l'utilisateur connecté peut lui avoir plus de droits qu'il ne devrait ... mais étant faignant de ce côté je m'en fout du moment où ça m'aide (j'estime qu'être faignant en informatique est une qualité au passage :)

- autre problème c'est la logique métier et la ré-utilisabilité et c'est là que le bat blesse :)

Etant faignant je ne voulais pas avoir à écrire le SQL à chaque fois, répéter des règles métier complexes, ou bien en changeant la structure repasser par des kilomètres de code.

Du coup quand tu deal avec des bases de données, la bonne pratique veut que tu en fasses des objets. Le choix de l'environnement où tu fais ton objet est important, on pourrait être tenté de le faire en flash (avec tous les problèmes que ça pose au niveau sécurité) ou bien le faire côté PHP, permettant ainsi de partager les ressources côté ajax, flash, ou bien un MVC classique avec des vues en HTML.

Donc pour répondre à ta source, tu as raison sur le fond, mais tu t'y prends de la mauvaise manière.

Ce que t'aurais dû chercher à faire :

Une partie API :
- c'est d'intégrer un ORM, avec un DBAL
- faire des helpers pour la sérialisation : XML, JSON, CSV ...
- un équivalent de ton data.php pour le routage des appels en mode REST, et utilisant les helpers pour exprimer les retours
- un mode session ou quelquechose d'équivalent permettant de sécuriser l'appel de certains services

Une partie SDK :

- des classes de base pour les autres languages
* Flash
* Javascript
- éventuellement si tu est motivé, à partir d'une classe PHP tu peux générer l'enveloppe AS ou JS te permettant de ne pas perdre du temps sur une seconde re-définition (cf PHP+Reflection).

Dans le principe ça serait un peu similaire à ça : http://www.phpcs.com/codes/AJAX-TOOLKIT-PARTAGE-CLASSES-ENTRE-PHP-JS_47075.aspx

------

Lorque t'enchaines sur la création d'un nouveau projet avec ton framework, tu fais côté PHP tes classes qui gèrent la base de données, et puis tu inclues dans ton flash les enablers AS qui leur correspondent.

Le tout sera : optimisé, sécurisé, simple, ré-utilisable, évolutif

Bon courage, si tu ponds un projet comme ça n'hésites pas à me prévenir :))
akh