Nous permettons à certains résultats fournis par l'utilisateur dans le but de filtrer le courrier électronique. Au début, nous avons rencontré des problèmes de performance avec qui contenus, par exemple, . * Code>, lors de la correspondance contre des courriels arbitrairement élevés. Nous avons trouvé une solution simple devait
S / \ * / {0,1024} / code> sur le re. Cependant, ce n'est pas une solution parfaite, car elle se brisera avec le motif suivant:
/[*]/
4 Réponses :
Vous voulez dire sauf de corriger la source? p>
Oui ... autre que de corriger la source :) (nous avons toujours besoin du comportement standard dans certains cas qui n'impliquent pas l'entrée de l'utilisateur)
Ajout d'un Une amélioration serait cette p> voir ici sur Regexr p> Cela signifie que cela signifie Match Voir Perlretut pour plus de détails P> voir semble fonctionner, mais sa réelle compliquée maintenant! EM> P> P> P> P> P> (? Avant les quantifiers, car il ne faut pas correspondre. Le remplacement échouera toujours s'il y a un
\\ * code> (correspondez
\ code> 0 ou plusieurs fois). P>
[* +] code> mais uniquement s'il n'y a pas de fermeture
] code> à l'avance et non
[ code> jusqu'à présent. Et il n'y a pas de
\ code> (le
(? partie) em> autorisé avant les crochets. P>
(?! ...) code> est un lookahead négatif p>
(? est un lookeded négatif P>
Oui, c'est une amélioration ... il laisse toujours le cas du quantificateur "possessif" + (c.-à-d. * + code>,
++ code>,
? + code> et
{..} + code>). Je suppose que je peux former une recette similaire pour ignorer le + caractère dans ces cas aussi.
Bon point avec les quantificateurs possessifs, a ajouté une solution pour cela.
Merci ... j'identifie complètement avec votre dernier commentaire ... C'est vraiment compliqué! I> Je souhaite qu'il n'y ait qu'un perlvar de $ max_regexp_string_length ou quelque chose! :)
@ikegami j'ai déclaré que la restriction au sommet de mon post.
Cela ne répond pas vraiment à votre question, mais vous devez être au courant d'autres problèmes avec des expressions régulières fournies par l'utilisateur, voir par exemple ce Résumé chez Owasp . En fonction de votre situation exacte, il peut être préférable d'écrire ou de trouver une bibliothèque de correspondance de modèle simple personnalisée? P>
+1, parce que ^ (a | aa) {} $ 0,30 code> est suffisant pour maintenir le moteur regex occupé pour des millions de cycles avec une chaîne comme
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaX code>
Merci; un bon avertissement. Bien qu'il soit certainement possible qu'un utilisateur puisse en vigueur à DOS eux-mêmes, ils ne pouvaient vraiment que le faire à eux-mêmes. Ainsi, notre objectif principal est de les empêcher de le faire accidentellement.
Cela me donne l'idée d'envelopper tous mes résultats fournis par l'utilisateur dans un eval {alarme 1; ...}; code> bloc, bien que ...
Obtenez un arbre en utilisant Regexp :: anal erser et modifier regex comme vous le souhaitez ou fournissez une interface interface graphique à Regexp :: Anglais P>
Dans quelle partie d'un email effectue ces filtres? Les en-têtes, le corps?
@Fge: Le corps est l'endroit où cela importe, car c'est la partie qui peut être arbitrairement grande. Nous vérifions également les en-têtes, mais un seul en-tête à la fois. Et même les plus longs en-têtes de courrier électronique ne sont pas assez longs pour causer des problèmes de performance avec * et +.
OK, puis une autre question: exécutez-vous ces regex sur l'ensemble du contenu, des pièces jointes incluses ou de sauter des pièces jointes?
@Fge: Nous l'exécutons sur toutes les pièces MIME avec un type de contenu Text-ISH (texte / plaine, texte / html, vcards et une petite poignée des autres)
Interdire
* code> et
+ code> et instruez les utilisateurs à utiliser
{n, m} code> à la place? Celui-ci a une limite supérieure de 32766.