You are not logged in.

  • Login
Bitte besucht unser neues Forum unter https://forum.nitrado.net | Please visit our new Forum at https://forum.nitrado.net

Dear visitor, welcome to Nitrado.net Prepaid Gameserver Community-Support - Archiv. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

BtoBastian

Moderator

  • "BtoBastian" is male
  • "BtoBastian" started this thread

Posts: 3,612

Occupation: Softwareentwickler

  • Send private message

1

Friday, November 4th 2016, 6:04pm

Regex Catastrophic Backtracking verhindern

​Hallo,

ich will für meine Webseite (bStats​) Usern ermöglichen eigene Regex-Filter zu erstellen (die Gründe sind für die Frage erst mal nicht wichtig).
Das Problem ist, dass ich keinen Weg kenne wie ich verhindern kann, dass User mit "bösen" Pattern die Webseite (oder Clients anderer User) zum crashen bringen.
Daher suche ich einen Weg, wie ich mit Javascript (sowohl NodeJS aufm Server und ganz normal im Browser) prüfen kann, ob ein Regex-Pattern zu einem solchen Problem führen würde.
Die einzige Möglichkeit die mir aktuell einfällt ist, dass ich die Schritte zähle und ab einer bestimmten Anzahl abbreche. Nur weiß ich nicht, wie ich das mit Javascript hinkriege (Eine Google-Suche nach "Javascript Regex count steps" hat nicht geholfen).
Möglich ist es aber definitiv, https://regex101.com/ zeigt z.B. die Schritte an und erkennt auch Eingaben, die zu einer hohen Laufzeit führen.
Weiß jemand, wie das funktioniert?

(Siehe https://www.owasp.org/index.php/Regular_…Service_-_ReDoS )
Standard Standart eines Flamingos ist einbeinig.

This post has been edited 1 times, last edit by "BtoBastian" (Nov 4th 2016, 6:33pm)


BlackSarius

User / Kunde

  • "BlackSarius" is male

Posts: 745

Location: Baden-Württemberg

Occupation: Abiturient

  • Send private message

2

Saturday, November 5th 2016, 2:52pm

Ich habe 0 Ahnung von JavaScript und allgemein deinem Problem:P
Habe aber trotzdem mal geschaut^^
EDIT: Das hier nicht wirklich beachten, hilft dir nicht beim Code:

Spoiler Spoiler

Habe aber trotzdem das gefunden:
(Die Überschrift von einem Unterpunkt sah richtig aus^^, runterscrollen):
http://www.regular-expressions.info/catastrophic.html


Oder https://www.google.de/webhp?sourceid=chr…ic+backtracking
da waren die ersten threads auf stackoverflow interessant(weis nicht ob dir das was bringt^^)

ATFBlueshift

User / Kunde

  • "ATFBlueshift" is male

Posts: 641

Location: Localhost

Occupation: Nix

  • Send private message

3

Saturday, November 5th 2016, 4:50pm

@BlackSarius
Richtiger Ansatz.

Sowas nennt sich atomare Gruppen (engl. atomic groups).
Im Prinzip wird sofort abgebrochen, anstatt alle weiteren Möglichkeiten zu prüfen, wenn ein Match vorhanden ist.

BtoBastian

Moderator

  • "BtoBastian" is male
  • "BtoBastian" started this thread

Posts: 3,612

Occupation: Softwareentwickler

  • Send private message

4

Saturday, November 5th 2016, 4:54pm

Hey,

danke für die Antwort aber wirklich weiterhelfen tut es mir nicht.
Mir geht es ja nicht darum einen bekannten Regex-String von mir zu verbessern, sondern Regex als UserInput zu erlauben und zu validieren.
Darum geht es aber leider in 99% als StackOverfolw Fragen.
Standard Standart eines Flamingos ist einbeinig.

BtoBastian

Moderator

  • "BtoBastian" is male
  • "BtoBastian" started this thread

Posts: 3,612

Occupation: Softwareentwickler

  • Send private message

5

Sunday, November 6th 2016, 1:27pm

Hey,

in einem anderen Forum wurde ich auf das vm-Modul verwiesen, welches es ermöglicht einen Timeout zu setzen.
Damit hat es dann geklappt. Falls es jemand interessiert, hier meine Lösung:

Java source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
const vm = require('vm');

console.time("t");
var result = checkRegex('(a+)+', 'aaaaaaaaaaaaaaaaaaa!', 5);
console.timeEnd("t");
console.log(result);

function checkRegex(pattern, toCheck, timeout) {
    const regex = new RegExp('^' + pattern + '$');

    global.toCheck = toCheck;
    global.regex = regex;
    global.matches = false;

    const script = new vm.Script('matches = regex.test(toCheck);');

    try {
        script.runInThisContext({ timeout: timeout });
    } catch (err) {
        return {
            timedOut: true,
            matches: false
        }
    }

    return {
        timedOut: false,
        matches: global.matches
    }
}

// Ausgabe:
// t: 5.647ms
// { timedOut: true, matches: false }
Standard Standart eines Flamingos ist einbeinig.

Bitte besucht unser neues Forum unter https://forum.nitrado.net| Please visit our new Forum at https://forum.nitrado.net