GNT sans publicité, site mobile, fonctionnalitées exclusives...

Expression regulieres et requetes MySQL

Le
Eric
Bonjour,

Le site sur lequel je travaille permet aux utilisateurs de faire leurs
propres requêtes SQL SELECT, à la façon de MyAdmin. Oui, je sais,
c'est une faille de sécurité, et j'ai des doutes sur l'utilité de
cette page puisque le programme sera utilisé par des buses en
informatiques, mais bon, mon patron a dit que c'était une
fonctionnalité super extra géniale, et comme l'ordre hiérarchique
n'est pas en ma faveur, je n'ai qu'à répondre oui monsieur

Pour (tenter de) sécuriser cette partie, j'ai créé un utilisateur
dédié, avec que des droits SELECT, etc

Je souhaite également parser cette requete pour isoler les mots clefs
(WHERE, FROM, GROUP BY, AS), la mise en forme des résultats
n'étant pas la même sur des requetes statistiques (avec GROUP BY) que
sur des SELECT WHERE

J'ai cherché, et n'ai trouvé aucune expression régulière qui ne se
perde pas dans des guillemets, etc

Quelle expression régulière utiliseriez vous pour gérer "select nom
as ' group by ' from table t where truc = 'having' " ?

On pourrait très bien imaginer un '[a-zA-Z0-9(\\')]*' mais ça
nécéssiterait d'être EXHAUSTIF vis à vis des accents, etc

MySQL fait bien ça, mais comme je suis jamais rentré dans leur code
source, il me faudrait 3 jours rien que pour "m'approprier" leur façon
de programmer

Merci d'avance ;-)

Eric
Lire les 4 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Eric
Le #852700
"MySQL fait bien ça, mais comme je suis jamais rentré dans leur code
source, il me faudrait 3 jours rien que pour "m'approprier" leur façon
de programmer... "

Vous aurez bien évidemment tous lu PhpMyAdmin
Laurent
Le #852703
Eric wrote:

Je souhaite également parser cette requete pour isoler les mots clefs
(WHERE, FROM, GROUP BY, AS...), la mise en forme des résultats
n'étant pas la même sur des requetes statistiques (avec GROUP BY) que
sur des SELECT ... WHERE ...

J'ai cherché, et n'ai trouvé aucune expression régulière qui ne se
perde pas dans des guillemets, etc...



Je suis un peu dans la même situation, et j'ai commencé à faire un
"moteur de règles" ou l'utilisateur n'a pas vraiment le choix et où il
est guidé, et où il choisit avec des listbox ou des textbox

exemple (ce que je viens de dire est assez flou je l'admet :))
listbox : afficher/effacer
listbox : les garcons/les filles/tous
"qui ont"
listbox : plus, moins
"de"
textbox où on rentre un chiffre
"ans"

ca donne donc par exemple : afficher les garcons qui ont moins de 30 ans.

C'est une idée, hein...

Vincent Lascaux
Le #849375
Quelle expression régulière utiliseriez vous pour gérer "select nom
as ' group by ' from table t where truc = 'having' " ?


A mon avis c'est utopique de vouloir le faire en une étape, avec une seule
expression réguliere. Peut être qu'on peut, mais moi je m'y risquerais
pas...
Si je devais me lancer là dedans, je regarderais s'il existe pas un lex /
yacc pour PHP, et je chercherai la grammaire des requêtes SQL.

A mon avis tu devrais présenter à ton patron les problemes que ca souleve et
suggérer que si c'est fait nul par ailleurs, c'est que c'est pas gérable...
D'un point de vue sécurité, c'est impensable, pour l'utilisateur c'est pas
vraiment ergonomique.

Bref, je suis d'accord avec Laurent : se fixer des limites (quelle est la
complexité des requêtes qu'on veut permettre : est ce qu'on veut permettre
des jointures par exemple ? est ce qu'on veut laisser l'utilisateur
travailler sur plusieurs tables ? Qu'est ce qu'il va se passer si
l'utilisateur entre une requête qui prend 5 ans à être réalisée, en prenant
100% du CPU pendant tout le temps d'execution ?...), ensuite penser à un
systeme ergonomique qui permet de faire la plus grande partie des requetes
dans les limites qu'on s'est fixées et enfin implémenter ca. Ca sera
toujours des tonnes de travaille en moins que tenter de sécuriser un truc où
la feature c'est "je laisse l'utilisateur faire ce qu'il veut avec la
machine"...

--
Vincent

Eric
Le #852485

Je suis un peu dans la même situation, et j'ai commencé à faire un
"moteur de règles" ou l'utilisateur n'a pas vraiment le choix et où il
est guidé, et où il choisit avec des listbox ou des textbox


C'est effectivement la technique utilisée dans la version actuelle
(opérationelle mais pas sure en termes de fiabilité.)
L'utilisateur choisit les champs à afficher, leur ordre toussa. A la
fin, on lui présente une zone de texte où il peut affiner la requête
avec des fonctionnalités non prises en charge par le logiciel (comme
les fonctions statistiques/group by).
Cette page est au point (à un ou deux addslashes et htmlentities
près, rien de bien compliqué...), passons à la deuxième page, elle
reçoit en paramètre la requete, et l'exécute.
J'aimerais qu'elle [la page] vérifie un certain nombre de critère
dessus [la requete] : utilise-t-elle des fontions statistiques, des
group by ? sur quelle(s) table(s) d'exécute la requete ?

Bref, le problème n'est pas de générer la requete, mais de
l'exécuter en toute sécurité.

La première page est classique : JE fais les requetes, après
vérification des paramètres fournis par l'utilisateur.
Dans la deuxième page, je donne les rennes à l'utilisateur, et il ne
serait pas tout à fait de mon gout qu'il aille droit dans le mur
(intensionellment ou pas) avec !

Publicité
Suivre les réponses
Poster une réponse
Anonyme