使用场景

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

实验环境

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 > 

            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数据,实现更丰富的验证手段。

Nginx 中利用 Lua 脚本做访问控制的更多相关文章

  1. CentOS6.4 安装OpenResty和Redis 并在Nginx中利用lua简单读取Redis数据

    1.下载OpenResty和Redis OpenResty下载地址:wget http://openresty.org/download/ngx_openresty-1.4.3.6.tar.gz Re ...

  2. 服务降级 托底预案 Nginx中使用Lua脚本检测CPU使用率,当达到阀值时开启限流,让用户排队

    https://mp.weixin.qq.com/s/FZAcQQAKomGEe95kln1HCQ 在京东我们是如何做服务降级的 https://mp.weixin.qq.com/s/FZAcQQAK ...

  3. openresty(nginx)中使用lua脚本获取请求IP地址的代码

    人狠话不多,直接上代码:------------------------------------------------------------------------------------- lo ...

  4. Nginx 内嵌lua脚本,结合Redis使用

    0x00 Nginx 内嵌Lua脚本有下面特点: 20k个并发连接 Lua脚本能够在Nignx 11个层次的不同层次发挥作用,扩展Ngnix功能 Lua速度极快(寄存器指令) 0x01 应用场景 在w ...

  5. 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!

    [COCOS2DX-LUA 脚本开发之一]在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途! 分类: [Cocos2dx Lua 脚本开发 ] 2012-04-1 ...

  6. 新姿势!Redis中调用Lua脚本以实现原子性操作

    背景:有一服务提供者Leader,有多个消息订阅者Workers.Leader是一个排队程序,维护了一个用户队列,当某个资源空闲下来并被分配至队列中的用户时,Leader会向订阅者推送消息(消息带有唯 ...

  7. 怎样在Cocos2d-x中使用Lua脚本

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013321328/article/details/25699545 笔者使用的是Cocos2d-x ...

  8. Redis中的原子操作(2)-redis中使用Lua脚本保证命令原子性

    Redis 如何应对并发访问 使用 Lua 脚本 Redis 中如何使用 Lua 脚本 EVAL EVALSHA SCRIPT 命令 SCRIPT LOAD SCRIPT EXISTS SCRIPT ...

  9. C++中嵌入Lua脚本环境搭建

    第一步(环境准备工作): 工具: ●LuaForWindows_v5.1.4-46.exe傻瓜式安装. 作用:此工具可以在windows环境下编译运行Lua脚本程序.安装完成后会有两个图标:Lua和S ...

随机推荐

  1. Jetson TX1使用usb camera采集图像 (2)

    该方法只启动usb摄像头 import cv2 import numpy import matplotlib.pyplot as plot class Camera: cap = cv2.VideoC ...

  2. WC2019冬眠记

    Day0 报道日就当做Day0吧. 上午起床比较晚,起来就开始整理东西准备搬到广二的高中部去,搬了两趟,因为没吃早饭,头就很晕,吓得我赶快把之前发的士力架给吃了. 上午李姐姐和我们聊了聊\(THUWC ...

  3. windows下的vimrc

    很奇怪的事...不会解释 建议编译位置第一次设置为 map <F9> :call CR()<CR>func! CR()exec "w"exec " ...

  4. 洛谷 P2590 [ZJOI2008]树的统计

    大家好,我非常喜欢暴力数据结构,于是我用块状树过了这道题目 题目: 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE ...

  5. visp库中解决lapack库的问题

    解决的办法是——绕过去,不要用这个库: 使用中发现如下代码抛出异常: //vpTemplateTracker.cpp try { initHessienDesired(I); ptTemplateSu ...

  6. 3-ftp搭建成功,服务器能访问,外网无法连接和访问

    登录 ECS 管理控制台,找到相应的实例. 在实例的右侧单击管理,进入实例详情页面.选择本实例安全组. 在安全组列表页面,找到相应的安全组,单击配置规则. 在安全组规则页面,单击添加安全组规则. 在添 ...

  7. 计算机网络(HTTP)之客户识别:cookie机制

    什么是cookie? 承载用户相关信息的HTTP首部 cookie的工作原理 cookie的缺陷 一.什么是cookie? cookie是由服务器生成,发送给USER-Agent(一般是浏览器),(服 ...

  8. [Luogu P2296][NOIP 2014]寻找道路

    emmm交了第8次才过. 这道题目测一道单源最短路问题,因此dijkstra或者spfa板子先准备好.因为题中对最短路有限定: 路径上的所有点的出边所指向的点都直接或间接与终点连通. 在满足条件1的情 ...

  9. XSS绕过<>进行测试

    大家都知道,普遍的防御XSS攻击的方法是在后台对以下字符进行转义:<.>.’.”,但是经过本人的研究发现,在一些特殊场景下,即使对以上字符进行了转义,还是可以执行XSS攻击的. 首先看一个 ...

  10. Git安装与仓库搭建

    yum install git-all cd /srv git init --bare net_server.git git remote - v git remote add server root ...