1. 程式人生 > >[Nginx]用Nginx實現與應用結合的訪問控制 - 防盜鏈

[Nginx]用Nginx實現與應用結合的訪問控制 - 防盜鏈

計算公式 index user use 鏈接 vtk 兩個 link img

應用場景:圖片等資源須要設置權限,如:僅僅有認證過的用戶才幹訪問自己的圖片。

解決的方法:使用Nginx的防盜鏈模塊http_secure_link能夠實現,該模塊默認情況下不包括。故在安裝時要加上--with-http_secure_link_module

該模塊依據兩個參數控制權限訪問,一個是過期時間(即該鏈接在這個時間之前可訪問,過期後無法訪問),該參數主要出於安全考慮。

還有一個是通過md5算法算出來的KEY,一般通過uri計算

舉例:

    server {
        listen       80;
        server_name  192.168.1.22;

        root /home/search/upload/portal_upload/user;
        location / {
            index  index.html index.htm;
        }

        location /img/dossier/ {
            secure_link $arg_st,$arg_e;
            secure_link_md5 [email protected]
/* */$uri$arg_e; if ($secure_link = "") { return 403; } if ($secure_link = "0") { return 403; } rewrite ^/img/dossier/(.*)$ /img/dossier/$1 break; } }上面的secure_link定義了控制權限的兩個參數(各自是st, e)

當中e就是上述的過期時間,建議e = 當前時間 + 有效期限(5分鐘)
比如:
e = date +%s -d "December 22, 2014 12:22:03"
= 1419222123
st的計算公式例如以下:md5(PKEY,uri,e)。當中PKEY是自己定義的常量

比如:
st = php -r ‘print str_replace("=", "",strtr(base64_encode(md5("[email protected][email protected]

/* */3",TRUE)),"+/","-_")) . "\n";‘

=13c9kZrZT1qnNgpG4Vtksw

效果例如以下:

http://192.168.1.22/img/dossier/16/641fd565-ec87-4cbe-b4ae-7eedba41bb0e.jpg --不可訪問
http://192.168.1.22/img/dossier/16/641fd565-ec87-4cbe-b4ae-7eedba41bb0e.jpg?st=13c9kZrZT1qnNgpG4Vtksw&e=1419222123 --過期前可訪問,過期後不可訪問
http://192.168.1.22/img/headpic/13/13_140x140.jpg --不在dossier以下的圖片沒有訪問限制


OK,到此為此我們基本實現的基於應用的權限控制,且方法靈活。由於e和st的生成由應用程序來控制。能進行隨意的改動和變動,而架構不受影響。

[Nginx]用Nginx實現與應用結合的訪問控制 - 防盜鏈