Zum Inhalt

hyperscan: Hyperscan für nginx-module-lua

Installation

Wenn Sie noch kein RPM-Repository-Abonnement eingerichtet haben, melden Sie sich an. Dann können Sie mit den folgenden Schritten fortfahren.

CentOS/RHEL 7 oder Amazon Linux 2

yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-hyperscan

CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-hyperscan

Um diese Lua-Bibliothek mit NGINX zu verwenden, stellen Sie sicher, dass nginx-module-lua installiert ist.

Dieses Dokument beschreibt lua-resty-hyperscan v0.3, das am 14. April 2022 veröffentlicht wurde.


lua-resty-hyperscan - Hyperscan für Openresty

!!! Alter Branch hatte ein zu viele Rückrufe Problem, da luajit nicht vollständig CALLBACK unterstützt. Daher benötigen wir einen C-Wrapper, um Rückrufe zu behandeln.

Zuerst sollten Sie OpenResty installieren

git clone git@github.com:LubinLew/lua-resty-hyperscan.git cd lua-resty-hyperscan make make install make test

## 

## 

## Zusammenfassung

Konfigurationsbeispiel

```lua
user  nobody;
worker_processes  auto;
error_log logs/error.log error;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    access_log  logs/access.log;

    init_by_lua_block {
       local whs, err = require('hyperscan')
        if not whs then
            ngx.log(ngx.ERR, "Fehler:", err)
            return
        end

       -- neu
       local obj = whs.block_new("a-uniq-name", true) -- true : Debug-Modus aktivieren

       local patterns = {
           {id = 1001, pattern = "\\d3",       flag = "iu"},
           {id = 1002, pattern = "\\s{3,5}",   flag = "u"},
           {id = 1003, pattern = "[a-d]{2,7}", flag = ""}
       }

        -- kompilieren
        ret, err = obj:compile(patterns)
        if not ret then
           ngx.log(ngx.ERR, "Hyperscan-Blockkompilierung fehlgeschlagen, ", err)
           return
        end
    }

    server {
        listen       80;
        server_name  localhost;

        location / {
            content_by_lua_block {
                local whs = require('hyperscan')
                local obj = whs.block_get("a-uniq-name")
                -- scannen
                local ret, id, from, to = obj:scan(ngx.var.uri)
                if ret then
                    return ngx.print("[", ngx.var.uri,"] Übereinstimmung: ", id, " Bereich [", from, " - ", to, ").\n")
                else
                    return ngx.print("[", ngx.var.uri, "] keine Regel übereinstimmt.\n")
                end
            }
        }
    }
}

Testfälle:

$ curl http://localhost
[/] keine Regel übereinstimmt.

$ curl http://localhost/131111111
[/131111111] Übereinstimmung: 1001 Bereich [0 - 3).

$ curl "http://localhost/      end"
[/      end] Übereinstimmung: 1002 Bereich [0 - 4).

$ curl http://localhost/aaaaaaa
[/aaaaaaa] Übereinstimmung: 1003 Bereich [0 - 3).

Methoden

Möglichkeit, diese Bibliothek zu laden

local whs,err = require('hyperscan')
if not whs then
    ngx.log(ngx.ERR, "Grund: ", err)
end

block_new

Erstellen Sie eine Hyperscan-Instanz für den Blockmodus.

local handle, err = whs.block_new(name, debug)
if not handle then
    ngx.log(ngx.ERR, "Grund: ", err)
end
Feld Name Lua-Typ Beschreibung
Parameter name string Instanzname, hauptsächlich für Protokoll
debug boolean Aktivieren/Deaktivieren des Schreibens von Debug-Protokollen in Syslog
Rückgabewert handle table/nil Instanzreferenz
err string Grund für das Scheitern

block_free

Zerstören Sie eine Hyperscan-Instanz für den Blockmodus.

whs.block_free(name)

block_get

Holen Sie sich die Instanzreferenz nach Name.

local handle = whs.block_get(name)
Feld Name Lua-Typ Beschreibung
Parameter name string Instanzname
Rückgabewert handle table/nil Instanzreferenz

vector_new

Erstellen Sie eine Hyperscan-Instanz für den Vektormodus.

local handle, err = whs.vector_new(name, debug)
if not handle then
    ngx.log(ngx.ERR, "Grund: ", err)
end
Feld Name Lua-Typ Beschreibung
Parameter name string Instanzname, hauptsächlich für Protokoll
debug boolean Aktivieren/Deaktivieren des Schreibens von Debug-Protokollen in Syslog
Rückgabewert handle table/nil Instanzreferenz
err string Grund für das Scheitern

vector_free

Zerstören Sie eine Hyperscan-Instanz für den Vektormodus.

whs.vector_free(name)

vector_get

Holen Sie sich die Instanzreferenz nach Name.

local handle = whs.vector_get(name)
Feld Name Lua-Typ Beschreibung
Parameter name string Instanzname
Rückgabewert handle table/nil Instanzreferenz

handle:compile

Kompilieren Sie reguläre Ausdrücke in eine Hyperscan-Datenbank.

--local handle = whs.block_new(name, debug)
local ok, err = handle:compile(patterns)
if not ok then
    ngx.log(ngx.ERR, "Grund: ", err)
end
Feld Name Lua-Typ Beschreibung
Parameter patterns table Musterliste
Rückgabewert ok boolean Erfolg/Misserfolg
err string Grund für das Scheitern

Musterliste

Beispiel
local patterns = {
    {id = 1001, pattern = "\\d3",       flag = "iu"   },
    {id = 1002, pattern = "\\s{3,5}",   flag = "dmsu" },
    {id = 1003, pattern = "[a-d]{2,7}", flag = ""     }
}
Flags
Flag Hyperscan-Wert Beschreibung
'i' HS_FLAG_CASELESS Setzt die Groß-/Kleinschreibung ignorierende Übereinstimmung
'd' HS_FLAG_DOTALL Bei der Übereinstimmung mit . werden keine Zeilenumbrüche ausgeschlossen.
'm' HS_FLAG_MULTILINE Setzt mehrzeilige Verankerung.
's' HS_FLAG_SINGLEMATCH Setzt den Modus nur für Einzelübereinstimmungen.
'e' HS_FLAG_ALLOWEMPTY Erlaubt Ausdrücke, die gegen leere Puffer übereinstimmen können.
'u' HS_FLAG_UTF8 Aktiviert den UTF-8-Modus für diesen Ausdruck.
'p' HS_FLAG_UCP Aktiviert die Unterstützung für Unicode-Eigenschaften für diesen Ausdruck.
'f' HS_FLAG_PREFILTER Aktiviert den Vorfiltermodus für diesen Ausdruck.
'l' HS_FLAG_SOM_LEFTMOST Aktiviert die Meldung des linksseitigsten Beginns der Übereinstimmung.
'c' HS_FLAG_COMBINATION Logische Kombination.
'q' HS_FLAG_QUIET Keine Übereinstimmungsberichterstattung durchführen.

handle:scan

Die tatsächliche Musterübereinstimmung erfolgt für Blockmodus-Muster-Datenbanken.

--local handle = whs.block_get(name)
local ok, id, from, to = handle:scan(data)
if ok then
    ngx.log(ngx.INFO, "Übereinstimmung erfolgreich", id, from, to)
end

Die tatsächliche Musterübereinstimmung erfolgt für Vektormodus-Muster-Datenbanken.

--local handle = whs.vector_get(name)
--local data = {"s","s2"}
--local data = "s"
local ok, id, dataindex, to = handle:scan(data)
if ok then
    ngx.log(ngx.INFO, "Übereinstimmung erfolgreich", id, from, to)
end
Feld Name Lua-Typ Beschreibung
Parameter data string/string[] Zeichenfolge, die gescannt werden soll (nur string[] im Vektormodus)
Rückgabewert ok boolean true für Übereinstimmung, false für keine Übereinstimmung
id number Übereinstimmungs-ID
from number Übereinstimmungsbeginn-Byte-Array-Index (einschließlich selbst)
to number Übereinstimmungsende-Byte-Array-Index (ausschließlich selbst)
dataindex number Übereinstimmungsdatenindex (nur Vektormodus)

handle:free

Zerstören Sie eine Hyperscan-Instanz.

--local handle = whs.block_get(name)
handle:free()

GitHub

Sie finden möglicherweise zusätzliche Konfigurationstipps und Dokumentationen für dieses Modul im GitHub-Repository für nginx-module-hyperscan.