需求
客户的一个老项目被相关部门检测不安全,报告为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页面就说明不拦截