Nginx 中利用 Lua 脚本做访问控制
使用场景
需要在后端服务之前做访问控制,或没有后端服务的场景,如静态文件。
实验环境
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 脚本做访问控制的更多相关文章
- 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 ...
- 服务降级 托底预案 Nginx中使用Lua脚本检测CPU使用率,当达到阀值时开启限流,让用户排队
https://mp.weixin.qq.com/s/FZAcQQAKomGEe95kln1HCQ 在京东我们是如何做服务降级的 https://mp.weixin.qq.com/s/FZAcQQAK ...
- openresty(nginx)中使用lua脚本获取请求IP地址的代码
人狠话不多,直接上代码:------------------------------------------------------------------------------------- lo ...
- Nginx 内嵌lua脚本,结合Redis使用
0x00 Nginx 内嵌Lua脚本有下面特点: 20k个并发连接 Lua脚本能够在Nignx 11个层次的不同层次发挥作用,扩展Ngnix功能 Lua速度极快(寄存器指令) 0x01 应用场景 在w ...
- 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!
[COCOS2DX-LUA 脚本开发之一]在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途! 分类: [Cocos2dx Lua 脚本开发 ] 2012-04-1 ...
- 新姿势!Redis中调用Lua脚本以实现原子性操作
背景:有一服务提供者Leader,有多个消息订阅者Workers.Leader是一个排队程序,维护了一个用户队列,当某个资源空闲下来并被分配至队列中的用户时,Leader会向订阅者推送消息(消息带有唯 ...
- 怎样在Cocos2d-x中使用Lua脚本
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013321328/article/details/25699545 笔者使用的是Cocos2d-x ...
- Redis中的原子操作(2)-redis中使用Lua脚本保证命令原子性
Redis 如何应对并发访问 使用 Lua 脚本 Redis 中如何使用 Lua 脚本 EVAL EVALSHA SCRIPT 命令 SCRIPT LOAD SCRIPT EXISTS SCRIPT ...
- C++中嵌入Lua脚本环境搭建
第一步(环境准备工作): 工具: ●LuaForWindows_v5.1.4-46.exe傻瓜式安装. 作用:此工具可以在windows环境下编译运行Lua脚本程序.安装完成后会有两个图标:Lua和S ...
随机推荐
- IOS 选择会员资格
选择会员资格 针对所有 Apple 平台进行开发从未如此简单.要开始为 macOS.iOS.tvOS 和 watchOS 开发 app,请从 Mac App Store 下载 Xcode.如果您已准备 ...
- Java实训作业
1.编写程序:声明一个整型变量a,并赋初值5,在程序中判断a是奇数还是偶数,然后输出判断的结果. public class hello{ public static void main(String[ ...
- ubuntu下面配置apache
1.在这个目录下面修改这个文件 把那个注释了 2.在这个目录下面修改这个文件 把这个改为index的目录
- 「FHQ Treap」学习笔记
话说天下大事,就像fhq treap —— 分久必合,合久必分 简单讲一讲.非旋treap主要依靠分裂和合并来实现操作.(递归,不维护fa不维护cnt) 合并的前提是两棵树的权值满足一边的最大的比另一 ...
- 给dataframe添加一列索引
测试数据自己瞎编的 需求:给现在df数据添加一列sid,要求这一列是和stock一一对应的整数 代码如下: import pandas as pd test_data = {'stock': ['AA ...
- CF271D 【Good Substrings】
定义哈希函数 \(H(c)=\sum_{i = 1} ^ m c_i*b^{m-i}\) \(H(C,K+1)=H(C,K)*b+C_{K+1}\)(K个坏字母) 用long long #includ ...
- pwn-ROP(2)
通过int80系统只对静态编译有效,动态编译需要用其他方法 本题提供了一个地址输入端,输入函数地址会返回该函数的实际地址,我们用得到的实际地址-偏移地址=基地址,然后用基地址+任意函数的偏移地址就可以 ...
- centos下彻底删除mysql的方法
本文记录了CentOS下MySQL的彻底卸载,供大家参考,具体内容如下: 1.查看MySQL是否安装 方式1: [root@localhost usr]# yum list installed mys ...
- PTA编译总结求最大值及其下标
代码: #include<stdio.h> int main(void) { int i,index=0,n; int a[10]; scanf(" ...
- 基于Redis的分布式锁真的安全吗?
说明: 我前段时间写了一篇用consul实现分布式锁,感觉理解的也不是很好,直到我看到了这2篇写分布式锁的讨论,真的是很佩服作者严谨的态度, 把这种分布式锁研究的这么透彻,作者这种技术态度真的值得我好 ...