[c#] Escaping / Addslashes tegen injection bij RegEx

Pagina: 1
Acties:
  • 160 views sinds 30-01-2008
  • Reageer

  • reyan
  • Registratie: November 2003
  • Laatst online: 17-12-2021
Weer eens een kort vraagje van mij dat Google niet afdoende kon beantwoorden. Ik krijg een string binnen waarin een double met eenheid steekt, bv "-15,48 m/s" of "78m^2". Nu moet ik gaan herkennen of het getal wel een correcte double is en of de eenheid klopt. Hiervoor wil ik een reguliere expressie gebruiken.

Voor de double heb ik als herkenningsstring:
code:
1
@"^-?([0-9]){1,3}?(" + nfi.NumberGroupSeparator + "?[0-9][0-9][0-9])*(" + nfi.NumberDecimalSeparator + "[0-9]+)?$"
Waarbij NumberGroupSeparator en NumberDecimalSeparator uit System.Globalization.NumberFormatInfo gehaald worden. Dat werkt perfect. Invoer als "-15", "1.457,17", "-1000,0",... wordt allemaal correct herkend.

Ik zit echter wat in de rats met de eenheid... Het is de bedoeling dat de gebruiker deze kan opgeven. Gebruikersgegevens in een RegEx doen meteen aan injectiemisbruik denken... Vanzodra de door de gebruiker opgegeven eenheid een speciaal teken voor reguliere expressies bevat, gaat het mis. Ik denk maar aan een gedrocht als "bleh.\n["... Dat geeft zeker problemen.

Daarom vroeg ik me af of er een soort escape / addslashes mechanisme in c# zit om speciale tekens voor reguliere expressies te escapen. Het eerder gegeven voorbeeld "bleh.\n[" wordt dan "bleh\.\\n\\[". Bestaat zoiets of ben ik gewoon hardop aan het dromen?

En als het niet bestaat en ik met een string replace aan het werk moet, zijn de volgende tekens alle speciale symbolen waar ik op moet letten?
code:
1
\ [ ] . ? + * { } ^ $ ( )
Of zijn er meer? Bepaalde tekens hoef ik geen rekening mee te houden. Bv - welke binnen [ ] wel een speciale betekenis heeft, maar omdat ik [ ] sowieso al escape heeft - geen verdere betekenis.

[ Voor 10% gewijzigd door reyan op 07-06-2006 10:13 ]


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 18:01

mulder

ik spuug op het trottoir

Dit moet de database in? Zo ja gebruik gewoon parametized queries dan hoef je niks te escapen.

oogjes open, snaveltjes dicht


  • reyan
  • Registratie: November 2003
  • Laatst online: 17-12-2021
Dit heeft niets met databases te maken. Dit gaat gewoon om het herkennen van waarden en eenheden in binnenkomende strings door middel van reguliere expressies.

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 13-01 07:19
De string waar je een regex op uitvoert kan zelf geen expressies bevatten, dus je hoeft niets te escapen.

  • reyan
  • Registratie: November 2003
  • Laatst online: 17-12-2021
Jullie begrijpen het verkeerd denk ik... Het is net het pattern waar de gebruiker een deel van mag invullen (de eenheid).

Het double gedeelte is vast, daar heeft de gebruiker geen invloed op. Dat stuk werkt goed. Maar heel wat waardes komen binnen inclusief eenheid. De gebruiker kan hierbij opgeven op welke eenheden gefilterd dient te worden (met .Match haal ik de juiste onderdelen wel uit elkaar). Zomaar de eenheid erafknippen met een stringfunctie is niet juist. Er moet ook gecontroleerd worden of ze juist is. Dat kun je natuurlijk met een compare op de afgeknipte eenheid en de door de gebruiker opgegeven eenheid, maar aangezien ik toch al een Regex gebruik kan ik het beter in één stap doen. Maar dit heeft dus als gevolg dat er gebruikersdata in het regex pattern terecht moet komen. Daar zit nu net het hele gevaar, en daarom zoek ik een escapemanier hiervoor. Ik vroeg me nu gewoon af of c# daar een functie voor heeft, of dat ik er zelf een functie voor moet schrijven...

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Kijk hier eens naar welke tekens je (zou) moet(en kunnen) escapen dan.
...of wellicht beter: hier...

[ Voor 25% gewijzigd door RobIII op 07-06-2006 12:13 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • avoid
  • Registratie: November 2002
  • Laatst online: 18:45

Time flies like an arrow, fruit flies like a banana.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
.

[ Voor 99% gewijzigd door RobIII op 07-06-2006 12:13 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • reyan
  • Registratie: November 2003
  • Laatst online: 17-12-2021
Aan jullie reacties te zien bestaat zulk een functie blijkbaar niet... Geeft niet, ik heb dan maar een functie ervoor geschreven. Bedankt voor de links naar de pagina's met een overzicht naar de speciale tekens bij reguliere expressies.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        private string MakeSafeForRegex(string text)
        {
            // Escape:  \ . + * ? [ ^ ] $ ( ) { } = ! < > | :
            text = text.Replace("\\", "\\\\");
            text = text.Replace(".", "\\.");
            text = text.Replace("+", "\\+");
            text = text.Replace("*", "\\*");
            text = text.Replace("?", "\\?");
            text = text.Replace("[", "\\\[");
            text = text.Replace("]", "\\]");
            text = text.Replace("$", "\\$");
            text = text.Replace("(", "\\(");
            text = text.Replace(")", "\\)");
            text = text.Replace("{", "\\{");
            text = text.Replace("}", "\\}");
            text = text.Replace("=", "\\=");
            text = text.Replace("!", "\\!");
            text = text.Replace("<", "\\<");
            text = text.Replace(">", "\\>");
            text = text.Replace("|", "\\|");
            text = text.Replace(":", "\\:");
            return text;
        }
Dat schijnt op het eerste zicht wel correct te werken :)

  • whoami
  • Registratie: December 2000
  • Nu online
Doet Regex.Escape( string str ) niet wat jij wil ?
(Zie MSDN)

https://fgheysels.github.io/


  • reyan
  • Registratie: November 2003
  • Laatst online: 17-12-2021
whoami schreef op woensdag 07 juni 2006 @ 13:04:
Doet <code>Regex.Escape( string str )</code> niet wat jij wil ?
(Zie MSDN)
Ja, dat doet exact wat ik wil :)

Ik snap niet waarom ik dat niet kon vinden in MSDN... Ik heb gezocht op "escape regular expression" en dan kom je nergens. Maar nu ik nogmaals probeer met "escape regex" is de eerste hit meteen de goeie. Just my luck...
Pagina: 1