欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > 利用OpenResty拦截SQL注入

利用OpenResty拦截SQL注入

2025/3/13 16:25:31 来源:https://blog.csdn.net/smile_life_/article/details/146148594  浏览:    关键词:利用OpenResty拦截SQL注入

需求

客户的一个老项目被相关部门检测不安全,报告为sql注入。不想改代码,改项目,所以想到利用nginx去做一些数据校验拦截。也就是前端传一些用于sql注入的非法字符或者数据库的关键字这些,都给拦截掉,从而实现拦截sql注入的功能。以下示例是校验body中的JSON数据,如果符合正则表达式,则给拦截

什么是OpenResty

OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。

OpenResty® 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。

OpenResty快速实操(拦截SQL注入示例)

先下载

OpenResty - 下载

可以理解为下载后是一个免安装版的nginx

1、解压后,配置nginx.conf

server {listen 8888;server_name localhost; # 或者您的实际域名/IP 地址#前端项目# 默认读取 bodylua_need_request_body on;location /validate {# 过滤requestParam 中的 非法参数,返回403if ($query_string ~* ".*('|--|union|insert|drop|truncate|update|from|grant|exec|where|select|and|chr|mid|like|iframe|script|alert|webscan|dbappsecurity|style|WAITFOR|confirm|innerhtml|innertext|class).*"){ return 403; }# 过滤 requestBody中的非法参数rewrite_by_lua_file lua/hwj/checkSqlInject.lua;proxy_pass https://qq.com;}}

2、创建一个校验前端请求参数的 lua文件

-- 声明读取body内容
ngx.req.read_body()
-- 获取body内容
local body = ngx.req.get_body_data()
-- 判定请求类型(只处理post请求)
if ngx.var.request_method == "POST" and body ~= nil then-- 声明正则local regexWord = "(.*?((\\bunion\\b)|(\\binsert\\b)|(\\bdrop\\b)|(\\btruncate\\b)|(\\bupdate\\b)|(\\bfrom\\b)|(\\bgrant\\b)|(\\bexec\\b)|(\\bwhere\\b)|(\\bselect\\b)).*?){1,}"-- 使用body进行正则匹配local word = ngx.re.match(body, regexWord)if word then-- 匹配成功,说明请求体中包含敏感内容,返回403ngx.log(ngx.ERR,"this request body contain the sql inject,this is dangerous! body = " .. body)ngx.exit(ngx.HTTP_FORBIDDEN)endlocal regex = "(.*?((')).*?){1,}"-- 使用body进行正则匹配local danyin = ngx.re.match(body, regex)if danyin thenlocal regex2 = "(='.+')|( *'.+')";local mm = ngx.re.match(body, regex2)if not mm then-- 匹配成功,说明请求体中包含敏感内容,返回403ngx.log(ngx.ERR,"this request body contain the sql inject,this is dangerous! body = " .. body)ngx.exit(ngx.HTTP_FORBIDDEN)endend
end

3、启动nginx,并使用apifox测试

返回403说明成功拦截,展示qqcom页面就说明不拦截

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词