玩静态资源加密验证 原

###背景 为了防止裸奔的静态图片和相关的附件被用户拿来随意拼装下载,需要研究特定的用户对特定资源的授权访问方案。当前为了满足大量用户的访问,web服务一般都有专用的静态资源服务器,逻辑服务器和静态资源服务域名不同、服务分开。进化高一些的大型站点,还有独立的验证服务。

###整体的架构方案 逻辑服务或者验证服务可以对每个静态资源计算一个特定的密码,访问静态资源时可以携带上这个密码,静态资源服务器在收到资源访问请求时先去解析密码,密码里有对资源路径的解密验证。

###静态资源服务器 采用nginx perl模块的方式进行验证。 ####nginx模块的编译

yum install -y perl-ExtUtils-Embed  openssl-devel openssl-static  openssl  libtool-ltdl  libtool-ltdl-devel
./configure --prefix=/usr/local/web/nginx-1.6.2 --with-http_ssl_module    --with-http_perl_module

需要自己安装libmcrypt(这个玩意太危险了,看起来已经很久维护了,这玩意能藏后门,fuck)

[root@localhost Mcrypt-2.5.7.0]# vim Makefile.PL
require 5.004 ; 
use ExtUtils::MakeMaker 5.16 ; 
use Config ;
$MCRYPT_LDFLAGS = "-L/usr/local/libmcrypt-2.5.7/lib" ; 
$MCRYPT_CPPFLAGS = "-I/usr/local/libmcrypt-2.5.7/include" ; 
WriteMakefile( 
NAME => 'Mcrypt', 
VERSION_FROM => 'Mcrypt.pm', 
LIBS => [ "$MCRYPT_LDFLAGS -lltdl -lmcrypt" ], 
INC => " $MCRYPT_CPPFLAGS" , 
);

####nginx的配置

    perl_modules lib;
    perl_require proxy.pm;
    perl_set $auth '
        sub {
            my $r = shift;
            return proxy::check($r);
        }
    ';

    server {
        listen  80;
        server_name myimg.com;
        root /root/web/blog/public;
        index index.html;
        if ($auth = 0) {
            return 400;
        }
        access_log logs/access_log combined;
    }

####proxy模块代理

package proxy;
use strict;
use DES;
use nginx;

sub check 
{
    my $r = shift;
    my $uri = $r->uri;
    my @uri_args = split(/&/, $r->args);
    my $auth_key  = "";
    my $flag = 0;
    foreach my $tmp (@uri_args) {
        $tmp=~s/^ +//;
        $tmp=~s/ +$//;
        my ($key, $value) = split(/=/, $tmp);
        if ($key eq "token") {
            $flag = 1; 
            $auth_key = $value;
            last;
        }
    }
    if ($flag == 1) {
        return auth($auth_key, $uri);
    } else {
        return 0;
    }
}
sub auth {
    my $ticket = shift;
    my $ino = shift;
    my $mode = shift || 'cfb';
    return () unless defined $ticket;
    my $salt = 'your password';
    my $td = new DES(key=>$salt, mode=>$mode); 
    my $data = $td->demcrypt($ticket);
    if ($data eq $ino) {
        return 1;
    } else {
        return 0;
    }
}
1;
__END__

####加密和解密的方式 加密方式和解密方式可以跟据自己的情况自行选择,写到DES.pm中,里面只要有demcrypt和enmcrypt方法就好了。算法你可以去追求性能,或者追求安全的,或者你他娘的自己造也行。 如果你使用laravel框架,这里可以直接使用自带的加解密 ####静态资源密码生成方式

function rsToken($uri_path){
	$salt = 'Yc1+04ox';
	$td = new DesService($salt);
	return $td->encrypt($uri_path);
}

DES的加密和解密php版本的可以参考这个传送门 这个代码略有点乱。 ####在需要权限验证的地方加上密码

<img src="//myimg.com/images/1.jpg?token={{rsToken('/images/1.jpg')}}">

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

IIS7.5中神秘的ApplicationPoolIdentity

IIS7.5中(仅win7,win2008 SP2,win2008 R2支持),应用程序池的运行帐号,除了指定为LocalService,LocalSystem...

22610
来自专栏静晴轩

Http和Https的区别

今天大家一起聚于会议室听一个同事的分享,中途需要联网的时候,网络状态良好竟不能访问该网址,那些年也是接触过网络的我看了下懵了,旁边一大牛瞬间即解决了(将地址前的...

3744
来自专栏GreenLeaves

邮件发送功能开发

作为一名.Net开发,"邮件发送"功能的开发和使用是必须要掌握的,因为这个功能作为“消息推送”的一种手段经常出现在各种.Net系统中,所以本文将对.Net平台下...

7717
来自专栏Android 开发者

Android P 安全性更新

Android P 引入了若干可提升应用和运行应用的设备安全性的功能。 本页面介绍对第三方应用开发者最重要的变化,需要他们牢记在心。

1702
来自专栏魏艾斯博客www.vpsss.net

补充记录腾讯云 DNSPod 域名 API 申请 Let’s Encrypt 泛域名 SSL 证书需要注意的几点

刚写完了腾讯云 DNSPod 域名 API 申请 Let’s Encrypt 泛域名 SSL 证书这篇教程,感觉中间有几点是新手需要注意的,申请 SSL 泛域名...

5724
来自专栏FreeBuf

如何在macOS上监听单个应用HTTPS流量

写在前面的话 如果你准备对网络协议进行逆向分析或进行任何与网络安全有关的活动时,可能是为了了解协议运行机制,也有可能是为了查找敏感信息,你或多或少都需要收集一定...

2645
来自专栏FreeBuf

BT5 + wireshark玩wifi捕获和中间人攻击

前言:先说明一下,这个文章不是我写的,是一个老外(Deepanshu Kapoor)安全专家写的,我一开始就是看着玩,但整个看完被老外那个细心和耐心给打动了,整...

2835
来自专栏菩提树下的杨过

[原创]x.509证书在WCF中的应用(Web/IIS篇)

在上一篇"x.509证书在WCF中的应用(CS篇)"里,我们知道了如何在应用程序中,利用x.509证书来验证WCF的消息安全(没看过的朋友建议先看下,地址htt...

2245
来自专栏Python中文社区

使用python实现后台系统的JWT认证

專 欄 ❈ 茶客furu声,Python中文社区专栏作者 博客: http://www.jianshu.com/p/537b356d34c9 ❈ ...

8405
来自专栏FreeBuf

CVE-2017-3085:Adobe Flash泄漏Windows用户凭证

早前我写了一篇文章讲述Flash沙盒逃逸漏洞最终导致Flash Player使用了十年之久的本地安全沙盒项目破产。从之前爆出的这个漏洞就可以看出输入验证的重要性...

3076

扫码关注云+社区

领取腾讯云代金券