当前位置: 首页 > news >正文

利用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 地址
        #前端项目
        
        # 默认读取 body
        lua_need_request_body on;

        location /validate {
            # 过滤requestParam 中的 非法参数,返回403
            if ($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
	-- 匹配成功,说明请求体中包含敏感内容,返回403
		ngx.log(ngx.ERR,"this request body contain the sql inject,this is dangerous! body = " .. body)
		ngx.exit(ngx.HTTP_FORBIDDEN)
	end
	
    local regex = "(.*?((')).*?){1,}"
    -- 使用body进行正则匹配
    local danyin = ngx.re.match(body, regex)

    if danyin then
		local regex2 = "(='.+')|( *'.+')";
		local mm = ngx.re.match(body, regex2)
		if not mm then
			 -- 匹配成功,说明请求体中包含敏感内容,返回403
			ngx.log(ngx.ERR,"this request body contain the sql inject,this is dangerous! body = " .. body)
			ngx.exit(ngx.HTTP_FORBIDDEN)
		end
    end
end

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

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

相关文章:

  • FTL算法
  • IP核实战:用Xilinx Clocking Wizard实现精密时序控制
  • 宿主机运行pyspark任务读取docker hadoop容器上的数据
  • 0基础 | 看懂原理图Datasheet 系列1
  • 前端状态管理 pinia和vuex高频面试题
  • 通过动态获取后端数据判断输入的值打小
  • 【C语言】 一维数组传参的本质
  • 车间图纸安全传输需要注意什么?
  • iTextSharp-PDF批量导出
  • 深入浅出Bearer Token:解析工作原理及其在Vue、Uni-app与Java中的实现Demo
  • OpenCV中文路径图片读写终极指南(Python实现)
  • [C++面试] 对通透比较器了解多少?(较少涉及,可跳过)
  • Kylin麒麟操作系统服务部署 | Ansible基础
  • 使用 Python 爬取 item_get_video 接口获取某书笔记详情
  • IDEA 创建SpringCloud 工程(图文)
  • Python----计算机视觉处理(Opencv:二值化,阈值法,反阈值法,截断阈值法,OTSU阈值法)
  • 小学数学原理1:14 - 为什么是减法?
  • 云创智城 ×YunParking停车源码+YunCharge充电源码+DeepSeek:AI 驱动城市级停车平台升级,构建安全智慧出行新生态
  • 搜索 之 组合问题
  • Kubernetes Pod 生命周期详解 之 探针
  • 江南考古文脉探寻
  • 美国考虑让移民上真人秀竞逐公民权,制片人称非现实版《饥饿游戏》
  • 蒲慕明院士:未来数十年不是AI取代人,而是会用AI的人取代不会用的
  • 大外交丨3天拿下数万亿美元投资,特朗普在中东做经济“加法”和政治“减法”
  • 世界数字教育大会发布“数字教育研究全球十大热点”
  • 新修订的《餐饮业促进和经营管理办法》公布,商务部解读