官术网_书友最值得收藏!

  • Linux運維最佳實踐
  • 胥峰 楊俊俊
  • 779字
  • 2019-01-04 00:50:54

最佳實踐11:優化緩存防盜鏈

盜鏈是指本網站的資源被非授權的第三方網站直接在頁面中進行引用。對于被盜鏈的網站來說,盜鏈現象既浪費了大量的帶寬又失去了對于版權文件的控制,因此需要在緩存節點上對URL進行校驗,設置防盜鏈。防盜鏈的幾個基本方法如下。

·使用HTTP Referer。HTTP Referer是HTTP請求的一個頭部,用于標明被請求的資源是在哪個頁面中進行調用的。對靜態圖片資源文件,使用HTTP Referer設置防盜鏈即可。

·使用生成動態鏈接的方法。這個方法的本質是首先在頁面上產生資源URL的時候,使用動態編程語言,生成類似如下結構http://music1.woyo.com/music1-abcdefghijk.mp3?key=xxxxyyyyzzzzaaaadddd。在緩存節點上收到用戶的請求時,對該URL的key進行驗證。該方法一般用于視頻、音頻等比較大的文件的防盜鏈檢查。

Key的組成

其中key=20080722101000A-MD5-KEY表示一個加密串。加密串包括以下兩個部分。

·20080722101000:表示時間戳,即年月日時分秒。

·A-MD5-KEY:一個MD5串,其計算方式如下為A-MD5-KEY=md5(base_url+datetime+password)。其中,base_url即請求中的http://music1.woyo.com/music1-abcdefghijk.mp3;datetime為請求中的時間戳20080722101000;password是源站和CDN約定的一個密碼。

校驗過程

具體的校驗過程如下:

1)檢查防盜鏈的串(即key)是否存在,如果不存在,則返回校驗失敗。

2)從防盜鏈串中取出日期時間,與當前時間比較,如果超出有效期范圍(例如,如果與當前時間相減,大于±2小時),則返回校驗失敗。

3)生成MD5的值,與請求中的A-MD5-KEY相比較,如果不等,則返回校驗失敗。

4)如果上述步驟都通過,則返回校驗成功。

5)如果校驗成功,則CDN緩存服務器向用戶返回正常的響應。

6)如果校驗失敗,則向把請求重定向到廣告音頻。

實施過程

在Squid配置文件中/usr/local/squid/etc/squid.conf增加如下配置:

redirect_program /usr/local/squid/etc/checkkey.pl
redirect_children 20

重定向器

安裝Perl的MD5模塊:

cd /root
wget http://www.kamnet.cn/srv/Digest-MD5-2.36.tar.gz
wget http://www.kamnet.cn/srv/Digest-Perl-MD5-1.8.tar.gz
tar xvfz Digest-MD5-2.36.tar.gz 
cd Digest-MD5-2.36
perl Makefile.PL 
make
make install
cd ..
tar xvfz Digest-Perl-MD5-1.8.tar.gz 
cd Digest-Perl-MD5-1.8
perl Makefile.PL 
make
make install

源碼(checkkey.pl):

#!/usr/bin/perl -wl
use Digest::Perl::MD5 'md5_hex';
use POSIX qw(strftime);

$|=1;
my $password = 'IblessWoyo';
my $errurl = 'http://err.woyo.com/woyo.mp3';
my $result = 'http://err.woyo.com/woyo.wma';

while (<>) {
        ($uri,$client,$ident,$method) = ( );
        ($uri,$client,$ident,$method) = split; #解析Squid傳入的參數
        my $time_from = strftime "%Y%m%d%H%M%S", localtime(time - 1*3600);
        my $time_to = strftime "%Y%m%d%H%M%S", localtime(time + 1*3600);
        next unless ($uri =~m/^http:\/\/(.+?)\/(.*)\?key=([0-9]{14})(.+)$/);
        if (($4 eq md5_hex("/".$2.$3.$password)) && ($3 > $time_from) && ($3 < $time_to)) { #檢查md5和URL中包含的時間
                $result = "http:\/\/$1:81\/$2";
        } else {
                $result = $errurl;
        }
} continue {
        print $result; #通知Squid防盜鏈檢查結果
}
主站蜘蛛池模板: 湘阴县| 长葛市| 永济市| 儋州市| 休宁县| 大新县| 新和县| 盐边县| 根河市| 三台县| 鲜城| 遂平县| 三都| 柏乡县| 区。| 嘉定区| 南召县| 繁昌县| 庄浪县| 浦城县| 阿克陶县| 澄迈县| 上虞市| 北安市| 绵阳市| 武隆县| 安远县| 贵南县| 永济市| 定结县| 孟州市| 延庆县| 三亚市| 伊通| 土默特左旗| 湾仔区| 澄城县| 娄烦县| 贵阳市| 宜宾市| 大港区|