基于OpenResty的OSS图片安全资源请求
Posted JAVAProgressive
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于OpenResty的OSS图片安全资源请求相关的知识,希望对你有一定的参考价值。
所以,在图片的请求机制上,不可避免的需要对图片的资源请求做一定的安全规范,避免资源的被恶意请求。
下面,贴上以基于OpenResty的方法,对图片的请求机制的安全验证代码。
> 配置nginx
redis接连池:
upstream backend {
server 192.168.1.244:6379;
keepalive 100;
}
请求配置:
#配置资源请求入口,使用lua脚本
location / {
default_type text/html;
content_by_lua_file lua/oss.lua;
}
location /redis {
if ($query_string !~* ^(.*)_s_=abc(.*)$){
rewrite ^/(.*) /404.png;
}
set_unescape_uri $query $arg_query;
redis2_raw_queries 2 $query;
redis2_pass backend;
}
#转发请求到OSS请求真实资源
location /toOss/ {
if ($query_string !~* ^(.*)_s_=abc(.*)$){
rewrite ^/(.*) /404.png;
}
proxy_pass http://a.oss-cn-shanghai.aliyuncs.com/a/;
}
> lua脚本:
local args = ngx.req.get_uri_args();
local s = args['s'] --实际签名
local t = args['t'] --时间参数,到t,当t到系统时间相差1分钟,将会导致无法请求到图片资源
local u = args['u'] --用户标识
local r = args['r'] --随机参数
if (s == nil) or (t == nil) or (r == nil) or (u == nil) then
ngx.exit(ngx.HTTP_NOT_FOUND)
return
end
local md5Sign = ngx.md5((t * 2) .. 'key' .. u)
if md5Sign ~= s then
ngx.exit(ngx.HTTP_NOT_FOUND)
return
end
--判断t随机数不能一样,所有的t在一天内只能存在一次
local function now_daytime_end(now_time)
local tab = os.date("*t", now_time)
tab.hour = 0 tab.min = 0 tab.sec = 0
local result = tonumber(os.time(tab) + 86400)
return result
end
local todayEnd = now_daytime_end(os.time())
local shell = 'expireat oss_sign ' .. todayEnd .. '\r\n' .. 'hsetnx oss_sign ' .. s .. ' ' .. u .. '\r\n'
local res = ngx.location.capture("/redis", {args = {_s_ = "kljsadfiouwer", query = shell }})
if res.body:byte(2) == 49 and res.body:byte(6) == 48 then
ngx.exit(ngx.HTTP_NOT_FOUND)
return
end
local img;
local q;
local uri = ngx.var.uri;
if ngx.re.match(uri, '_small') then
img = 'p_30'
q = 'q_30'
uri = string.gsub(uri, '_small', '')
else
img = 'p_70'
q = 'q_70'
end
ngx.exec("/toOss".. uri , "_s_=kljsadfiouwer&x-oss-process=image/resize," .. img .. "/quality," .. q)
参考文档:
https://www.nginx.com/resources/wiki/modules/redis2/
https://www.nginx.com/resources/wiki/modules/lua/
http://www.runoob.com/lua/lua-tutorial.html
以上是关于基于OpenResty的OSS图片安全资源请求的主要内容,如果未能解决你的问题,请参考以下文章
软WAF的另一种思路:基于Openresty+Naxsi的WAF实现