Todos los productos
Search
Centro de documentos

Web Application Firewall:Extensiones

Última actualización: Sep 24, 2026

Escriba scripts de Lua personalizados para interceptar y modificar el procesamiento de las solicitudes web. Esto le permite implementar lógica de seguridad que va más allá de las reglas integradas de WAF. Gracias a los scripts y parámetros configurables, usted puede atender requisitos empresariales complejos con mayor flexibilidad.

Habilitar la función Extensions

Para usar Extensions, complete los siguientes pasos de activación:

Nota

Ediciones aplicables: Solo las ediciones Enterprise Edition, Ultimate Edition y Pay-As-You-Go Edition de WAF con modelo de suscripción son compatibles con esta función.

Facturación: Este es un servicio de pago. El método de facturación es el siguiente:

  • Pay-As-You-Go Edition: Puede usarlo directamente sin una compra previa. Se aplican cargos adicionales según el uso real.

  • Edición de suscripción: Debe comprar la función antes de usarla.

  1. Inicie sesión en la consola de Web Application Firewall 3.0. En la barra de menú superior, seleccione el resource group y la región (Chinese Mainland o Outside Chinese Mainland) de la instancia de WAF.

  2. En el panel de navegación izquierdo, elija Protection Config > Global Configuration > Extensions.

  3. Haga clic en Buy Now y siga las instrucciones en pantalla para habilitar la función.

Crear una extensión

En la página Extensions, haga clic en Create Extension y configure los siguientes parámetros.

  • Basic Info: Introduzca un Plugin Name y una Plugin Description fáciles de identificar.

  • Plugin Code: Escriba aquí el script de Lua para implementar su lógica de seguridad personalizada. Por ejemplo, consulte Appendix: Custom Lua script API reference para obtener más información sobre la API.

    Nota

    Alibaba Cloud publicó WAF Lua Extension Development Skill. Esta Skill utiliza un asistente de programación con IA para generar y depurar rápidamente scripts de extensión de Lua, lo que reduce la barrera de entrada para los desarrolladores. La Skill está disponible en los siguientes enlaces:

    -- Custom Lua script example: Extract a query parameter and compare it with a custom parameter. Block if they do not match.
    
    -- Step 1: Extract the request parameter
    local token = aliwaf.req.get_arg('token')
    
    -- Step 2: Compare with the custom parameter
    if token ~= params.token then
        aliwaf.func.punish()
    end 
    Importante
    • Para garantizar la estabilidad del sistema WAF, el tiempo de ejecución de un solo script de Lua por solicitud se limita a 2 ms. Durante la fase de Debug and Test, si el tiempo de ejecución supera este límite, el script no pasa la prueba y la creación falla. Durante la ejecución real, si el tiempo de ejecución de un script supera los 2 ms para una solicitud, el sistema omite dicha ejecución.

    • No codifique de forma rígida información confidencial (como claves) en su código. En su lugar, utilice la función Parameter Definition que se describe a continuación.

  • Parameter Definition: Extraiga los valores codificados de forma rígida de los scripts hacia parámetros configurables para separar la lógica de los datos. Esto le permite ajustar políticas de forma dinámica sin modificar el código y gestionar las claves de manera segura. Haga clic en Add Parameter y complete la siguiente configuración:

    • Parameter Name: El nombre de la variable al que se hace referencia en el script (por ejemplo, secret_key).

    • Parameter Type: Los tipos compatibles incluyen String, Number, Boolean, JSON Object y JSON Array. Asegúrese de que el tipo coincida con la lógica de manejo en su script.

    • Parameter Description: Describe el propósito del parámetro.

    • Parameter Value: Admite los dos modos siguientes:

      • Manual Input: Introduzca el valor directamente.

      • Use KMS Credential: Haga referencia a una credencial ya creada en Key Management Service para almacenar datos confidenciales de forma segura. Para que WAF pueda hacer referencia correctamente a la credencial, debe adjuntarle la siguiente etiqueta:

        • Tag Key: waf:access:enable

        • Tag Value: true

  • Debug and Test:

    • Plugin Action Parameters: Actualmente solo admite el modo Block, que bloquea la solicitud.

    • Traffic Parameters: Simula tráfico real de solicitudes HTTP. Haga clic en Add Parameter e introduzca un Parameter Name (como method, uri o args) y su Parameter Value correspondiente.

      Por ejemplo, establezca method en POST y uri en /login para probar la lógica de protección de un endpoint de inicio de sesión.

  • Execution Result: Haga clic en Run and Debug. El sistema ejecuta el script con el tráfico simulado y usted puede consultar el panel Execution Result a la derecha. Si el resultado indica un error, corrija el código basándose en los mensajes de error específicos.

Pasos siguientes

Después de crear una extensión, debe hacer referencia a ella en una plantilla de protección de Custom Rule. Para obtener más información, consulte Custom rules.

Operaciones diarias

En la página Extensions, puede realizar las siguientes operaciones:

  • Consultar la lista de plugins: Muestra todas las extensiones. Use el cuadro de búsqueda para introducir el nombre de un plugin y encontrarlo rápidamente.

  • Consultar las reglas de protección asociadas: Localice el plugin de destino y haga clic en el icono image de la columna Associated Rules para mostrar los ID de las reglas de protección asociadas. Puede copiar un ID y buscarlo en la página Core Web Protection o Security Reports.

  • Editar una extensión: Localice el plugin de destino y haga clic en Edit en la columna Actions para modificar su configuración.

  • Eliminar una extensión: Localice el plugin de destino y haga clic en Delete en la columna Actions para quitar la extensión.

Apéndice: Referencia de la API de scripts de Lua personalizados

Interfaces principales para scripts de Lua personalizados. Estas abarcan la lectura de datos de solicitudes, el cifrado y descifrado, y el control de flujo de las solicitudes.

Ejemplo de solicitud HTTP

POST /api/v1/orders?source=web&campaign=spring2024 HTTP/1.1
Host: shop.example.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)
Cookie: session_id=abc123xyz; user_prefs=lang%3Den%26theme%3Ddark
Content-Type: application/json
Content-Length: 68
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxxx
Accept: application/json

eyJwcm9kdWN0X2lkIjogNzg5LCAicXVhbnRpdHkiOiAyLCAidXJnZW50IjogdHJ1ZX0=

Leer datos de la solicitud

Todas las interfaces devuelven una cadena. Si un campo no existe, se devuelve una cadena vacía.

Leer el método

Elemento

Tipo

Descripción

Parámetro

-

-

Valor devuelto

string

El método de la solicitud HTTP, como "GET" o "POST".

-- POST --
local method = aliwaf.req.get_method()

Leer el URI

Elemento

Tipo

Descripción

Parámetro

-

-

Valor devuelto

string

La ruta URI de la solicitud.

-- /api/v1/orders --
local uri = aliwaf.req.get_uri()

Leer el dominio

Elemento

Tipo

Descripción

Parámetro

-

-

Valor devuelto

string

El nombre de dominio Host de la solicitud.

-- shop.example.com --
local domain = aliwaf.req.get_domain()

Leer la consulta

Elemento

Tipo

Descripción

Parámetro

-

-

Valor devuelto

string

La cadena de consulta completa de la solicitud.

-- source=web&campaign=spring2024 --
local query = aliwaf.req.get_query()

Leer un parámetro de consulta

Elemento

Tipo

Descripción

Parámetro

string

El nombre del parámetro de consulta.

Valor devuelto

string

El valor del parámetro correspondiente. Devuelve una cadena vacía "" si el parámetro no existe.

-- web --
local source = aliwaf.req.get_arg('source')

Leer una cookie

Elemento

Tipo

Descripción

Parámetro

string

El nombre de la cookie.

Valor devuelto

string

El valor de la cookie correspondiente. Devuelve una cadena vacía "" si la cookie no existe.

-- abc123xyz --
local session_id = aliwaf.req.get_cookie('session_id')

Leer un encabezado

Elemento

Tipo

Descripción

Parámetro

string

El nombre del encabezado de la solicitud HTTP.

Valor devuelto

string

El valor del encabezado correspondiente. Devuelve una cadena vacía "" si el encabezado no existe.

-- Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxxx --
local auth = aliwaf.req.get_header('Authorization')

Leer el cuerpo

Comprobar el estado del cuerpo de la solicitud

  • Si el cuerpo se recibió por completo

    Elemento

    Tipo

    Descripción

    Parámetro

    -

    -

    Valor devuelto

    boolean

    true indica que el cuerpo de la solicitud se recibió por completo. false indica que aún faltan datos por recibir.

    local last = aliwaf.func.is_last_fragment_arrived()
  • Si el cuerpo se truncó

    Elemento

    Tipo

    Descripción

    Parámetro

    -

    -

    Valor devuelto

    boolean

    true indica que el cuerpo de la solicitud superó el límite y se truncó. false indica que el cuerpo de la solicitud está intacto.

    De forma predeterminada, WAF almacena hasta 128 KB del cuerpo de la solicitud. Las solicitudes que superan este límite se truncan (la parte excedente se descarta).

    local discard = aliwaf.func.is_request_body_discarded()

Esperar el cuerpo

Los cuerpos de las solicitudes llegan a WAF mediante streaming, por lo que es posible que el cuerpo aún no se haya recibido por completo cuando se ejecuta el script. Para procesar el cuerpo completo, indique explícitamente al framework que espere a recibirlo antes de volver a ejecutar el script.

Elemento

Tipo

Descripción

Parámetro

-

-

Valor devuelto

-

-

aliwaf.func.wait_request_body()

Ejemplo: Leer el cuerpo de la solicitud

-- Body not fully received; wait for it --
if not aliwaf.func.is_last_fragment_arrived() then
  aliwaf.func.wait_request_body()
  return
end

-- Body fully received; check if truncated --
if aliwaf.func.is_request_body_discarded() then
  return
end

-- eyJwcm9kdWN0X2lkIjogNzg5LCAicXVhbnRpdHkiOiAyLCAidXJnZW50IjogdHJ1ZX0= --
local body = aliwaf.req.get_body()

-- TODO: Apply business logic to the complete body --

Funciones de utilidad comunes

Codificación y decodificación básicas

Las interfaces de codificación y decodificación URL, hexadecimal y base64 aceptan un parámetro de cadena y devuelven una cadena procesada. Si ocurre un error, devuelven una cadena vacía.

Codificación y decodificación URL

  • escape_uri

    Elemento

    Tipo

    Descripción

    Parámetro

    string

    La cadena original que se va a codificar.

    Valor devuelto

    string

    La cadena codificada.

  • unescape_uri

    Elemento

    Tipo

    Descripción

    Parámetro

    string

    La cadena codificada en URL que se va a decodificar.

    Valor devuelto

    string

    La cadena original decodificada.

-- a%20b --
local data1 = aliwaf.util.escape_uri('a b')

-- a b --
local data2 = aliwaf.util.unescape_uri('a%20b')

Codificación y decodificación hexadecimal

  • hex_encode

    Elemento

    Tipo

    Descripción

    Parámetro

    string

    La cadena binaria que se va a codificar.

    Valor devuelto

    string

    La cadena codificada en hexadecimal con letras mayúsculas.

  • hex_decode

    Elemento

    Tipo

    Descripción

    Parámetro

    string

    La cadena hexadecimal que se va a decodificar.

    Valor devuelto

    string

    La cadena original decodificada. Devuelve una cadena vacía "" si la entrada no es válida.

-- DEADBEEF --
local data1 = aliwaf.util.hex_encode(string.char(0xDE, 0xAD, 0xBE, 0xEF))

-- \xDE\xAD\xBE\xEF --
local data2 = aliwaf.util.hex_decode('DEADBEEF')

Codificación y decodificación Base64

  • base64_encode

    Elemento

    Tipo

    Descripción

    Parámetro

    string

    La cadena original que se va a codificar.

    Valor devuelto

    string

    La cadena codificada en Base64.

  • base64_decode

    Elemento

    Tipo

    Descripción

    Parámetro

    string

    La cadena en Base64 que se va a decodificar.

    Valor devuelto

    string

    La cadena original decodificada. Devuelve una cadena vacía "" si la entrada no es válida.

-- aGVsbG8= --
local data1 = aliwaf.util.base64_encode('hello')

-- hello --
local data2 = aliwaf.util.base64_decode('aGVsbG8=')

MD5/CRC/SHA

  • md5

    Elemento

    Tipo

    Descripción

    Parámetro

    string

    La cadena original a la que se le calculará el hash.

    Valor devuelto

    string

    La firma MD5 en formato hexadecimal de 32 caracteres en minúsculas.

  • sha256

    Elemento

    Tipo

    Descripción

    Parámetro

    string

    La cadena original a la que se le calculará el hash.

    Valor devuelto

    string

    La firma SHA-256 en formato hexadecimal de 64 caracteres en minúsculas.

  • crc32

    Elemento

    Tipo

    Descripción

    Parámetro

    string

    La cadena original que se va a procesar.

    Valor devuelto

    integer

    La suma de comprobación CRC32 (entero de 32 bits sin signo).

-- 5d41402abc4b2a76b9719d911017c592 --
local md5 = aliwaf.util.md5('hello')

-- 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 --
local sha = aliwaf.util.sha256('hello')

-- 3287646509 --
local crc = aliwaf.util.crc32('hello')

Cifrado y descifrado (AES/DES)

  • evp_encrypt

    Elemento

    Tipo

    Descripción

    Parámetro 1

    string

    El tipo de algoritmo de cifrado, como "aes-128-cbc".

    Parámetro 2

    string

    La clave de cifrado (cadena segura para datos binarios).

    Parámetro 3

    string

    El vector de inicialización. Puede ser una cadena vacía "" si no se usa IV.

    Parámetro 4

    string

    El texto sin formato que se va a cifrar.

    Valor devuelto

    string

    El texto cifrado. Devuelve una cadena vacía "" si los parámetros no son válidos o si el cifrado falla.

  • evp_decrypt

    Elemento

    Tipo

    Descripción

    Parámetro 1

    string

    El tipo de algoritmo de descifrado. Debe coincidir con el algoritmo utilizado para el cifrado, como "aes-128-cbc".

    Parámetro 2

    string

    La clave de descifrado. Debe coincidir con la clave utilizada para el cifrado.

    Parámetro 3

    string

    El vector de inicialización. Debe coincidir con el IV utilizado para el cifrado. Puede ser una cadena vacía "".

    Parámetro 4

    string

    El texto cifrado que se va a descifrar.

    Valor devuelto

    string

    El texto sin formato descifrado. Devuelve una cadena vacía "" si los parámetros no son válidos o si el descifrado falla.

local data1 = aliwaf.util.evp_encrypt('aes-128-cbc', 'key-12345678-key', 'iv-1234567890-iv', 'hello')

local data2 = aliwaf.util.evp_decrypt('aes-128-cbc', 'key-12345678-key', 'iv-1234567890-iv', data1)

Firma y verificación (ES256)

  • es256_sign

    Elemento

    Tipo

    Descripción

    Parámetro 1

    string

    La clave privada ES256 en formato PEM.

    Parámetro 2

    string

    Los datos originales que se van a firmar.

    Valor devuelto

    string

    El resultado de la firma (cadena binaria). Devuelve una cadena vacía "" si los parámetros no son válidos o si la firma falla.

  • es256_verify

    Elemento

    Tipo

    Descripción

    Parámetro 1

    string

    La clave pública ES256 en formato PEM.

    Parámetro 2

    string

    Los datos originales utilizados para la firma (deben coincidir con los datos usados durante la firma).

    Parámetro 3

    string

    El valor de la firma que se va a verificar (generado por es256_sign).

    Valor devuelto

    boolean

    true indica que la verificación de la firma fue correcta. false indica que la verificación falló o que los parámetros no son válidos.

local sign = aliwaf.util.es256_sign('private_key-1234', 'hello')

local result = aliwaf.util.es256_verify('public_key-12345', 'hello', sign)

Hora

Elemento

Tipo

Descripción

Parámetro

-

-

Valor devuelto

integer

La marca de tiempo UNIX actual con precisión de milisegundos.

-- Current millisecond-level timestamp (integer) --
local timestamp = aliwaf.util.get_current_ms()

Funciones auxiliares de negocio

Las funciones auxiliares de negocio coordinan la comunicación entre los scripts de Lua y el framework de WAF.

Acción

Elemento

Tipo

Descripción

Parámetro

-

-

Valor devuelto

-

-

-- Take action on the current request based on the pre-selected action --
aliwaf.func.punish()