[web開發] 防盜鏈系列三:apache+mod_perl防盜鏈

 轉載請說明該文章來自smallfish博客,http://hi.baidu.com/smallfish7788,謝謝!

寫這個帖子完全是無意中搜索modperl應用時候發現了,具體可以參見:
http://pyh7.spaces.live.com/blog/cns!47D8D44208AC51E5!140.entry

上面的文檔已經寫都很詳細了,包括怎麼安裝modperl、Apache2::Request等模塊以及配置apache的http.conf就不在累贅都重複了。

大體思路是這樣的,比如有一個地址:http://www.aa.com/down/1.mp3,不幸搜索引擎或者迅雷扒到了,就無償爲他們奉獻流量了。 但是假如在http://www.aa.com/down/1.mp3?key=123,key參數每天變化或者幾分鐘變化一次,在apache服務端校 驗下這個參數,不正確則顯示拒絕訪問或者找不到的話,那樣防盜鏈的效果就算達到了把。

先建立/home/httpd/modperl/startup.pl(目錄請自行修改),內容如下:

use strict;

use lib qw(/home/httpd/modperl); # 把這個路徑加入到perl lib路徑

use Apache2::RequestRec ();
use Apache2::RequestIO ();
use Apache2::Connection ();
use Apache2::RequestUtil ();
use Apache2::ServerUtil ();
use Apache2::Log ();
use Apache2::Request ();

1;

modperl強大到可以任意應用apache內部API,官方地址是:http://perl.apache.org 。根據apache版本選擇相應的modperl版本,現在大部分都apache2了,就選擇modperl2把。具體安裝配置可以看官方文檔。我這貼部分本機httpd.conf配置:

LoadModule perl_module             modules/mod_perl.so
LoadModule apreq_module          modules/mod_apreq2.so #這個模塊需要安裝Apache2::Request,具體安裝:http://pyh7.spaces.live.com/blog/cns!47D8D44208AC51E5!128.entry

PerlPostConfigRequire /home/httpd/modperl/startup.pl # startup.pl文件一般modperl應用都有,加載一些常用庫,可以在apache啓動時預先載入,避免重複加載。

<Location /down >
    SetHandler modperl # 設置該目錄交給modper處理
    PerlAccessHandler Down # Down是模塊名稱
    PerlSetVar key 123 # 設置校驗參數值
</Location>

修改這些後可以重啓下apache,看下logs/error_log裏最後是否有mod_apreq和mod_perl字樣,如果有就說明成功了。剩下都就是寫校驗的perl腳本了,/home/httpd/modperl/Down.pm,內容如下:

package Down.pm;
use strict;
use Apache2::RequestRec ();
use Apache2::RequestIO ();
use Apache2::Connection ();
use Apache2::RequestUtil ();
use Apache2::ServerUtil ();
use Apache2::Log ();
use Apache2::Const -compile => qw(OK FORBIDDEN);
use Apache2::Request ();

sub handler {
    my $r = shift;
    my $req = Apache2::Request->new($r);
    my $ip = $r->connection->remote_ip;
    my $k = $req->param('key') || ''; # 判斷訪問時是否帶key參數
    my $key = $r->dir_config('key') || '123'; # 加載httpd.conf配置中的key值
    if ($key eq $k) { # 相等可以正常訪問
        return Apache2::Const::OK;
    } else { # 否則顯示拒絕訪問
        my $s = Apache2::ServerUtil->server;
        $s->log_error("[$ip--------forbidden.]");
        return Apache2::Const::FORBIDDEN;
    }
}

1;

提示一下,以上兩個perl腳本文件末尾記得加上1;

重啓下apache。現在可以通過http://www.aa.com/down/1.mp3和http://www.aa.com/down /1.mp3?key=123測試下。可以看見不加參數拒絕訪問了把。這裏只是簡單的判斷,實際上可以根據日期或者IP加密生成一個字符串來判斷。

請繼續關注防盜鏈系列。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章