基于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实现

OSS 访问图片资源报“No ‘Access-Control-Allow-Origin‘”的错误

如何限制用户仅通过HTTPS方式访问OSS?

阿里云oss请求包是干嘛的

数据使用相关建议方案--oss存储:

用CDN加速OSS源站的操作步骤详解