Déni de Service Préoccupations
La préoccupation la plus courante avec les regexes est un déni de service (ddos) à travers les modes pathologiques qui vont exponentielle - ou même des super‐exponentielle! - et donc, semble prendre une éternité à résoudre. Ceux-là ne peuvent apparaître sur certaines données d'entrée, mais en général, on peut en créer un dans lequel cela n'a pas d'importance.
Ceux qui ce sont pourra varier en fonction de la façon intelligente de la regex compilateur que vous utilisez, parce que certains de ceux-ci peuvent être détectées lors de la compilation. Regex compilateurs qui mettent en œuvre la récursivité ont généralement un haut‐récursivité‐profondeur de comptoir pour la vérification de la non progression de la maladie.
Russ Cox excellent 2007 document sur l' Expression Régulière Correspondant Peut Être Simple Et Rapide
(mais il est lent dans Java, Perl, PHP, Python, Ruby, ...) parle des façons les plus modernes de Fan, qui tous semblent dériver de Henry Spencer code, souffrent d'une dégradation des performances, mais dans le cas où Thompson‐style NFA a pas de tels problèmes.
Si vous n'admet que des modèles qui peuvent être résolus par DFAs, vous pouvez les compiler comme telle, et ils vont courir plus vite, peut-être beaucoup plus rapide. Cependant, il faut du temps pour ce faire. La Cox document mentionne cette approche et de son cortège de problèmes. Il s'agit d'un classique de l'espace–temps.
Avec un DFA, vous passez plus de temps à le construire (et de l'allocation de plus en plus d'états), alors qu'avec un NFA vous passez plus de temps à l'exécution, car il peut être de plusieurs états en même temps, et de mandature pouvez manger votre déjeuner et votre PROCESSEUR.
Le déni‐de‐Service Solutions
Probablement la façon la plus raisonnable pour répondre à ces modèles qui sont en train de perdre à la fin d'une course avec la chaleur de la mort de l'univers est de les envelopper avec une minuterie qui place effectivement une durée maximale autorisée pour leur exécution. Habituellement, ce sera beaucoup, beaucoup moins que le délai d'expiration par défaut que la plupart des serveurs HTTP fournir.
Il existe différentes façons de mettre en œuvre ces, allant d'un simple alarm(N)
au niveau C, à une sorte d' try {}
bloquer les captures d'alarme de type exceptions près, tout le chemin à la fraie un nouveau thread est créé spécialement avec une contrainte de temps construit à droite dans.
Code Des Légendes
En regex langues qui admettent code des légendes, un mécanisme de l'autorisation ou non de la chaîne que vous allez compiler doit être fourni. Même si le code des légendes que sont le code dans la langue que vous utilisez, vous devez les limiter; ils n'ont pas à être en mesure d'appeler du code externe, même s'ils peuvent, vous avez beaucoup plus de problèmes.
Par exemple, en Perl, on ne peut pas avoir de code de légendes dans les regexes créé à partir de la chaîne d'interpolation (car celles-ci seraient, comme ils sont compilés au cours de l'exécution), à moins que le spécial lexicalement étendue de pragma use re "eval";
dans active dans le champ d'application actuel.
De cette façon, personne ne peut se faufiler dans un code de légende pour exécuter des programmes comme rm -rf *
, par exemple. Parce que le code de légendes sont si sensibles à la sécurité, Perl désactive par défaut sur tous les interpolées chaînes, et vous devez sortir de votre façon de les ré‐activer.
Défini par l'utilisateur \P{roperties}
Il reste un plus de sécurité sensible à la question relative à l'Unicode des propriétés de style comme \pM
, \p{Pd}
, \p{Pattern_Syntax}
ou \p{Script=Greek}
- qui peut exister dans certains regex compilateurs qui prennent en charge que la notation.
Le problème est que dans certains de ces cas, les propriétés de l'utilisateur extensible. Cela signifie que vous pouvez avoir des propriétés personnalisées qui sont de véritables code des légendes à des fonctions nommées dans certains namepace, comme \p{GoodChars}
ou \p{Class::Good_Characters}
. Comment votre langue poignées de ceux qui peut-être intéressant de regarder.
Le bac à sable
En Perl, un bac à sable compartiment via l' Safe
module de donner le contrôle de l'espace de noms de la visibilité. D'autres langues offrent le même type de bac à sable technologies. Si de tels dispositifs sont disponibles, vous voudrez peut-être regarder en eux, parce qu'ils sont spécifiquement conçus pour limité l'exécution de code non fiable.