Simple classe pour récupérer les résultats d'une requete sql

Soyez le premier à donner votre avis sur cette source.

Vue 6 892 fois - Téléchargée 481 fois

Description

Cette classe permet de récupérer les données provenant d'une requête faite à partir du flash.
La requête est cryptée et envoyé au php (fichier data.php) qui la décrypte pour la traiter.

C'est juste un début, il n'y a pas de gestion des erreurs.

La classe intègre l'évènement "fin_requete" qui permet d'agit et récupérer les infos au moment que le résultat arrive et il est prêt.

=== config ==============================================================
La configuration de la base de données (serveur, user et pass) se fait sur mysql.php
Sur le fichier de classe on doit configurer le URL du fichier data.php
=========================================================================

Source / Exemple :


//======================================================
// utilisation de la classe MySqlConn
//======================================================

/// on definit l'instance de classe
var mysql:MySqlConn = new MySqlConn();

//// on applique une requete
mysql.query_exec("select nom, prenom from matable");

/// on gère l'évenement de fin requete
mysql.addEventListener("fin_requete", vasy);

///// on execute une fonction et on gère les valeurs obtenues
///// chaque ligne aura un array ligne[i] (de 1 à n_lignes)
///// chaque élément du tableau est un objet dont les propriétés 
///// sont nommées comme les champs qui résultent de la requete

function vasy(e):void{

	var n_lignes:int = e.target.n_lignes;
	
	for (var i:int=1; i<=n_lignes;i++){
	
	 trace(e.target.ligne[i].nom);
 	 trace(e.target.ligne[i].prenom);

	}

}

//======================================================
// classe
//======================================================

package  
{
	/**

  • ...
  • @author emanuele
  • /
import flash.events.*; import flash.net.*; import flash.utils.getTimer; import flash.display.*; //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@ CLASSE MySqlConn //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ public class MySqlConn extends Sprite { ////////////////////////////////////////////////////////////////////////////////////////// ///// V A R I A B L E S ////////////////////////////////////////////////////////////////////////////////////////// //============= criptage =================================== private var chiave:String = "abcdyfx9ilk"; //============= URL =================================== //private var base_url:String = ""; private var base_url:String = "http://127.0.0.1/votresite/"; private var file_data :String = base_url+"data.php"; //============= autres =================================== public var ligne:Array = new Array(); public var n_fields:int = -1; public var n_lignes:int = -1; ////////////////////////////////////////////////////////////////////////////////////////// ///// M E T H O D E S ////////////////////////////////////////////////////////////////////////////////////////// public function MySqlConn() { } public function query(str:String):String { var i:Number = 0; var count:Number = str.length; var final:String = ""; while (i<count){ var ch:String = str.substr(i,1); var char:String = String( ch.charCodeAt(0) ); for (var j:int=1; j<=char.length; j++) { var lettre:String = String(char.substr(j-1, 1)); if (lettre == "0") { lettre = "10"; } var nouvelle:String = chiave.substr(int(lettre),1); final += nouvelle; } final += chiave.substr(0,1); i++; } return final; } public function query_exec(req_str:String):void { ////// PARTE VARIABILI ========================= var variables:URLVariables = new URLVariables(); variables.alea = getTimer(); variables.rq = query(req_str); //trace(variables.toString()); ////// PARTE REQUEST ========================= var request:URLRequest = new URLRequest(file_data); request.method = URLRequestMethod.POST; request.data = variables; /// è qui che si lega a variables ////// PARTE LOADER ========================= var loader:URLLoader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.VARIABLES; loader.load(request); loader.addEventListener("complete", vasy); function vasy(e:Event):void{ var ind_i:int = 0; var ind_j:int = 0; n_fields = e.currentTarget.data.n_fields; n_lignes = e.currentTarget.data.n_rows; ligne.splice(0,ligne.length); for (ind_i = 1; ind_i <= n_lignes; ind_i++) { /// lignes var champs:Object = new Object(); for (ind_j = 1; ind_j <= n_fields; ind_j++) { /// champs var nom_champs:String = e.currentTarget.data["field" + ind_j]; champs[nom_champs] = e.currentTarget.data[nom_champs + ind_i]; } ligne[ind_i] = champs; } dispatchEvent(new Event("fin_requete")); } } } /// Fin classe } /// Fin package

Conclusion :


J'ai juste voulu vous donner une piste, mais bien sur c'est un début. Par exemple une variable insert_id pourrait envoyer l'id provenant par une requête INSERT (déjà fat sur le data.php mais pas encore au niveau du as).

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

pegase31
Messages postés
6161
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
6 -
Bonjour, c'est intéressant comme façon de faire, mais niveau sécurité c'est 0 pointé ...

N'importe qui étant capable de décompiler le flash sera capable de détruire ta base avec un simple "DROP SCHEMA" depuis n'importe quelle adresse en injectant du POST dans l'url (c'est tout à fait faisable).

Donc intéressant techniquement, mais solution à fuir comme la peste.

Peg'
emanueledimauro
Messages postés
30
Date d'inscription
samedi 11 octobre 2008
Statut
Membre
Dernière intervention
13 avril 2011
-
Merci Pegase31 pour la réponse très pertinente...
Personnellement j'ai conçu ce genre de script à l'intérieur d'un répertoire protégé par htaccess, en gros pour faire de l'admin ou bien dans des projets de logiciel en ligne, où il y a que le client qui peut accéder au swf.

Sinon j'ai jamais décompilé un swf. Là il suffit pas de trouver la chaine de cryptage, mais il faut décompiler carrément la fonction query à l'intérieur de la classe. Il est vraiment si facile ?

Il y a de toute façon une solution simple pour résoudre les problèmes de sécurité que tu évoques, et c'est de gérer l'autorisation au requêtes au niveau du php (fichier data.php).

On interdit toute sorte de update, insert, drop ect... d'ailleurs cette classe est pensé pour faire juste du SELECT...

Quelqu'un à une idée pour mieux protéger le tout ?
pegase31
Messages postés
6161
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
6 -
Le htaccess ne protège rien, puisque le swf doit pouvoir accéder librement au php pour faire les transferts de données.

Même déjà à l'intérieur même d'un php brut il est difficile de faire une véritable protection, alors si tu extériorise la requête, c'est hyper simple de tout planter et de faire n'importe quoi.
Donc gérer du SQL directement dans flash, ce n'est pas possible, car pas sécurisé. Et c'est pour cela que ça n'a jamais été implémenté en ActionScript.

Et pour te répondre : décrypter la fonction query est inutile, puisque tu passes ta variable en clair lors de l'appel ...

Si tu veux gérer tes requêtes dans le php, ça revient au même que de faire tes demandes de variable via php .. et donc de faire la requête dans le php... et donc réinventer la roue.

Mais cette réflexion est intéressante pour prouver que flash est et doit rester une interface utilisateur. Rien de plus.

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

je comprends pas ta phrase "Le htaccess ne protège rien, puisque le swf doit pouvoir accéder librement au php pour faire les transferts de données."

Si le swf et le data.php se trouvent à l'intérieur d'un répertoire protégé
il n'y a pas moyen d'accéder au swf et de le décrypter.
Au contraire le swf et le php communiquent sans problèmes du moment
où on a mis user et pass et on est rentré via le navigateur à la racine du répertoire.

Tu dis aussi que :
"Et pour te répondre : décrypter la fonction query est inutile, puisque tu passes ta variable en clair lors de l'appel ..."

Lors de l'appel je passe pas la clef de cryptage.
Je passe juste la requête crypté et une variable aléatoire pour éviter le cache.

Sinon concernant la gestion coté php, je ne dis pas de faire le requêtes à partir du php, mais de mettre un contrôle sur la requête décrypté qui l'analyse pour savoir s'il s'agit juste d'un SELECT ou bien d'un UPDATE, INSERT ou autre....
pegase31
Messages postés
6161
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
6 -
Un swf se comporte comme une image, c'ets à dire qu'il n'est plus physiquement sur le serveur, mais chez le client .. donc si tu protèges ton dossier par htaccess, non seulement le flash ne pourra pas s'afficher sur la page (car pas dispo de l'extérieur), mais en plus le php ne sera pas dispo pour les transferts de données ... As-tu déjà essayé ?

Ensuite, je vois ça dans ton code : mysql.query_exec("select nom, prenom from matable");
Si ce n'est pas une requête en clair, je ne sais pas ce que c'est ...
Il suffit de changer le texte et ,crypté ou pas, je te flingue ta base sans soucis.

Comment comptes-tu palier à ce gros problème, alors ?

Peg'

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.