Linux安装ngx_lua_waf实现waf功能
一、ngx_lua_waf用途 1、防止SQL注入,本地包含,本地溢出,fuzzing测试,XSS,SSRF等web攻击;2、防止SVN/备份之类文件泄漏;3、防止apachebench之类的压力测试工具的攻击;4、屏蔽常见的扫描黑客工具,扫描器;5、屏蔽常见的网络请求;6、屏蔽照片附件类目录php执行权限;7、防止webshell上传。
二、安装1、首先安装所需要的依赖环境yum -y install gcc gcc-c++ wget git geoip-devel gd-devel pcre-deve libcurl-devel libxml2 libxml2-devel libgd-devel openssl-devel lua-devel
2、LuaJIT 下载并安装LuaJIT2.0.5,首先来到/usr/local/src(压缩包存放目录)目录下。 cd /usr/local/src wget http://luajit.org/download/LuaJIT-2.0.5.tar.gztar -zxvf LuaJIT-2.0.5.tar.gzcd LuaJIT-2.0.5m ...
xLua热更新4之Hotfix(上篇)
思考并回答以下问题:
xLua里面有一个热补丁的功能。就是你有的C#代码不用改,就可以加入热更新的功能。
为什么叫热补丁呢?已有项目中的C#代码只需要增加一些配置,不用做其他任何调整就可使用上类似热更新的功能。由于和热更新也不同,所以叫热补丁。这也是xLua首创的一项功能。
热补丁的优点有这些:
侵入性小,老项目原有代码不做任何调整就可使用。
出问题了才用Lua代码来打补丁,这时才会走到lua代码逻辑。运行时影响小,不打补丁基本和原有程序一样。
使用流程xLua的热补丁使用大体流程如下:
添加HOTFIX_ENABLE宏打开该特性(在Unity3D的File-›Build Setting-›Scripting Define Symbols下添加)。编辑器、各手机平台这个宏要分别设置。如果是自动化打包,要注意在代码里用API设置的宏是不生效的,需要在编辑器设置。
(建议平时开发业务代码不打开HOTFIX_ENABLE,只在build手机版本或者要在编译器下开发补丁时打开HOTFIX_ENABLE)
配置热补丁代码,标识要热更新的类型
执行XLua/Generate Code ...
redis编写lua脚本
由于redis并没有类似mysql或者mongo的乐观锁机制,并发控制成了一个棘手的问题这块是可以用redis的watch来做,但是如果能实现乐观锁,那就非常方便了
redis使用lua的基础语法12345> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second1) "key1"2) "key2"3) "first"4) "second"
lua可以调用的redis函数12redis.call()redis.pcall()
简单例子123456789local version = redis.call("INCR", KEYS[2])if version == 1 then redis.call("EXPIRE", KEYS[2], ARGV[3])end;if tostring(version) ~= ARGV[2] then return {-1, version ...
evaluation
An Empirical Evaluation of In-Memory Multi-Version Concurrency Control介绍MVCC是目前最流行的并发控制协议,本文是论文原文的翻译,省略掉实验部分,感兴趣的同学可以去参照论文原文。这篇论文从4个方面分析了MVCC设计取舍,包括如下:
concurrency control protocol
version storage
garbage collection
index management
简介MVCC概述MVCC最大的优点是能够让数据库有更大的并发量,例如一个使用MVCC的数据库管理系统(DBMS)可以同时让一个事务读取一条数据的老版本而另一个事务更新同一条数据。MVCC的这些优点让它成为了近几年数据库的最佳选择,下表(表1)总结了近三十年来数据库MVCC的一些实现。
DBMS元数据MVCC DBMS为事务以及元组维护着一些相似的元数据。
每一个事务都有一个全局唯一且递增的事务Tid,并发控制协议会使用Tid标识被访问的元组。
每一个元组的头部有四个元数据字段,如图1。txn-id是元组的wri ...
Lua 学习 chapter29
目录
前言
c函数
延续
c模块
生活总需要一点仪式感,然后慢慢的像那个趋向完美的自己靠近。
前言
Lua调用c函数时,我们必须注册该函数,即不需以一种恰当的方式为lua提供该c函数的地址。
lua调用c函数时,也使用了一个与c语言调用Lua函数时相同类型的栈,c函数从栈中获取参数,并将结果压入到栈中。
需要注意的是,这个栈不是一个全局结构;每个函数都有其私有的局部栈。当Lua调用一个c函数时,第一个参数总是位于这个局部栈中,索引为1的位置。即使一个c函数调用了lua点吗,而且lua代码用再次调用了同一个的c函数,这些调用每次只会看到本次调用自己的私有栈,其中索引为1的位置就是第一个参数。
C函数
随便写一个c的函数,该函数求一个数的正选值。
1
2
3
4
5
6
static int l_sin(lua_State *L)
{
double d = lua_tonumber(L,1);//获取参数
lua_pushnumber(L,sin(d));//将结果入栈
return 1;//返回值的个数
}
所有在lua中注册的函数 ...
Programming in Lua摘录
“袁承志知道若再谦逊,那就是瞧人不起,展开五行拳,发拳当胸打去。荣彩和旁观三人本来都以为他武功有独到之秘,哪知使出来的竟是武林中最寻常不过的五行拳。
敌对三人登时意存轻视,温青脸上不自禁露出失望的神色。
“荣彩心中暗喜,双拳如风,连抢三下攻势,满拟自己的大力魔爪手江南独步,三四招之间就可破去对方五行拳,那知袁承志轻描淡写的一一化解。再拆数招,荣彩暗暗吃惊,原来对方所使虽是极寻常的拳术,但每一招均是含劲不吐,意在拳先,举手抬足 之间隐含极浑厚的内力。”
——金庸《碧血剑》
每周一论文:An Empirical Evaluation of In
论文概要多版本并发控制(Multi-Version Concurrency Control,以下简称MVCC) 是当今数据库领域最流行的并发控制实现,MVCC 在最大化并发度的情况下尽可能保证事务的正确性,其好处有:
写不会阻塞读
只读事务无需数据库锁就能支持可重复读
可以很好地支持历史数据查询
MVCC 的关键在于首先假设数据库读写冲突不会很大,其次通过维护同一份数据的多个版本,是的事务之间的冲突尽可能小;当一个事务修改数据的时候,创建一个新的版本,当一个事务读数据的时候,返回最新版本数据;所有对于数据的修改都发生在事务的私有空间内,在提交的时候进行验证。
当今主流的数据库基本都支持MVCC:
本篇论文系统的总结了 MVCC 的技术要点,包括:
并发控制协议
多版本存储
垃圾回收
索引管理
并发控制协议MVTO通过预先计算顺序的方式来控制并发;事务的读操作返回最新的没有被写锁锁定数据的版本;事务的写操作过程如下:
当前没有活跃的事务锁定数据
当前事务的事务编号大于最新数据中的读事务的事务编号
如果这上述条件成立,那么创建一个新的数据版本
MVOCC在 MVOCC 中,事务 ...
Lua元表
在 Lua 5.1 语言中,元表 (metatable) 的表现行为类似于 C++ 语言中的操作符重载,例如我们可以重载 “add” 元方法 (metamethod),来计算两个 Lua 数组的并集;或者重载 “index” 方法,来定义我们自己的 Hash 函数。
预定义操作集合其实不仅仅是LUA, 在大多数编程语言中,每一种类型的值,都有 一套预定义的操作集合。例如,整形的数值可以进行加操作,减作等,字符串类型的数值可以进行加操作等,不同的类型预定义操作或者说预定义的行为略有不同, 在LUA语言中,table类型的值默认是不能进行加操作的。但是我们能不能让table可以进行加操作呢?答案是可以。
元表要想使table类型的值可以进行加操作,就要为table类型的值添加一个加操作的行为,我们姑且把它叫做是非预定义的操作。这时就要用到我们要讲的元表,称之为metatable,元表也是一种数据类型,在lua语言中,我们可以为table类型的值设置metatable,来为table类型的值添加一些非预定义的操作。
在lua中为我们提供的两个方法:
setmetatable(table, ...
Linux lua及依赖库安装
lua5.2暂时不使用,使用lua5.1+luarocks
看readline软件包是否安装(dpkg -l | grep -i 软件名)
是否安装ncurses安装包(ncurses安装包 )
是否安装libncurses5-dev 或libncursesw5-dev软件包(apt-get install libncurses5-dev)
ncurses-5.9.tar.gz$ ./configure
$ make
$ sudo make installreadline-6.3.tar.gz$ ./configure
$ make
$ sudo make install
$ sudo ldconfiglua-5.2.3.tar.gz$ sudo apt-get install libreadline6-dev
$ sudo apt-get install libreadline6-dbg
$ make linux
$ OKlua-cjson$ vim Makefile
LUA_VERSION = 5.2
$ make
$ sudo make installlua rock ...
lua 与 C 交互
lua和C交互的核心就是lua栈,lua和C的所有数据交互都是通过lua栈来完成的。
一. C调用luaC调用lua很简单,通常C以lua作为配置脚本,在运行时读取脚本数据,主要步骤:
加载脚本 luaL_loadfile
运行脚本 lua_pcall
获取数据 lua_getglobal ….
使用数据 lua_tostring lua_pcall …
二. 在lua脚本中调用C:在C程序中,使用lua作为脚本,但是要在运行脚本时,访问C中定义的一些变量或函数。
将C变量或函数(遵从指定函数原型,见下面三 Step 1)push到lua栈中
通过lua_setglobal为当前lua栈顶的函数或变量命名,这样在lua中可通过该名字完成对变量或函数的使用
之后可在加载的lua脚本中使用C变量或函数
三. 将C函数封装为一个库,为lua所用将C函数编译为动态库文件,这样可以在lua主程序中,加载这个库文件,并使用其中的C函数。
Step 1. 在mylib.c中定义给lua调用的C函数 函数原型为: int (lua_State*)如:
static int c ...