博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LUA验证系统PHP,openresty+Lua构建高性能、高可靠、安全的登陆校验
阅读量:5939 次
发布时间:2019-06-19

本文共 2806 字,大约阅读时间需要 9 分钟。

webserver层进行校验,直接告诉应用层校验结果,就可以避免上面的问题。openresty+Lua就是这样一种webserver上安全、稳定、高性能的实现,并且开发成本低的方案。

新建,access.lua 代码:

local secretkey='1234567890abcdefghi'

if ngx.var.cookie_uid == nil or ngx.var.cookie_username == nil or ngx.var.cookie_token ==nil then

ngx.req.set_header("Check-Login", "NULL")

return

end

local ctoken = ngx.md5('uid:' .. ngx.var.cookie_uid .. '&nickname:' ..ngx.var.cookie_username .. '&secretkey:' .. secretkey)

if ctoken == ngx.var.cookie_token then

ngx.req.set_header("Check-Login", "Yes")

else

ngx.req.set_header("Check-Login", "No")

end

return

2、

php生成 cookie页面:

$uid = 123;

$username = “jincon”

$secretkey = “1234567890abcdefghi”;

setcookie(“uid”,$uid,time()+3600);

setcookie(“username”,$username,time()+3600);

setcookie(“secretkey”,$secretkey,time()+3600);

?>

判断是否校验成功:

if($_SERVER[‘HTTP_CHECK_LOGIN’]){

$uid = $_COOKIE[‘uid’];

$username = $_COOKIE[‘username’];

}

?>

3、nginx 的修改:

location ~ [^/]\.php(/|$) {

#添加 lua 加载。

access_by_lua_file "/usr/local/openresty/nginx/lua/test.lua";

fastcgi_pass unix:/dev/shm/php-cgi.sock;

fastcgi_index index.php;

include fastcgi.conf;

}

可能有的人说 HTTP 这样开头不都是可以伪造的嘛,是可以伪造,

但是了解 nginx 和 lua 执行流程就知道了,这里是不能伪造的,提供测试代码,你试试可能伪造:

$ch = curl_init();

$url = "http://192.168.1.58/test.php";

$header = array(

'Check-Login:No'

);

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_HTTPHEADER, $header);

curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);

$page_content = curl_exec($ch);

curl_close($ch);

echo $page_content;

?>

附nginx+lua 处理流程(自己看吧):

Nginx 处理每一个用户请求时,都是按照若干个不同阶段(phase)依次处理的,而不是根据配置文件上的顺序。

Nginx 处理请求的过程一共划分为 11 个阶段,按照执行顺序依次是

post-read、server-rewrite、find-config、rewrite、post-rewrite、 preaccess、access、post-access、try-files、content、log.

post-read:读取请求内容阶段Nginx读取并解析完请求头之后就立即开始运行例如模块ngx_realip就在post-read阶段注册了处理程序,它的功能是迫使Nginx认为当前请求的来源地址是指定的某一个请求头的值。

server-rewrite

Server请求地址重写阶段

当 ngx_rewrite 模块的set配置指令直接书写在 server 配置块中时,基本上都是运行在 server-rewrite 阶段

find-config配置查找阶段这个阶段并不支持Nginx模块注册处理程序,而是由Nginx核心来完成当前请求与location配置块之间的配对工作。

rewrite

Location请求地址重写阶段

当 ngx_rewrite 模块的指令用于 location 块中时,便是运行在这个 rewrite 阶段。

另外,ngx_set_misc(设置md5、encode_base64等) 模块的指令,还有 ngx_lua 模块的 set_by_lua 指令和 rewrite_by_lua 指令也在此阶段。

post-rewrite

请求地址重写提交阶段

由 Nginx 核心完成 rewrite 阶段所要求的“内部跳转”操作,如果 rewrite 阶段有此要求的话。

preaccess访问权限检查准备阶段标准模块ngx_limit_req和ngx_limit_zone就运行在此阶段,前者可以控制请求的访问频度,而后者可以限制访问的并发度。

access访问权限检查阶段标准模块ngx_access、第三方模块ngx_auth_request以及第三方模块ngx_lua的access_by_lua指令就运行在这个阶段。配置指令多是执行访问控制性质的任务,比如检查用户的访问权限,检查用户的来源IP地址是否合法

post-access

访问权限检查提交阶段

主要用于配合 access 阶段实现标准 ngx_http_core 模块提供的配置指令 satisfy 的功能。

satisfy all(与关系)

satisfy any(或关系)

try-files配置项try_files处理阶段专门用于实现标准配置指令try_files的功能如果前N-1个参数所对应的文件系统对象都不存在,try-files阶段就会立即发起“内部跳转”到最后一个参数(即第N个参数)所指定的URI.

content内容产生阶段Nginx的content阶段是所有请求处理阶段中最为重要的一个,因为运行在这个阶段的配置指令一般都肩负着生成“内容”并输出HTTP响应的使命。

log日志模块处理阶段记录日志

转载地址:http://vhltx.baihongyu.com/

你可能感兴趣的文章
python写入excel(xlswriter)--生成图表
查看>>
Sublime Text 2 和 Verilog HDL
查看>>
NetworkStream.write只能使用一次,后面再使用无效
查看>>
Android Studio离线打包5+SDK
查看>>
oracle进行字符串拆分并组成数组
查看>>
100多个基础常用JS函数和语法集合大全
查看>>
Java8 lambda表达式10个示例
查看>>
innerHTML outerHTML innerText
查看>>
kafka安装教程
查看>>
go语言基础
查看>>
LINQ to SQL活学活用(1):这要打破旧观念
查看>>
Spring boot 嵌入的tomcat不能启动: Unregistering JMX-exposed beans on shutdown
查看>>
【Windows】字符串处理
查看>>
Spring(十八):Spring AOP(二):通知(前置、后置、返回、异常、环绕)
查看>>
CentOS使用chkconfig增加开机服务提示service xxx does not support chkconfig的问题解决
查看>>
微服务+:服务契约治理
查看>>
save
查看>>
Android DrawLayout + ListView 的使用(一)
查看>>
clear session on close of browser jsp
查看>>
asp.net mvc Post上传文件大小限制 (转载)
查看>>