• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Nginx中利用Lua脚本做访问控制

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

使用场景

需要在后端服务之前做访问控制,或没有后端服务的场景,如静态文件。

实验环境

Ubuntu 14.04

Nginx 1.4.6

安装 Lua 运行环境

sudo apt-get install lua5.1 liblua5.1-dev liblua5.1-socket2 libluajit-5.1-2 libluajit-5.1-common nginx-extras

测试是否支持 lua

在 Nginx server 配置中增加location块:

 

 location /lua/test/ {

        default_type 'text/html';

        content_by_lua 'ngx.say("hello world");';

    }

能看到对应浏览器输出,表示当前Nginx已支持lua脚本:

简单的签名验证

举例实现对某个静态文件目录添加签名验证。

URL参数包含当前时间戳“ts”,以及签名“sign”,lua脚本实现以下功能:

  • 时间戳与当前服务器时间相差上下5分钟以内。
  • 使用secretkey+时间戳做MD5,得到签名字符串,与传入的sign参数对比验证。
  • 如果以上任何一个验证不通过,则返回403错误。

代码如下:

 location /lua/tmp/ {

        alias /tmp/;



        access_by_lua '

            -- 配置的app id对应secret key

            local appIdKeys = {

                ["app001"] = "secretkey_1",

                ["app002"] = "secretkey_2"

            };

            local args = ngx.req.get_uri_args();

            local timestamp = args["timestamp"];     -- 获取参数的时间戳

            local now = os.time();           -- 获取当前时间戳

            local offset = math.abs(now - timestamp);  -- 计算时间差绝对值



            -- 时间戳相差超过300秒,返回403

            if offset > 300

            then                                                                                                     

                ngx.status = ngx.HTTP_FORBIDDEN;

                ngx.say("403 Forbidden<br>"..now);

                ngx.exit(ngx.HTTP_FORBIDDEN);

            end



            local appid = args["appid"];  -- 参数中的APP ID

            local sign = args["sign"];  -- 参数中的签名

            local curr_sign = ngx.md5(appIdKeys[appid] .. timestamp);

            -- 如果参数中的 sign 和计算得到的 curr_sign 不相等,则说明访问非法,禁止访问,否则放行访问

            if curr_sign ~= sign then

                ngx.status = ngx.HTTP_FORBIDDEN;

                ngx.say("Invalid signature");

                ngx.exit(ngx.HTTP_FORBIDDEN);

            end

        ';

    }

执行结果:

多说两句

配合 lua-nginx-redis 模块,能够读取redis数据,实现更丰富的验证手段。

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Lua练习题集嚢发布时间:2022-07-22
下一篇:
lua:lua作配置文件发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap