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日志模块处理阶段记录日志