2016-08-01 25 views
-1

Ich habe 2 verschiedene Zeichenketten wieRegex passt falsche Ausdrücke

abs1.qwerty.com:1234 

und

abs11qwerty.com:1234 

Nach einer solchen Regex "(?=" + name + ").*?:(\\d+)" verwenden, wobei Name eine bestimmte Zeichenkette ist. Ich erhalte eine falsche Übereinstimmung, weil angenommen wird, dass sie identisch sind. Was kann eine Lösung für ein solches Problem sein?

+2

1) Formatieren Sie Ihren Code. 2) Geben Sie Beispieleingabe und erwartete Ausgabe an. 3) Stellen Sie die tatsächliche Ausgabe bereit. –

Antwort

2

Sie müssen Regex escape name - das ist klassisch Injektion Angriff.

Wenn name hat regex Zeichen in es der Motor sie sie als Teil des Musters interpretiert, zum Beispiel

name = ".*" 

wird wahrscheinlich alle Namen übereinstimmen, so dass ein Angreifer Daten aus dem System zu extrahieren.

Verwendung so etwas wie die folgenden:

final String pattern = String.format("(?=%s).*?:(\\d+)", Pattern.quote(name)) 

In Ihrem Beispiel, wenn das Muster abs1.qwerty.com ist die Regex-Engine interpretiert dies ist:

  • "ABS1" - wörtliche
  • "." - beliebiges Zeichen, einmal
  • "qwerty" - Literal
  • "." - jedes Zeichen, einmal
  • "com" - wörtlich

Also das Muster paßt glücklich "abs11qwerty.com".