Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Expression regulieres et requetes MySQL

4 réponses
Avatar
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

4 réponses

Avatar
Eric
"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
Avatar
Laurent
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...

Avatar
Eric

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 !

Avatar
Vincent Lascaux
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