侧边栏壁纸
博主头像
gale-blog博主等级

少年一贯快马扬帆,道阻且长不转弯,要盛大,要绚烂,要哗然,要用理想的泰坦尼克号去撞现实冰川,要当烧赤壁的风,而非借箭草船,要为了一片海,就肯翻万山

  • 累计撰写 39 篇文章
  • 累计创建 5 个标签
  • 累计收到 5 条评论

目 录CONTENT

文章目录

nginx配置Lua脚本

二月在这里
2024-01-19 / 0 评论 / 0 点赞 / 34 阅读 / 14551 字

配置nginx_lua_module

http {
    server {
        location / {
        #执行的方式  执行文件的地址
            content_by_lua_file /path/to/lua_script.lua;
        }
    }
}

  1. 如果你想在请求被处理之前的重写阶段执行 xss.lua 脚本来修改请求的 URI、参数或其他内容,可以使用 rewrite_by_lua_file。示例配置如下:

server {
    location / {
        rewrite_by_lua_file /path/to/xss.lua;
        # 其他指令和配置...
    }
}

在该配置中,当请求匹配到 / 路径时,Nginx 将会执行 /path/to/xss.lua 文件中的 Lua 脚本进行重写操作。

  1. 如果你希望在请求进入 Nginx 并通过 Lua 处理请求的阶段执行 xss.lua 脚本,可以使用 content_by_lua_file。示例配置如下:

server {
    location / {
        content_by_lua_file /path/to/xss.lua;
        # 其他指令和配置...
    }
}

在该配置中,当请求匹配到 / 路径时,Nginx 将会将请求传递给 /path/to/xss.lua 文件中的 Lua 脚本进行处理,并生成响应返回给客户端。

根据你的需求选择适合的指令,rewrite_by_lua_file 用于重定向前的处理,而 content_by_lua_file 用于请求处理阶段的逻辑。

请注意,在使用这些指令时,确保已经安装并启用了 ngx_lua 模块(如 OpenResty),并且设置正确的文件路径和权限。

在没有看到代码的返回,可能有几个原因需要检查:

  1. 确保您在正确的位置使用了这段代码。在Nginx配置文件中,通常将此代码放在location块内的content_by_lua_blockcontent_by_lua_file指令中。确保这些指令所在的位置与您期望的一致。

  1. 确保访问的域名和路径匹配了配置文件中的location块。要确保请求的URL与配置文件中定义的位置匹配,以便执行相应的Lua代码。

  1. 检查错误日志。如果代码存在语法错误或其他运行时错误,Nginx将记录相关错误信息。您可以查看Nginx的错误日志文件,通常位于/var/log/nginx/error.log,查找与Lua相关的错误消息。

lua执行过程时的时机和配置:

img

详情请看文章:Nginx模块Lua基本使用方法抄录_nginx lua脚本

ngx.req.get_uri_args()和ngx.req.get_uri_post_args()遇到

img

在nginx的http块处添加

lua_need_request_body on;

就可以从nginx_lua上面读取到对应的请求参数

nginx_lua获取请求参数

  1. ngx.req.get_uri_args(): 这个方法用于获取请求的查询参数(query string)并返回一个 Lua 表,其中包含了请求中的所有参数。例如,如果 URL 是 http://example.com/path?name=John&age=30ngx.req.get_uri_args() 将返回 { name = "John", age = "30" }

  2. ngx.req.get_post_args(): 这个方法用于获取 POST 请求的参数,通常用于处理表单提交。它返回一个 Lua 表,包含了 POST 请求中的所有参数。

  3. ngx.req.get_headers(): 这个方法用于获取请求头信息,返回一个 Lua 表,包含了请求头的键值对。

  4. ngx.req.get_method(): 获取请求的 HTTP 方法,如 "GET"、"POST" 等。

  5. ngx.req.set_uri_args(args): 这个方法用于设置请求的查询参数,你可以传递一个 Lua 表作为参数。

  6. ngx.req.read_body(): 用于读取请求体的内容,通常在处理 POST 请求时使用。

  7. ngx.req.set_header(name, value): 设置请求头的值,其中 name 是请求头的名称,value 是要设置的值。

  8. ngx.req.clear_header(name): 清除指定请求头的值。

function setcookie(value)
    local cookie_name = "name"
    if value == nil then
        value = "value"
    end
    local cookie_value = value
    local cookie_expires = os.time() + 3600 -- 设置 Cookie 过期时间(这里设置为1小时后)
    -- 设置 Cookie
    ngx.header["Set-Cookie"] = cookie_name .. "=" .. cookie_value .. "; expires=" .. os.date("%a, %d-%b-%Y %H:%M:%S GMT", cookie_expires) .. "; path=/"
end

nginx_var参数解释

  1. ngx.var.uri: 获取当前请求的 URI(不包括查询参数部分)。

  2. ngx.var.request_uri: 获取包括查询参数的完整请求 URI。

  3. ngx.var.host: 获取当前请求的主机名。

  4. ngx.var.scheme: 获取请求的协议方案,如 "http" 或 "https"。

  5. ngx.var.remote_addr: 获取客户端的 IP 地址。

  6. ngx.var.arg_name: 获取查询参数中名为 "name" 的值。你可以替换 "name" 为实际的查询参数名。

  7. ngx.var.cookie_name: 获取 Cookie 中名为 "name" 的值。你可以替换 "name" 为实际的 Cookie 名。

  8. ngx.var.http_headername: 获取请求头中名为 "HeaderName" 的值。你可以替换 "HeaderName" 为实际的请求头名称。

  9. ngx.var.variable_name: 获取自定义 Nginx 变量的值。这些变量可以在 Nginx 配置文件中定义。

lua的循环语句

  1. for _, str1 in ipairs(injStra) do ... end

  • ipairs是Lua提供的默认迭代器,用于遍历数组类型。

  • 使用_作为变量名表示我们不需要使用该变量,在本例中即循环索引。

  • 可以直接使用str1来获取列表中的每个元素。

  1. for i = 1, #injStra do ... end

  • 使用数字循环索引遍历列表。

  • 可以通过injStra[i]来获取列表中的每个元素。

  • 这种写法更加灵活,适用于遍历任何类型的表(数组或键值对)。

ngx_lua_moudle 中的日志默认输出是在ERR里面

ngx.log()函数是Nginx Lua模块中用于记录日志的函数。它可以将消息打印到Nginx的错误日志文件中。以下是使用ngx.log()函数打印参数的示例:

lua复制代码local args = ngx.req.get_uri_args()  -- 获取URL中的参数
ngx.log(ngx.ERR, "URL 参数: ", ngx.encode_args(args))

在上述示例中,我们首先使用ngx.req.get_uri_args()来获取URL中的参数,并将其存储在args变量中。然后,我们使用ngx.log()函数将参数以指定的日志级别(这里使用了ngx.ERR表示错误级别)打印到错误日志文件中。

ngx.encode_args()函数用于将参数编码为字符串形式,以便更好地显示在日志中。您可以根据需要选择其他日志级别,如ngx.WARNngx.INFO等。

请注意,在Nginx配置文件中,您需要将error_log指令设置为指定的日志文件路径和级别,以便记录ngx.log()函数的输出:

error_log /var/log/nginx/error.log error;

想要让参数输出到INFO日志当中需要去配置文件参数

想将参数打印到Nginx的信息日志中,可以将ngx.log()函数的第一个参数设置为ngx.INFO。以下是将参数打印到信息日志文件中的示例:

local args = ngx.req.get_uri_args()  -- 获取URL中的参数
ngx.log(ngx.INFO, "URL 参数: ", ngx.encode_args(args))

在上述示例中,我们使用ngx.req.get_uri_args()获取URL中的参数,并将其存储在args变量中。然后,我们使用ngx.log()函数将参数以ngx.INFO级别打印到信息日志文件中。

请确保在Nginx配置文件中将error_log指令设置为指定的日志文件路径和级别,以便记录ngx.log()函数的输出:

error_log /var/log/nginx/error.log info;

这样,通过将ngx.log()函数的第一个参数设置为ngx.INFO,您就可以将参数打印到Nginx的信息日志中了。这对于调试、分析和监控目的非常有用。

在Lua中使用正则表达式时,由于缺少直接等效的\b单词边界锚点,我们需要使用其他方法来实现同样的功能。我们可以通过组合Lua的模式匹配和字符串处理函数来完成这个任务。

function containsSqlInjection(obj)
    local keywords = {"and", "exec", "insert", "select", "drop", "grant", "alter", "delete", "update", "count", "chr", "mid", "master", "truncate", "char", "declare", "or"}
    local specialChars = {"*", ";", "+", "%"}
​
    local lowerObj = string.lower(tostring(obj))
​
    for _, keyword in ipairs(keywords) do
        local pattern = "%f[%a]" .. keyword .. "%f[%A]"
        if string.find(lowerObj, pattern) then
            return true
        end
    end
​
    for _, char in ipairs(specialChars) do
        if string.find(lowerObj, char, 1, true) then
            return true
        end
    end
​
    return false
end

参考文章:

【1】https://blog.csdn.net/shark_pang/article/details/124709417

【2】https://blog.csdn.net/qq_27156945/article/details/104019069

0

评论区