Aller au contenu

hyperscan: Hyperscan pour nginx-module-lua

Installation

Si vous n'avez pas encore configuré l'abonnement au dépôt RPM, inscrivez-vous. Ensuite, vous pouvez procéder avec les étapes suivantes.

CentOS/RHEL 7 ou 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

Pour utiliser cette bibliothèque Lua avec NGINX, assurez-vous que nginx-module-lua est installé.

Ce document décrit lua-resty-hyperscan v0.3 publié le 14 avril 2022.


lua-resty-hyperscan - Hyperscan pour Openresty

!!! Ancienne branche a rencontré un problème de trop de callbacks, car luajit ne prend pas complètement en charge CALLBACK. Nous avons donc besoin d'un wrapper C pour gérer les callbacks.

Tout d'abord, vous devez installer openresty

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

## 

## 

## Synopsis

exemple de configuration

```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, "Échec :", err)
            return
        end

       -- nouveau
       local obj = whs.block_new("a-uniq-name", true) -- true : activer le mode débogage

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

        -- compiler
        ret, err = obj:compile(patterns)
        if not ret then
           ngx.log(ngx.ERR, "échec de la compilation du bloc hyperscan, ", 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")
                -- scanner
                local ret, id, from, to = obj:scan(ngx.var.uri)
                if ret then
                    return ngx.print("[", ngx.var.uri,"] correspond : ", id, " zone [", from, " - ", to, ").\n")
                else
                    return ngx.print("[", ngx.var.uri, "] ne correspond à aucune règle.\n")
                end
            }
        }
    }
}

cas de test :

$ curl http://localhost
[/] ne correspond à aucune règle.

$ curl http://localhost/131111111
[/131111111] correspond : 1001 zone [0 - 3).

$ curl "http://localhost/      end"
[/      end] correspond : 1002 zone [0 - 4).

$ curl http://localhost/aaaaaaa
[/aaaaaaa] correspond : 1003 zone [0 - 3).

Méthodes

manière de charger cette bibliothèque

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

block_new

Créer une instance hyperscan pour le mode bloc.

local handle, err = whs.block_new(name, debug)
if not handle then
    ngx.log(ngx.ERR, "raison : ", err)
end
Champ Nom Type Lua Description
Paramètre name string nom de l'instance, principalement pour le journal
debug boolean activer/désactiver l'écriture des journaux de débogage dans syslog
Valeur de retour handle table/nil référence de l'instance
err string raison de l'échec

block_free

Détruire une instance hyperscan pour le mode bloc.

whs.block_free(name)

block_get

Obtenir la référence de l'instance par nom.

local handle = whs.block_get(name)
Champ Nom Type Lua Description
Paramètre name string nom de l'instance
Valeur de retour handle table/nil référence de l'instance

vector_new

Créer une instance hyperscan pour le mode vecteur.

local handle, err = whs.vector_new(name, debug)
if not handle then
    ngx.log(ngx.ERR, "raison : ", err)
end
Champ Nom Type Lua Description
Paramètre name string nom de l'instance, principalement pour le journal
debug boolean activer/désactiver l'écriture des journaux de débogage dans syslog
Valeur de retour handle table/nil référence de l'instance
err string raison de l'échec

vector_free

Détruire une instance hyperscan pour le mode vecteur.

whs.vector_free(name)

vector_get

Obtenir la référence de l'instance par nom.

local handle = whs.vector_get(name)
Champ Nom Type Lua Description
Paramètre name string nom de l'instance
Valeur de retour handle table/nil référence de l'instance

handle:compile

compiler une expression régulière dans une base de données Hyperscan.

--local handle = whs.block_new(name, debug)
local ok, err = handle:compile(patterns)
if not ok then
    ngx.log(ngx.ERR, "raison : ", err)
end
Champ Nom Type Lua Description
paramètre patterns table liste des motifs
Valeur de retour ok boolean succès/échec
err string raison de l'échec

Liste des motifs

Exemple
local patterns = {
    {id = 1001, pattern = "\\d3",       flag = "iu"   },
    {id = 1002, pattern = "\\s{3,5}",   flag = "dmsu" },
    {id = 1003, pattern = "[a-d]{2,7}", flag = ""     }
}
Drapeaux
Drapeau Valeur Hyperscan Description
'i' HS_FLAG_CASELESS Définir une correspondance insensible à la casse
'd' HS_FLAG_DOTALL Une correspondance avec un . n'exclura pas les nouvelles lignes.
'm' HS_FLAG_MULTILINE Définir l'ancrage multi-lignes.
's' HS_FLAG_SINGLEMATCH Définir le mode de correspondance unique.
'e' HS_FLAG_ALLOWEMPTY Autoriser les expressions pouvant correspondre à des tampons vides.
'u' HS_FLAG_UTF8 Activer le mode UTF-8 pour cette expression.
'p' HS_FLAG_UCP Activer le support des propriétés Unicode pour cette expression.
'f' HS_FLAG_PREFILTER Activer le mode de préfiltrage pour cette expression.
'l' HS_FLAG_SOM_LEFTMOST Activer le rapport de début de correspondance le plus à gauche.
'c' HS_FLAG_COMBINATION Combinaison logique.
'q' HS_FLAG_QUIET Ne pas faire de rapport de correspondance.

handle:scan

La correspondance de motifs réelle a lieu pour les bases de données de motifs en mode bloc.

--local handle = whs.block_get(name)
local ok, id, from, to = handle:scan(data)
if ok then
    ngx.log(ngx.INFO, "correspondance réussie", id, from, to)
end

La correspondance de motifs réelle a lieu pour les bases de données de motifs en mode vecteur.

--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, "correspondance réussie", id, from, to)
end
Champ Nom Type Lua Description
Paramètre data string/string[] chaîne à scanner (string[] uniquement en mode vecteur)
Valeur de retour ok boolean true pour correspondance, false pour non correspondance
id number identifiant de correspondance
from number correspondance à partir de l'index du tableau d'octets (y compris lui-même)
to number fin de la correspondance à l'index du tableau d'octets (exclut lui-même)
dataindex number index de données correspondant (uniquement en mode vecteur)

handle:free

Détruire une instance hyperscan.

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

GitHub

Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-hyperscan.