配置nginx_lua_module
http {
server {
location / {
#执行的方式 执行文件的地址
content_by_lua_file /path/to/lua_script.lua;
}
}
}
如果你想在请求被处理之前的重写阶段执行 xss.lua 脚本来修改请求的 URI、参数或其他内容,可以使用
rewrite_by_lua_file
。示例配置如下:
server {
location / {
rewrite_by_lua_file /path/to/xss.lua;
# 其他指令和配置...
}
}
在该配置中,当请求匹配到 /
路径时,Nginx 将会执行 /path/to/xss.lua
文件中的 Lua 脚本进行重写操作。
如果你希望在请求进入 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),并且设置正确的文件路径和权限。
在没有看到代码的返回,可能有几个原因需要检查:
确保您在正确的位置使用了这段代码。在Nginx配置文件中,通常将此代码放在
location
块内的content_by_lua_block
或content_by_lua_file
指令中。确保这些指令所在的位置与您期望的一致。
确保访问的域名和路径匹配了配置文件中的
location
块。要确保请求的URL与配置文件中定义的位置匹配,以便执行相应的Lua代码。
检查错误日志。如果代码存在语法错误或其他运行时错误,Nginx将记录相关错误信息。您可以查看Nginx的错误日志文件,通常位于
/var/log/nginx/error.log
,查找与Lua相关的错误消息。
lua执行过程时的时机和配置:
详情请看文章:Nginx模块Lua基本使用方法抄录_nginx lua脚本
ngx.req.get_uri_args()和ngx.req.get_uri_post_args()遇到
在nginx的http块处添加
lua_need_request_body on;
就可以从nginx_lua上面读取到对应的请求参数
nginx_lua获取请求参数
ngx.req.get_uri_args(): 这个方法用于获取请求的查询参数(query string)并返回一个 Lua 表,其中包含了请求中的所有参数。例如,如果 URL 是 http://example.com/path?name=John&age=30,ngx.req.get_uri_args() 将返回 { name = "John", age = "30" }。
ngx.req.get_post_args(): 这个方法用于获取 POST 请求的参数,通常用于处理表单提交。它返回一个 Lua 表,包含了 POST 请求中的所有参数。
ngx.req.get_headers(): 这个方法用于获取请求头信息,返回一个 Lua 表,包含了请求头的键值对。
ngx.req.get_method(): 获取请求的 HTTP 方法,如 "GET"、"POST" 等。
ngx.req.set_uri_args(args): 这个方法用于设置请求的查询参数,你可以传递一个 Lua 表作为参数。
ngx.req.read_body(): 用于读取请求体的内容,通常在处理 POST 请求时使用。
ngx.req.set_header(name, value): 设置请求头的值,其中 name 是请求头的名称,value 是要设置的值。
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参数解释
ngx.var.uri: 获取当前请求的 URI(不包括查询参数部分)。
ngx.var.request_uri: 获取包括查询参数的完整请求 URI。
ngx.var.host: 获取当前请求的主机名。
ngx.var.scheme: 获取请求的协议方案,如 "http" 或 "https"。
ngx.var.remote_addr: 获取客户端的 IP 地址。
ngx.var.arg_name: 获取查询参数中名为 "name" 的值。你可以替换 "name" 为实际的查询参数名。
ngx.var.cookie_name: 获取 Cookie 中名为 "name" 的值。你可以替换 "name" 为实际的 Cookie 名。
ngx.var.http_headername: 获取请求头中名为 "HeaderName" 的值。你可以替换 "HeaderName" 为实际的请求头名称。
ngx.var.variable_name: 获取自定义 Nginx 变量的值。这些变量可以在 Nginx 配置文件中定义。
lua的循环语句
for _, str1 in ipairs(injStra) do ... end
:
ipairs
是Lua提供的默认迭代器,用于遍历数组类型。
使用
_
作为变量名表示我们不需要使用该变量,在本例中即循环索引。
可以直接使用
str1
来获取列表中的每个元素。
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.WARN
、ngx.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
评论区